|
@@ -1,5 +1,6 @@
|
|
|
package com.persagy.ibms.data.sdk.util;
|
|
|
|
|
|
+import java.io.ByteArrayInputStream;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.Collections;
|
|
|
import java.util.HashMap;
|
|
@@ -7,6 +8,11 @@ import java.util.HashSet;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
|
|
|
+import org.antlr.runtime.ANTLRInputStream;
|
|
|
+import org.antlr.runtime.CommonTokenStream;
|
|
|
+import org.antlr.runtime.tree.CommonTree;
|
|
|
+import org.antlr.runtime.tree.CommonTreeNodeStream;
|
|
|
+
|
|
|
import com.alibaba.fastjson.JSON;
|
|
|
import com.alibaba.fastjson.JSONArray;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
@@ -30,6 +36,8 @@ import com.persagy.ibms.data.sdk.data.SceneDataObject;
|
|
|
import com.persagy.ibms.data.sdk.data.SceneDataValue;
|
|
|
import com.persagy.ibms.data.sdk.data.SceneDataPrimitive;
|
|
|
import com.persagy.ibms.data.sdk.data.SceneDataSet;
|
|
|
+import com.sagacloud.advanced.expression.AdvancedExpressionLexer;
|
|
|
+import com.sagacloud.advanced.expression.AdvancedExpressionParser;
|
|
|
import com.sagacloud.advanced.expression.AdvancedExpressionScanner;
|
|
|
import com.sagacloud.advanced.expression.AdvancedExpressionWalker;
|
|
|
import com.sagacloud.util.math.ValueObject;
|
|
@@ -104,32 +112,58 @@ public class QueryUtil {
|
|
|
|
|
|
Object result;
|
|
|
if (QueryType.equals("expression")) {
|
|
|
- AdvancedExpressionScanner scanner = Repository.p2scanner.get(sv.rel_property);
|
|
|
- AdvancedExpressionWalker walker = Repository.p2walker.get(sv.rel_property);
|
|
|
+ AdvancedExpressionScanner scanner;
|
|
|
+ AdvancedExpressionWalker walker;
|
|
|
+ if (sv != null && sv.rel_property != null) {
|
|
|
+ scanner = Repository.p2scanner.get(sv.rel_property);
|
|
|
+ walker = Repository.p2walker.get(sv.rel_property);
|
|
|
+ } else {
|
|
|
+ ANTLRInputStream input = new ANTLRInputStream(new ByteArrayInputStream((sql_json.get("expression") + "$").getBytes()));
|
|
|
+ AdvancedExpressionLexer lexer = new AdvancedExpressionLexer(input);
|
|
|
+ CommonTokenStream tokens = new CommonTokenStream(lexer);
|
|
|
+ AdvancedExpressionParser parser = new AdvancedExpressionParser(tokens);
|
|
|
+ AdvancedExpressionParser.prog_return r = parser.prog();
|
|
|
+ CommonTree t = (CommonTree) r.getTree();
|
|
|
+
|
|
|
+ CommonTreeNodeStream nodes = new CommonTreeNodeStream(t);
|
|
|
+ nodes.setTokenStream(tokens);
|
|
|
+
|
|
|
+ scanner = new AdvancedExpressionScanner(nodes);
|
|
|
+ scanner.prog();
|
|
|
+ walker = new AdvancedExpressionWalker(nodes);
|
|
|
+ for (String var : scanner.varDict.keySet()) {
|
|
|
+ if (!CriteriaObject.containsKey(var)) {
|
|
|
+ throw new Exception("var: " + var + " not exist in Criteria");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
walker.clear();
|
|
|
walker.reset();
|
|
|
+ SceneDataPrimitive SceneValuePrimitive = new SceneDataPrimitive();
|
|
|
+ result = SceneValuePrimitive;
|
|
|
CriteriaDefault CriteriaDefault = (CriteriaDefault) criteria;
|
|
|
boolean exist_null = false;
|
|
|
for (String var : scanner.varDict.keySet()) {
|
|
|
Match_e me = (Match_e) CriteriaDefault.column2MatchList.get(var).get(0);
|
|
|
+ if (me.change()) {
|
|
|
+ SceneValuePrimitive.change = true;
|
|
|
+ }
|
|
|
if (me.value == null) {
|
|
|
exist_null = true;
|
|
|
- break;
|
|
|
- }
|
|
|
- if (me.value instanceof Integer) {
|
|
|
- walker.put(var, (int) me.value);
|
|
|
- } else if (me.value instanceof Long) {
|
|
|
- walker.put(var, (long) me.value);
|
|
|
- } else if (me.value instanceof Float) {
|
|
|
- walker.put(var, (float) me.value);
|
|
|
- } else if (me.value instanceof Double) {
|
|
|
- walker.put(var, (double) me.value);
|
|
|
} else {
|
|
|
- throw new Exception(me.value.getClass().toString());
|
|
|
+ if (me.value instanceof Integer) {
|
|
|
+ walker.put(var, (int) me.value);
|
|
|
+ } else if (me.value instanceof Long) {
|
|
|
+ walker.put(var, (long) me.value);
|
|
|
+ } else if (me.value instanceof Float) {
|
|
|
+ walker.put(var, (float) me.value);
|
|
|
+ } else if (me.value instanceof Double) {
|
|
|
+ walker.put(var, (double) me.value);
|
|
|
+ } else {
|
|
|
+ throw new Exception(me.value.getClass().toString());
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- SceneDataPrimitive SceneValuePrimitive = new SceneDataPrimitive();
|
|
|
- result = SceneValuePrimitive;
|
|
|
for (String var : scanner.varStringDict.keySet()) {
|
|
|
Match_e me = (Match_e) CriteriaDefault.column2MatchList.get(var).get(0);
|
|
|
if (me.change()) {
|
|
@@ -137,12 +171,12 @@ public class QueryUtil {
|
|
|
}
|
|
|
if (me.value == null) {
|
|
|
exist_null = true;
|
|
|
- break;
|
|
|
- }
|
|
|
- if (me.value instanceof String) {
|
|
|
- walker.putString(var, (String) me.value);
|
|
|
} else {
|
|
|
- throw new Exception(me.value.getClass().toString());
|
|
|
+ if (me.value instanceof String) {
|
|
|
+ walker.putString(var, (String) me.value);
|
|
|
+ } else {
|
|
|
+ throw new Exception(me.value.getClass().toString());
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
if (exist_null) {
|
|
@@ -371,6 +405,9 @@ public class QueryUtil {
|
|
|
private static SceneDataPrimitive parseCriteriaRef(Repository Repository, JSONObject valueInner, SceneDataValue sv) {
|
|
|
String refString = (valueInner.get("ref")).toString();
|
|
|
String[] splits = refString.split("'");
|
|
|
+ boolean change = false;
|
|
|
+ int index_split;
|
|
|
+ SceneDataValue svInner;
|
|
|
if (splits[0].startsWith("ancestor_")) {
|
|
|
int generate = Integer.parseInt(splits[0].substring("ancestor_".length()));
|
|
|
Object tmp = sv;
|
|
@@ -385,40 +422,70 @@ public class QueryUtil {
|
|
|
generate--;
|
|
|
}
|
|
|
|
|
|
- boolean change = false;
|
|
|
SceneDataObject parentData = (SceneDataObject) tmp;
|
|
|
// 比较值只能是value_object
|
|
|
- SceneDataValue svInner = parentData.get(splits[1]);
|
|
|
if (parentData.hasColChange(splits[1])) {
|
|
|
change = true;
|
|
|
}
|
|
|
- for (int i = 2; i < splits.length; i++) {
|
|
|
- if (svInner.value_object.getRowChange() || svInner.value_object.hasColChange(splits[i])) {
|
|
|
- change = true;
|
|
|
- }
|
|
|
- svInner = svInner.value_object.get(splits[i]);
|
|
|
- }
|
|
|
- SceneDataPrimitive result = new SceneDataPrimitive();
|
|
|
- result.change = change;
|
|
|
- result.value = svInner != null ? svInner.value_prim.value : null;
|
|
|
- return result;
|
|
|
+ index_split = 2;
|
|
|
+ svInner = parentData.get(splits[1]);
|
|
|
} else {
|
|
|
- boolean change = false;
|
|
|
- SceneDataValue svInner = Repository.objectData.get(splits[0]);
|
|
|
if (Repository.objectData.hasColChange(splits[0])) {
|
|
|
change = true;
|
|
|
}
|
|
|
- for (int i = 1; i < splits.length; i++) {
|
|
|
- if (svInner.value_object.getRowChange() || svInner.value_object.hasColChange(splits[i])) {
|
|
|
+ index_split = 1;
|
|
|
+ svInner = Repository.objectData.get(splits[0]);
|
|
|
+ }
|
|
|
+ SceneDataValue last_sdv = null;
|
|
|
+ for (int i = index_split; i < splits.length; i++) {
|
|
|
+ String split = splits[i];
|
|
|
+ int index_ = split.indexOf('=');
|
|
|
+ if (index_ != -1) {
|
|
|
+ String propertyName = split.substring(0, index_);
|
|
|
+ String propertyValue = split.substring(index_ + 1);
|
|
|
+ if (svInner.value_array.getRowChange() || svInner.value_array.hasColChange(propertyName)) {
|
|
|
change = true;
|
|
|
}
|
|
|
- svInner = svInner.value_object.get(splits[i]);
|
|
|
+ SceneDataValue sv_valid = null;
|
|
|
+ for (SceneDataObject sdb : svInner.value_array.set) {
|
|
|
+ SceneDataObject sod = (SceneDataObject) sdb;
|
|
|
+ if (sod.containsKey(propertyName) && propertyValue.equals(sod.get(propertyName).value_prim.value)) {
|
|
|
+ SceneDataValue svWrapper = new SceneDataValue(null, sod, propertyName, null);
|
|
|
+ svWrapper.value_object = sod;
|
|
|
+ sv_valid = svWrapper;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ last_sdv = svInner;
|
|
|
+ if (sv_valid != null) {
|
|
|
+ svInner = sv_valid;
|
|
|
+ } else {
|
|
|
+ svInner = null;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (last_sdv != null) {
|
|
|
+ if (last_sdv.value_array.getRowChange() || last_sdv.value_array.hasColChange(split)) {
|
|
|
+ change = true;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (svInner.value_object.getRowChange() || svInner.value_object.hasColChange(split)) {
|
|
|
+ change = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ last_sdv = null;
|
|
|
+ svInner = svInner.value_object.get(split);
|
|
|
}
|
|
|
- SceneDataPrimitive result = new SceneDataPrimitive();
|
|
|
- result.change = change;
|
|
|
- result.value = svInner != null ? svInner.value_prim.value : null;
|
|
|
- return result;
|
|
|
}
|
|
|
+ SceneDataPrimitive result = new SceneDataPrimitive();
|
|
|
+ if (change) {
|
|
|
+ result.setRowChange(true);
|
|
|
+ }
|
|
|
+ if (svInner != null) {
|
|
|
+ if (svInner.value_prim.getRowChange()) {
|
|
|
+ result.setRowChange(true);
|
|
|
+ }
|
|
|
+ result.value = svInner.value_prim.value;
|
|
|
+ }
|
|
|
+ return result;
|
|
|
}
|
|
|
|
|
|
private static SceneDataSet parseSet(Repository Repository, SceneDataValue sv, Object setDesc, QueryAssist QueryAssist, boolean isSingleValueSet)
|
|
@@ -720,6 +787,11 @@ public class QueryUtil {
|
|
|
svList = svListInner;
|
|
|
}
|
|
|
result.singleValueSet = svList;
|
|
|
+ for (SceneDataValue svTmp : svList) {
|
|
|
+ if (svTmp.value_array.getRowChange()) {
|
|
|
+ result.setRowChange(true);
|
|
|
+ }
|
|
|
+ }
|
|
|
} else {
|
|
|
// 查询目标可以是value_object或者value_array
|
|
|
List<SceneDataValue> svList = new ArrayList<SceneDataValue>();
|
|
@@ -767,12 +839,17 @@ public class QueryUtil {
|
|
|
}
|
|
|
result.set = new ArrayList<SceneDataObject>();
|
|
|
for (SceneDataValue svTmp : svList) {
|
|
|
- if (!result.getRowChange()) {
|
|
|
+ if (svTmp.value_array.getRowChange()) {
|
|
|
+ result.setRowChange(true);
|
|
|
+ }
|
|
|
+ result.set.addAll(svTmp.value_array.set);
|
|
|
+ }
|
|
|
+ if (!result.getRowChange()) {
|
|
|
+ for (SceneDataValue svTmp : svList) {
|
|
|
for (String col : svTmp.value_array.getColChange().keySet()) {
|
|
|
result.setColChange(col);
|
|
|
}
|
|
|
}
|
|
|
- result.set.addAll(svTmp.value_array.set);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -788,9 +865,6 @@ public class QueryUtil {
|
|
|
result.set = new ArrayList<SceneDataObject>();
|
|
|
for (int i = 0; i < set.set.size(); i++) {
|
|
|
SceneDataObject setValue = set.set.get(i);
|
|
|
- if (setValue == null) {
|
|
|
- System.out.println();
|
|
|
- }
|
|
|
if (criteria.match(setValue)) {
|
|
|
result.set.add(setValue);
|
|
|
}
|