Browse Source

完善expression和parseSetRef

menglu 3 years ago
parent
commit
9db073fe25

+ 5 - 0
ibms-data-sdk/src/main/java/com/persagy/ibms/data/sdk/data/SceneDataPrimitive.java

@@ -11,4 +11,9 @@ public class SceneDataPrimitive {
 	public boolean getRowChange() {
 		return change;
 	}
+
+	@Override
+	public String toString() {
+		return value.toString();
+	}
 }

+ 3 - 3
ibms-data-sdk/src/main/java/com/persagy/ibms/data/sdk/util/ComputeUtil.java

@@ -328,9 +328,9 @@ public class ComputeUtil {
 						sb.append(ss.propertyName);
 					}
 					log.info("computeOnce:" + sb.toString());
-					if (sb.toString().equals("基础对象-设备-设备类型-清单") || sb.toString().equals("基础对象-设备-设备类型-统计-数量")) {
-						System.out.println();
-					}
+					// if (sb.toString().equals("基础对象-设备-设备类型-清单-报警处理状态")) {
+					// System.out.println();
+					// }
 				}
 				// 打印路径
 				List<SceneDataValue> sdvList = Repository.property2SDV.get(spInner2);

+ 120 - 46
ibms-data-sdk/src/main/java/com/persagy/ibms/data/sdk/util/QueryUtil.java

@@ -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);
 			}

+ 2 - 0
ibms-data-sdk/src/main/java/com/persagy/ibms/data/sdk/util/RWDLoadUtil.java

@@ -440,6 +440,7 @@ public class RWDLoadUtil {
 					SceneDataValue sv_alarmList = new SceneDataValue(null, objectItem, "报警列表", null);
 					sv_alarmList.value_array = new SceneDataSet(false);
 					sv_alarmList.value_array.set = new ArrayList<SceneDataObject>();
+					sv_alarmList.value_array.setRowChange(true);
 					RepositoryBase.id2alarmList.putIfAbsent(objId, sv_alarmList);
 				}
 				SceneDataValue alarmList = RepositoryBase.id2alarmList.get(objId);
@@ -448,6 +449,7 @@ public class RWDLoadUtil {
 					SceneDataValue sv_alarmCount = new SceneDataValue(null, objectItem, "报警数量", null);
 					sv_alarmCount.value_prim = new SceneDataPrimitive();
 					sv_alarmCount.value_prim.value = 0;
+					sv_alarmCount.value_prim.change = true;
 					RepositoryBase.id2alarmCount.putIfAbsent(objId, sv_alarmCount);
 				}
 				SceneDataValue alarmCount = RepositoryBase.id2alarmCount.get(objId);