Merge remote-tracking branch 'origin/main' into main
This commit is contained in:
commit
5c49ddd40c
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<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 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<String> 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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue