From 56f761f302d160d2ee959b0d50dcbe3dd6e56527 Mon Sep 17 00:00:00 2001 From: linsm Date: Mon, 4 Jul 2022 10:28:18 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=AE=8C=E6=88=90=E8=A7=A3=E6=9E=90?= =?UTF-8?q?=E6=9D=A1=E4=BB=B6=E8=A1=A8=E8=BE=BE=E5=BC=8F=E5=AD=97=E7=AC=A6?= =?UTF-8?q?=E4=B8=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wezone/drools/enums/MathOperatorEnum.java | 36 +++-- .../wezone/drools/utils/ConditionParser.java | 137 ++++++++++++++++++ .../com/wezone/drools/test/ConditionTest.java | 54 ++----- 3 files changed, 171 insertions(+), 56 deletions(-) diff --git a/src/main/java/com/wezone/drools/enums/MathOperatorEnum.java b/src/main/java/com/wezone/drools/enums/MathOperatorEnum.java index 2bfb357..ceb8dd0 100644 --- a/src/main/java/com/wezone/drools/enums/MathOperatorEnum.java +++ b/src/main/java/com/wezone/drools/enums/MathOperatorEnum.java @@ -15,22 +15,22 @@ import lombok.ToString; @ToString public enum MathOperatorEnum { // 条件运算符 - eq("$eq", "==", "Conditional", "等于"), - eq2("==", "==", "Conditional", "等于"), - eqs("$eqs", "===", "Conditional", "相等(严格)"), - eqs2("===", "===", "Conditional", "相等(严格)"), - ne("$ne", "!=", "Conditional", "不等于"), - ne2("!=", "!=", "Conditional", "不等于"), - nes("$nes", "!=", "Conditional", "不等于"), - nes2("!==", "!==", "Conditional", "不等于(严格)"), - lt("$lt", "<", "Conditional", "小于"), - lt2("<", "<", "Conditional", "小于"), - lte("$lte", "<=", "Conditional", "小于等于"), - lte2("<=", "<=", "Conditional", "小于等于"), - gt("$gt", ">", "Conditional", "大于"), - gt2(">", ">", "Conditional", "大于"), - gte("$gte", ">=", "Conditional", "大于等于"), - gte2(">=", ">=", "Conditional", "大于等于"), + eq("$eq", "==", "Arithmetic", "等于"), + eq2("==", "==", "Arithmetic", "等于"), + eqs("$eqs", "===", "Arithmetic", "相等(严格)"), + eqs2("===", "===", "Arithmetic", "相等(严格)"), + ne("$ne", "!=", "Arithmetic", "不等于"), + ne2("!=", "!=", "Arithmetic", "不等于"), + nes("$nes", "!=", "Arithmetic", "不等于"), + nes2("!==", "!==", "Arithmetic", "不等于(严格)"), + lt("$lt", "<", "Arithmetic", "小于"), + lt2("<", "<", "Arithmetic", "小于"), + lte("$lte", "<=", "Arithmetic", "小于等于"), + lte2("<=", "<=", "Arithmetic", "小于等于"), + gt("$gt", ">", "Arithmetic", "大于"), + gt2(">", ">", "Arithmetic", "大于"), + gte("$gte", ">=", "Arithmetic", "大于等于"), + gte2(">=", ">=", "Arithmetic", "大于等于"), // 逻辑运算符 and("$and", "&&", "Logical", "且"), @@ -69,4 +69,8 @@ public enum MathOperatorEnum { } return isLogical; } + + public boolean isLogical() { + return StrUtil.equals(this.getType(), "Logical"); + } } diff --git a/src/main/java/com/wezone/drools/utils/ConditionParser.java b/src/main/java/com/wezone/drools/utils/ConditionParser.java index 057eb16..aad9278 100644 --- a/src/main/java/com/wezone/drools/utils/ConditionParser.java +++ b/src/main/java/com/wezone/drools/utils/ConditionParser.java @@ -1,11 +1,148 @@ package com.wezone.drools.utils; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Console; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.wezone.drools.enums.MathOperatorEnum; + +import java.util.Map; +import java.util.Set; +import java.util.StringJoiner; + /** * 条件格式化 */ public class ConditionParser { + public static String parseCondition(JSONArray jsonArray) { + StringBuffer stringBuffer = new StringBuffer(); + for (int i = 0; i < jsonArray.size(); i++) { + Console.log("object = ", JSONUtil.toJsonStr(jsonArray.get(i))); + JSONObject o = jsonArray.getJSONObject(i); + + int finalI = i; + for(Map.Entry kv: o.entrySet()) { + String key = kv.getKey(); + JSONArray values = (JSONArray) kv.getValue(); + + boolean notEmpty = CollUtil.isNotEmpty(values); + + if (notEmpty) { + MathOperatorEnum operatorEnum = MathOperatorEnum.fromOperator(key); + if (finalI != 0) { + Console.log("math Operator = {}", operatorEnum.toString()); + stringBuffer.append(" ").append(operatorEnum.getActual()).append(" "); + } + + stringBuffer.append(parseArithmetic(operatorEnum, values)); + } + } + } + return stringBuffer.toString(); + } + + private static String parseArithmetic(MathOperatorEnum parentOperatorEnum, JSONArray jsonArray) { + StringJoiner stringJoiner = new StringJoiner(" "); +// stringJoiner.add("("); + int ki = 0; + for (Object value : jsonArray) { + JSONObject vJson = (JSONObject) value; + + Set keySet = vJson.keySet(); + for (String skey : keySet) { + JSONArray sValues = vJson.getJSONArray(skey); +// if(ki != 0) { + MathOperatorEnum operatorEnum = MathOperatorEnum.fromOperator(skey); + Console.log("math Operator = {}, isLogical = {}", operatorEnum.toString(), operatorEnum.isLogical()); +// } + if(ki != 0) { + stringJoiner.add(parentOperatorEnum.getActual()); + } + if (operatorEnum.isLogical()) { + stringJoiner.add("(").add(parseCondition(jsonArray)).add(") "); + } else { + String leftValue = sValues.getStr(0); + String rightValue = sValues.getStr(1); + stringJoiner.add("(").add(leftValue).add(operatorEnum.getActual()).add(rightValue).add(") "); + } + } + ki++; + } +// stringJoiner.add(") "); + return stringJoiner.toString(); + } + +// private static String parseArithmetic(JSONArray jsonArray) { +// Console.log("parseArithmetic ---- {}", JSONUtil.toJsonStr(jsonArray)); +// StringJoiner stringJoiner = new StringJoiner(" "); +// stringJoiner.add("("); +// int ki = 0; +// for (Object value : jsonArray) { +// JSONObject vJson = (JSONObject) value; +// +// Set keySet = vJson.keySet(); +// for (String skey : keySet) { +// JSONArray sValues = vJson.getJSONArray(skey); +//// if(ki != 0) { +// MathOperatorEnum operatorEnum = MathOperatorEnum.fromOperator(skey); +// Console.log("math Operator = {}, isLogical = {}", operatorEnum.toString(), operatorEnum.isLogical()); +//// } +// String leftValue = sValues.getStr(0); +// String rightValue = sValues.getStr(1); +// stringJoiner.add(leftValue).add(operatorEnum.getActual()).add(rightValue); +// } +// ki++; +// } +// stringJoiner.add(") "); +// +//// JSONObject o = jsonArray.getJSONObject(i); +//// +//// int finalI = i; +//// for(Map.Entry kv: o.entrySet()) { +//// String key = kv.getKey(); +//// JSONArray values = (JSONArray) kv.getValue(); +//// boolean notEmpty = CollUtil.isNotEmpty(values); +//// +//// if (notEmpty) { +//// if (finalI != 0) { +//// MathOperatorEnum operatorEnum = MathOperatorEnum.fromOperator(key); +//// Console.log("math Operator = {}", operatorEnum.toString()); +//// stringJoiner.add(operatorEnum.getActual()); +//// } +//// +//// +//// stringJoiner.add("("); +//// int ki = 0; +//// for (Object value : values) { +//// JSONObject vJson = (JSONObject) value; +//// +//// Set keySet = vJson.keySet(); +//// for (String skey : keySet) { +//// JSONArray sValues = vJson.getJSONArray(skey); +////// if(ki != 0) { +//// MathOperatorEnum operatorEnum = MathOperatorEnum.fromOperator(skey); +//// Console.log("math Operator = {}, isLogical = {}", operatorEnum.toString(), operatorEnum.isLogical()); +////// } +//// +//// if(operatorEnum.isLogical()) { +//// stringJoiner.add(parseCondition(sValues)); +//// } else { +//// String leftValue = sValues.getStr(0); +//// String rightValue = sValues.getStr(1); +//// stringJoiner.add(leftValue).add(operatorEnum.getActual()).add(rightValue); +//// } +//// } +//// ki++; +//// } +//// stringJoiner.add(") "); +//// } +//// stringBuffer.append(stringJoiner.toString()); +//// } +// return stringJoiner.toString(); +// } } diff --git a/src/test/java/com/wezone/drools/test/ConditionTest.java b/src/test/java/com/wezone/drools/test/ConditionTest.java index efedf6b..5447893 100644 --- a/src/test/java/com/wezone/drools/test/ConditionTest.java +++ b/src/test/java/com/wezone/drools/test/ConditionTest.java @@ -7,6 +7,7 @@ import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.googlecode.aviator.AviatorEvaluator; import com.wezone.drools.enums.MathOperatorEnum; +import com.wezone.drools.utils.ConditionParser; import org.junit.jupiter.api.Test; import java.util.Set; @@ -23,53 +24,26 @@ public class ConditionTest { JSONArray jsonArray = JSONUtil.parseArray(condition); - StringBuffer stringBuffer = new StringBuffer(); - for (int i = 0; i < jsonArray.size(); i++) { - StringJoiner stringJoiner = new StringJoiner(" "); - JSONObject o = jsonArray.getJSONObject(i); + String conditionResult = ConditionParser.parseCondition(jsonArray); - int finalI = i; - o.forEach(kv -> { - String key = kv.getKey(); - JSONArray values = (JSONArray) kv.getValue(); - boolean notEmpty = CollUtil.isNotEmpty(values); + Console.log("condition template = {}", conditionResult.toString()); - if (notEmpty) { - if (finalI != 0) { - MathOperatorEnum operatorEnum = MathOperatorEnum.fromOperator(key); - Console.log("math Operator = {}", operatorEnum.toString()); - stringJoiner.add(operatorEnum.getActual()); - } + Object executeB = AviatorEvaluator.execute(conditionResult.toString()); + Console.log("{} = {}", conditionResult.toString(), executeB); + } + @Test + public void test2() { + String condition = "[{\"$or\":[{\"$and\":[{\"$eq\":[\"2\",\"2\"]},{\"$eq\":[\"2\",\"3\"]}]}]},{\"$or\":[{\"$eq\":[\"2\",\"2\"]}]}]"; - stringJoiner.add("("); - int ki = 0; - for (Object value : values) { - JSONObject vJson = (JSONObject) value; + JSONArray jsonArray = JSONUtil.parseArray(condition); - Set keySet = vJson.keySet(); - for (String skey : keySet) { -// if(ki != 0) { - MathOperatorEnum operatorEnum = MathOperatorEnum.fromOperator(skey); - Console.log("math Operator = {}", operatorEnum.toString()); -// } + String conditionResult = ConditionParser.parseCondition(jsonArray); - JSONArray sValues = vJson.getJSONArray(skey); - String leftValue = sValues.getStr(0); - String rightValue = sValues.getStr(1); - stringJoiner.add(leftValue).add(operatorEnum.getActual()).add(rightValue); - } - ki++; - } - stringJoiner.add(") "); - } - stringBuffer.append(stringJoiner.toString()); - }); - } - Console.log("condition template = {}", stringBuffer.toString()); + Console.log("condition template = {}", conditionResult.toString()); - Object executeB = AviatorEvaluator.execute(stringBuffer.toString()); - Console.log("{} = {}", stringBuffer.toString(), executeB); + Object executeB = AviatorEvaluator.execute(conditionResult.toString()); + Console.log("{} = {}", conditionResult.toString(), executeB); } } From e2cf085183164fc73e6b8d42d0a6b81964e45e76 Mon Sep 17 00:00:00 2001 From: linsm Date: Mon, 4 Jul 2022 10:30:05 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E5=AE=8C=E6=88=90=E8=A7=A3=E6=9E=90?= =?UTF-8?q?=E6=9D=A1=E4=BB=B6=E8=A1=A8=E8=BE=BE=E5=BC=8F=E5=AD=97=E7=AC=A6?= =?UTF-8?q?=E4=B8=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wezone/drools/utils/ConditionParser.java | 82 +------------------ 1 file changed, 4 insertions(+), 78 deletions(-) diff --git a/src/main/java/com/wezone/drools/utils/ConditionParser.java b/src/main/java/com/wezone/drools/utils/ConditionParser.java index aad9278..97eb6ad 100644 --- a/src/main/java/com/wezone/drools/utils/ConditionParser.java +++ b/src/main/java/com/wezone/drools/utils/ConditionParser.java @@ -22,8 +22,7 @@ public class ConditionParser { Console.log("object = ", JSONUtil.toJsonStr(jsonArray.get(i))); JSONObject o = jsonArray.getJSONObject(i); - int finalI = i; - for(Map.Entry kv: o.entrySet()) { + for (Map.Entry kv : o.entrySet()) { String key = kv.getKey(); JSONArray values = (JSONArray) kv.getValue(); @@ -31,12 +30,12 @@ public class ConditionParser { if (notEmpty) { MathOperatorEnum operatorEnum = MathOperatorEnum.fromOperator(key); - if (finalI != 0) { + if (i != 0) { Console.log("math Operator = {}", operatorEnum.toString()); stringBuffer.append(" ").append(operatorEnum.getActual()).append(" "); } - stringBuffer.append(parseArithmetic(operatorEnum, values)); + stringBuffer.append(parseArithmetic(operatorEnum, values)); } } } @@ -45,7 +44,6 @@ public class ConditionParser { private static String parseArithmetic(MathOperatorEnum parentOperatorEnum, JSONArray jsonArray) { StringJoiner stringJoiner = new StringJoiner(" "); -// stringJoiner.add("("); int ki = 0; for (Object value : jsonArray) { JSONObject vJson = (JSONObject) value; @@ -53,11 +51,9 @@ public class ConditionParser { Set keySet = vJson.keySet(); for (String skey : keySet) { JSONArray sValues = vJson.getJSONArray(skey); -// if(ki != 0) { MathOperatorEnum operatorEnum = MathOperatorEnum.fromOperator(skey); Console.log("math Operator = {}, isLogical = {}", operatorEnum.toString(), operatorEnum.isLogical()); -// } - if(ki != 0) { + if (ki != 0) { stringJoiner.add(parentOperatorEnum.getActual()); } @@ -72,77 +68,7 @@ public class ConditionParser { } ki++; } -// stringJoiner.add(") "); return stringJoiner.toString(); } -// private static String parseArithmetic(JSONArray jsonArray) { -// Console.log("parseArithmetic ---- {}", JSONUtil.toJsonStr(jsonArray)); -// StringJoiner stringJoiner = new StringJoiner(" "); -// stringJoiner.add("("); -// int ki = 0; -// for (Object value : jsonArray) { -// JSONObject vJson = (JSONObject) value; -// -// Set keySet = vJson.keySet(); -// for (String skey : keySet) { -// JSONArray sValues = vJson.getJSONArray(skey); -//// if(ki != 0) { -// MathOperatorEnum operatorEnum = MathOperatorEnum.fromOperator(skey); -// Console.log("math Operator = {}, isLogical = {}", operatorEnum.toString(), operatorEnum.isLogical()); -//// } -// String leftValue = sValues.getStr(0); -// String rightValue = sValues.getStr(1); -// stringJoiner.add(leftValue).add(operatorEnum.getActual()).add(rightValue); -// } -// ki++; -// } -// stringJoiner.add(") "); -// -//// JSONObject o = jsonArray.getJSONObject(i); -//// -//// int finalI = i; -//// for(Map.Entry kv: o.entrySet()) { -//// String key = kv.getKey(); -//// JSONArray values = (JSONArray) kv.getValue(); -//// boolean notEmpty = CollUtil.isNotEmpty(values); -//// -//// if (notEmpty) { -//// if (finalI != 0) { -//// MathOperatorEnum operatorEnum = MathOperatorEnum.fromOperator(key); -//// Console.log("math Operator = {}", operatorEnum.toString()); -//// stringJoiner.add(operatorEnum.getActual()); -//// } -//// -//// -//// stringJoiner.add("("); -//// int ki = 0; -//// for (Object value : values) { -//// JSONObject vJson = (JSONObject) value; -//// -//// Set keySet = vJson.keySet(); -//// for (String skey : keySet) { -//// JSONArray sValues = vJson.getJSONArray(skey); -////// if(ki != 0) { -//// MathOperatorEnum operatorEnum = MathOperatorEnum.fromOperator(skey); -//// Console.log("math Operator = {}, isLogical = {}", operatorEnum.toString(), operatorEnum.isLogical()); -////// } -//// -//// if(operatorEnum.isLogical()) { -//// stringJoiner.add(parseCondition(sValues)); -//// } else { -//// String leftValue = sValues.getStr(0); -//// String rightValue = sValues.getStr(1); -//// stringJoiner.add(leftValue).add(operatorEnum.getActual()).add(rightValue); -//// } -//// } -//// ki++; -//// } -//// stringJoiner.add(") "); -//// } -//// stringBuffer.append(stringJoiner.toString()); -//// } -// return stringJoiner.toString(); -// } - } From d2f3bd097251301d8f50a2fb80a8a0aa2433d595 Mon Sep 17 00:00:00 2001 From: linsm Date: Mon, 4 Jul 2022 10:50:14 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E5=AE=8C=E6=88=90=E8=A7=A3=E6=9E=90?= =?UTF-8?q?=E6=9D=A1=E4=BB=B6=E8=A1=A8=E8=BE=BE=E5=BC=8F=E5=AD=97=E7=AC=A6?= =?UTF-8?q?=E4=B8=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/wezone/drools/utils/ConditionParser.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/wezone/drools/utils/ConditionParser.java b/src/main/java/com/wezone/drools/utils/ConditionParser.java index 97eb6ad..ed0e154 100644 --- a/src/main/java/com/wezone/drools/utils/ConditionParser.java +++ b/src/main/java/com/wezone/drools/utils/ConditionParser.java @@ -19,7 +19,7 @@ public class ConditionParser { public static String parseCondition(JSONArray jsonArray) { StringBuffer stringBuffer = new StringBuffer(); for (int i = 0; i < jsonArray.size(); i++) { - Console.log("object = ", JSONUtil.toJsonStr(jsonArray.get(i))); +// Console.log("object = ", JSONUtil.toJsonStr(jsonArray.get(i))); JSONObject o = jsonArray.getJSONObject(i); for (Map.Entry kv : o.entrySet()) { @@ -31,7 +31,7 @@ public class ConditionParser { if (notEmpty) { MathOperatorEnum operatorEnum = MathOperatorEnum.fromOperator(key); if (i != 0) { - Console.log("math Operator = {}", operatorEnum.toString()); +// Console.log("math Operator = {}", operatorEnum.toString()); stringBuffer.append(" ").append(operatorEnum.getActual()).append(" "); } @@ -52,7 +52,7 @@ public class ConditionParser { for (String skey : keySet) { JSONArray sValues = vJson.getJSONArray(skey); MathOperatorEnum operatorEnum = MathOperatorEnum.fromOperator(skey); - Console.log("math Operator = {}, isLogical = {}", operatorEnum.toString(), operatorEnum.isLogical()); +// Console.log("math Operator = {}, isLogical = {}", operatorEnum.toString(), operatorEnum.isLogical()); if (ki != 0) { stringJoiner.add(parentOperatorEnum.getActual()); }