From 1ab545e294db2844d6caf4b366040590f9d10500 Mon Sep 17 00:00:00 2001 From: 75349 <753495441@qq.com> Date: Mon, 5 Dec 2022 15:03:06 +0800 Subject: [PATCH] =?UTF-8?q?1.=E4=BF=AE=E6=94=B9=E6=B5=8B=E8=AF=95=E7=94=A8?= =?UTF-8?q?=E4=BE=8B=EF=BC=8C=E5=A2=9E=E5=8A=A0=E5=8C=85=E5=90=AB=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wezone/drools/enums/MathOperatorEnum.java | 15 ++++-- .../wezone/drools/utils/ConditionParser.java | 10 +++- .../com/wezone/drools/test/ConditionTest.java | 49 +++++++++++++++++-- 3 files changed, 64 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/wezone/drools/enums/MathOperatorEnum.java b/src/main/java/com/wezone/drools/enums/MathOperatorEnum.java index ceb8dd0..79630b4 100644 --- a/src/main/java/com/wezone/drools/enums/MathOperatorEnum.java +++ b/src/main/java/com/wezone/drools/enums/MathOperatorEnum.java @@ -38,15 +38,18 @@ public enum MathOperatorEnum { not("$not", "!", "Logical", "非"), $match("$match", "match", "Logical", "匹配"), + // 特殊运算符 + contains("contains", "CollUtil.contains(StrUtil.split(\"{}\", \",\"), '{}')", "Special", "包含"), + ; - private String operator; + private final String operator; - private String actual; + private final String actual; - private String type; + private final String type; - private String desc; + private final String desc; public static MathOperatorEnum fromOperator(String operator) { for (MathOperatorEnum operatorEnum : MathOperatorEnum.values()) { @@ -73,4 +76,8 @@ public enum MathOperatorEnum { public boolean isLogical() { return StrUtil.equals(this.getType(), "Logical"); } + + public boolean isSpecial() { + return StrUtil.equals(this.getType(), "Special"); + } } diff --git a/src/main/java/com/wezone/drools/utils/ConditionParser.java b/src/main/java/com/wezone/drools/utils/ConditionParser.java index ed0e154..c85158d 100644 --- a/src/main/java/com/wezone/drools/utils/ConditionParser.java +++ b/src/main/java/com/wezone/drools/utils/ConditionParser.java @@ -2,6 +2,7 @@ package com.wezone.drools.utils; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Console; +import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; @@ -19,7 +20,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()) { @@ -60,6 +61,13 @@ public class ConditionParser { if (operatorEnum.isLogical()) { stringJoiner.add("(").add(parseCondition(jsonArray)).add(") "); + } else if (operatorEnum.isSpecial()) { + String leftValue = sValues.getStr(0); + String rightValue = sValues.getStr(1); + JSONArray objects = JSONUtil.parseArray(rightValue); + String join = CollUtil.join(objects, ","); + String format = StrUtil.format(MathOperatorEnum.contains.getActual(), join, leftValue); + stringJoiner.add("(").add(format).add(") "); } else { String leftValue = sValues.getStr(0); String rightValue = sValues.getStr(1); diff --git a/src/test/java/com/wezone/drools/test/ConditionTest.java b/src/test/java/com/wezone/drools/test/ConditionTest.java index 5447893..0d976e6 100644 --- a/src/test/java/com/wezone/drools/test/ConditionTest.java +++ b/src/test/java/com/wezone/drools/test/ConditionTest.java @@ -2,16 +2,18 @@ package com.wezone.drools.test; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Console; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONArray; -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.assertj.core.util.Lists; import org.junit.jupiter.api.Test; -import java.util.Set; -import java.util.StringJoiner; +import java.util.Collection; +import java.util.List; /** * 条件测试用例 @@ -21,8 +23,9 @@ public class ConditionTest { @Test public void test1() { String condition = "[{\"$or\":[{\"$eq\":[\"1\",\"2\"]}]},{\"$or\":[{\"$eq\":[\"2\",\"2\"]}]}]"; - + System.out.println(condition); JSONArray jsonArray = JSONUtil.parseArray(condition); + System.out.println(JSONUtil.toJsonStr(jsonArray)); String conditionResult = ConditionParser.parseCondition(jsonArray); @@ -35,8 +38,9 @@ public class ConditionTest { @Test public void test2() { String condition = "[{\"$or\":[{\"$and\":[{\"$eq\":[\"2\",\"2\"]},{\"$eq\":[\"2\",\"3\"]}]}]},{\"$or\":[{\"$eq\":[\"2\",\"2\"]}]}]"; - + System.out.println(condition); JSONArray jsonArray = JSONUtil.parseArray(condition); + System.out.println(JSONUtil.toJsonStr(jsonArray)); String conditionResult = ConditionParser.parseCondition(jsonArray); @@ -46,4 +50,39 @@ public class ConditionTest { Console.log("{} = {}", conditionResult.toString(), executeB); } + @Test + public void test3() throws IllegalAccessException, NoSuchMethodException { + AviatorEvaluator.addStaticFunctions("CollUtil", CollUtil.class); + AviatorEvaluator.addStaticFunctions("StrUtil", StrUtil.class); + + List sectionClassificationList = Lists.newArrayList("汇差", "手续费", "成本科目"); + System.out.println(sectionClassificationList); + JSONArray objects = JSONUtil.parseArray(sectionClassificationList.toString()); + System.out.println(objects); + String str = "成本科目"; + String join = CollUtil.join(objects, ","); + String format = StrUtil.format(MathOperatorEnum.contains.getActual(), join, str); + System.out.println(format); + Object executeA = AviatorEvaluator.execute(format); + System.out.println(executeA); + + } + @Test + public void test4() throws IllegalAccessException, NoSuchMethodException { + String condition = "[{\"$or\":[{\"$eq\":[\"1\",\"2\"]}]},{\"$or\":[{\"contains\":[\"成本科目\",[\"汇差\",\"手续费\",\"成本科目\"]]}]}]"; + System.out.println(condition); + JSONArray jsonArray = JSONUtil.parseArray(condition); + System.out.println(JSONUtil.toJsonStr(jsonArray)); + + String conditionResult = ConditionParser.parseCondition(jsonArray); + + Console.log("condition template = {}", conditionResult); + AviatorEvaluator.addStaticFunctions("CollUtil", CollUtil.class); + AviatorEvaluator.addStaticFunctions("StrUtil", StrUtil.class); + Object executeB = AviatorEvaluator.execute(conditionResult); + Console.log("{} = {}", conditionResult, executeB); + + } + + }