diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/DataConstraintModel.java b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/DataConstraintModel.java index 54444fb..f8dfe20 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/DataConstraintModel.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/DataConstraintModel.java @@ -803,11 +803,39 @@ } }); public static final Symbol search = new Symbol("search", 2, Symbol.Type.PREFIX, new Symbol.IImplGenerator() { + final int count[] = { 0 }; @Override - public String generate(Type type, Type[] childrenTypes, String[] children, String[] childrenSideEffects, + public String generate(Type type, Type[] childrenTypes, String[] childrenImpl, String[] childrenSideEffects, String[] sideEffect) { - return null; + for (String s : childrenSideEffects) { + sideEffect[0] += s; + } + String temp = "temp_search" + count[0]; + String impl = ""; + impl += "Map " + temp + " = new HashMap<>();\n"; + impl += "for (String key: " + childrenImpl[0] + ".keySet()) {\n"; + impl += "\tboolean isMatch = true;\n"; + impl += "\tfor (String qKey: " + childrenImpl[1] + ".keySet()) {\n"; + impl += "\t\tMap value = " + childrenImpl[0] + ".get(key).getValue();\n"; + impl += "\t\tfor (String valKey: value.keySet()) {\n"; + impl += "\t\t\tif (valKey.equals(qKey)) {\n"; + impl += "\t\t\t\tif (value.get(valKey).equals(" + childrenImpl[1] + ".get(qKey))) {\n"; + impl += "\t\t\t\t\tisMatch = false;\n"; + impl += "\t\t\t\t}\n"; + impl += "\t\t\t\tbreak;\n"; + impl += "\t\t\t}\n"; + impl += "\t\t}\n"; + impl += "\t\tif (!isMatch) break;\n"; + impl += "\t}\n"; + impl += "\tif (isMatch) {\n"; + impl += "\t\t" + temp + ".put(key, " + childrenImpl[0] + ".get(key));\n"; + impl += "\t}\n"; + impl += "}\n"; + sideEffect[0] += impl; + + count[0]++; + return temp; } }, new Symbol.ICalculator() { @Override @@ -823,33 +851,33 @@ Expression arg1 = args.get(1); if (arg1 instanceof JsonTerm) { - JsonTerm searhTerm = (JsonTerm) arg1; + JsonTerm queryTerm = (JsonTerm) arg1; MapTerm result = new MapTerm(); - - for (String key : searchFrom.keySet()) { - boolean flag = true; + for (String key: searchFrom.keySet()) { + boolean isMatch = true; if (searchFrom.get(key) instanceof JsonTerm) { JsonTerm value = (JsonTerm) searchFrom.get(key); - for (String qKey : searhTerm.keySet()) { - for (String jsonKey : value.keySet()) { - if (value.get(jsonKey) instanceof Constant) { - Constant value1 = (Constant) searchFrom.get(jsonKey); - if (!(jsonKey.equals(qKey))) { + for (String qKey: queryTerm.keySet()) { + for (String valKey: value.keySet()) { + if (value.get(valKey) instanceof Constant) { + Constant valVal = (Constant) searchFrom.get(valKey); + if (!(valKey.equals(qKey))) { continue; } - if (searhTerm.get(qKey) instanceof Constant) { - Constant val = (Constant) searhTerm.get(qKey); - if (!(value1.getValue().equals(val.getValue()))) { - flag = false; + if (queryTerm.get(qKey) instanceof Constant) { + Constant qVal = (Constant) queryTerm.get(qKey); + if (!(valVal.getValue().equals(qVal.getValue()))) { + isMatch = false; } } break; } } + if (!isMatch) break; } - if (flag) { - result.insert(key,value); + if (isMatch) { + result.insert(key, value); } } else if (searchFrom.get(key) instanceof MapTerm) { } else if (searchFrom.get(key) instanceof ListTerm) {