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..ed0e154 100644 --- a/src/main/java/com/wezone/drools/utils/ConditionParser.java +++ b/src/main/java/com/wezone/drools/utils/ConditionParser.java @@ -1,11 +1,74 @@ 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); + + 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 (i != 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(" "); + int ki = 0; + for (Object value : jsonArray) { + JSONObject vJson = (JSONObject) value; + + Set keySet = vJson.keySet(); + for (String skey : keySet) { + JSONArray sValues = vJson.getJSONArray(skey); + 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++; + } + 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); } }