Merge remote-tracking branch 'origin/main' into main

This commit is contained in:
chenweilong 2022-07-05 18:12:24 +08:00
commit 5c49ddd40c
3 changed files with 97 additions and 56 deletions

View File

@ -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");
}
}

View File

@ -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();
}
}

View File

@ -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);
}
}