Merge remote-tracking branch 'origin/main' into main
This commit is contained in:
commit
5c49ddd40c
|
@ -15,22 +15,22 @@ import lombok.ToString;
|
||||||
@ToString
|
@ToString
|
||||||
public enum MathOperatorEnum {
|
public enum MathOperatorEnum {
|
||||||
// 条件运算符
|
// 条件运算符
|
||||||
eq("$eq", "==", "Conditional", "等于"),
|
eq("$eq", "==", "Arithmetic", "等于"),
|
||||||
eq2("==", "==", "Conditional", "等于"),
|
eq2("==", "==", "Arithmetic", "等于"),
|
||||||
eqs("$eqs", "===", "Conditional", "相等(严格)"),
|
eqs("$eqs", "===", "Arithmetic", "相等(严格)"),
|
||||||
eqs2("===", "===", "Conditional", "相等(严格)"),
|
eqs2("===", "===", "Arithmetic", "相等(严格)"),
|
||||||
ne("$ne", "!=", "Conditional", "不等于"),
|
ne("$ne", "!=", "Arithmetic", "不等于"),
|
||||||
ne2("!=", "!=", "Conditional", "不等于"),
|
ne2("!=", "!=", "Arithmetic", "不等于"),
|
||||||
nes("$nes", "!=", "Conditional", "不等于"),
|
nes("$nes", "!=", "Arithmetic", "不等于"),
|
||||||
nes2("!==", "!==", "Conditional", "不等于(严格)"),
|
nes2("!==", "!==", "Arithmetic", "不等于(严格)"),
|
||||||
lt("$lt", "<", "Conditional", "小于"),
|
lt("$lt", "<", "Arithmetic", "小于"),
|
||||||
lt2("<", "<", "Conditional", "小于"),
|
lt2("<", "<", "Arithmetic", "小于"),
|
||||||
lte("$lte", "<=", "Conditional", "小于等于"),
|
lte("$lte", "<=", "Arithmetic", "小于等于"),
|
||||||
lte2("<=", "<=", "Conditional", "小于等于"),
|
lte2("<=", "<=", "Arithmetic", "小于等于"),
|
||||||
gt("$gt", ">", "Conditional", "大于"),
|
gt("$gt", ">", "Arithmetic", "大于"),
|
||||||
gt2(">", ">", "Conditional", "大于"),
|
gt2(">", ">", "Arithmetic", "大于"),
|
||||||
gte("$gte", ">=", "Conditional", "大于等于"),
|
gte("$gte", ">=", "Arithmetic", "大于等于"),
|
||||||
gte2(">=", ">=", "Conditional", "大于等于"),
|
gte2(">=", ">=", "Arithmetic", "大于等于"),
|
||||||
|
|
||||||
// 逻辑运算符
|
// 逻辑运算符
|
||||||
and("$and", "&&", "Logical", "且"),
|
and("$and", "&&", "Logical", "且"),
|
||||||
|
@ -69,4 +69,8 @@ public enum MathOperatorEnum {
|
||||||
}
|
}
|
||||||
return isLogical;
|
return isLogical;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isLogical() {
|
||||||
|
return StrUtil.equals(this.getType(), "Logical");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,11 +1,74 @@
|
||||||
package com.wezone.drools.utils;
|
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 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<String, Object> 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<String> 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();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,7 @@ import cn.hutool.json.JSONObject;
|
||||||
import cn.hutool.json.JSONUtil;
|
import cn.hutool.json.JSONUtil;
|
||||||
import com.googlecode.aviator.AviatorEvaluator;
|
import com.googlecode.aviator.AviatorEvaluator;
|
||||||
import com.wezone.drools.enums.MathOperatorEnum;
|
import com.wezone.drools.enums.MathOperatorEnum;
|
||||||
|
import com.wezone.drools.utils.ConditionParser;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
@ -23,53 +24,26 @@ public class ConditionTest {
|
||||||
|
|
||||||
JSONArray jsonArray = JSONUtil.parseArray(condition);
|
JSONArray jsonArray = JSONUtil.parseArray(condition);
|
||||||
|
|
||||||
StringBuffer stringBuffer = new StringBuffer();
|
String conditionResult = ConditionParser.parseCondition(jsonArray);
|
||||||
for (int i = 0; i < jsonArray.size(); i++) {
|
|
||||||
StringJoiner stringJoiner = new StringJoiner(" ");
|
|
||||||
JSONObject o = jsonArray.getJSONObject(i);
|
|
||||||
|
|
||||||
int finalI = i;
|
Console.log("condition template = {}", conditionResult.toString());
|
||||||
o.forEach(kv -> {
|
|
||||||
String key = kv.getKey();
|
|
||||||
JSONArray values = (JSONArray) kv.getValue();
|
|
||||||
boolean notEmpty = CollUtil.isNotEmpty(values);
|
|
||||||
|
|
||||||
if (notEmpty) {
|
Object executeB = AviatorEvaluator.execute(conditionResult.toString());
|
||||||
if (finalI != 0) {
|
Console.log("{} = {}", conditionResult.toString(), executeB);
|
||||||
MathOperatorEnum operatorEnum = MathOperatorEnum.fromOperator(key);
|
}
|
||||||
Console.log("math Operator = {}", operatorEnum.toString());
|
|
||||||
stringJoiner.add(operatorEnum.getActual());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test2() {
|
||||||
|
String condition = "[{\"$or\":[{\"$and\":[{\"$eq\":[\"2\",\"2\"]},{\"$eq\":[\"2\",\"3\"]}]}]},{\"$or\":[{\"$eq\":[\"2\",\"2\"]}]}]";
|
||||||
|
|
||||||
stringJoiner.add("(");
|
JSONArray jsonArray = JSONUtil.parseArray(condition);
|
||||||
int ki = 0;
|
|
||||||
for (Object value : values) {
|
|
||||||
JSONObject vJson = (JSONObject) value;
|
|
||||||
|
|
||||||
Set<String> keySet = vJson.keySet();
|
String conditionResult = ConditionParser.parseCondition(jsonArray);
|
||||||
for (String skey : keySet) {
|
|
||||||
// if(ki != 0) {
|
|
||||||
MathOperatorEnum operatorEnum = MathOperatorEnum.fromOperator(skey);
|
|
||||||
Console.log("math Operator = {}", operatorEnum.toString());
|
|
||||||
// }
|
|
||||||
|
|
||||||
JSONArray sValues = vJson.getJSONArray(skey);
|
Console.log("condition template = {}", conditionResult.toString());
|
||||||
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());
|
|
||||||
|
|
||||||
Object executeB = AviatorEvaluator.execute(stringBuffer.toString());
|
Object executeB = AviatorEvaluator.execute(conditionResult.toString());
|
||||||
Console.log("{} = {}", stringBuffer.toString(), executeB);
|
Console.log("{} = {}", conditionResult.toString(), executeB);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue