完成解析条件表达式字符串

This commit is contained in:
sanmao 2022-07-04 10:28:18 +08:00
parent d27482f529
commit 56f761f302
3 changed files with 171 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,148 @@
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);
int finalI = 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 (finalI != 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(" ");
// stringJoiner.add("(");
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);
// if(ki != 0) {
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++;
}
// stringJoiner.add(") ");
return stringJoiner.toString();
}
// private static String parseArithmetic(JSONArray jsonArray) {
// Console.log("parseArithmetic ---- {}", JSONUtil.toJsonStr(jsonArray));
// StringJoiner stringJoiner = new StringJoiner(" ");
// stringJoiner.add("(");
// 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);
//// if(ki != 0) {
// MathOperatorEnum operatorEnum = MathOperatorEnum.fromOperator(skey);
// Console.log("math Operator = {}, isLogical = {}", operatorEnum.toString(), operatorEnum.isLogical());
//// }
// String leftValue = sValues.getStr(0);
// String rightValue = sValues.getStr(1);
// stringJoiner.add(leftValue).add(operatorEnum.getActual()).add(rightValue);
// }
// ki++;
// }
// stringJoiner.add(") ");
//
//// JSONObject o = jsonArray.getJSONObject(i);
////
//// int finalI = 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) {
//// if (finalI != 0) {
//// MathOperatorEnum operatorEnum = MathOperatorEnum.fromOperator(key);
//// Console.log("math Operator = {}", operatorEnum.toString());
//// stringJoiner.add(operatorEnum.getActual());
//// }
////
////
//// stringJoiner.add("(");
//// int ki = 0;
//// for (Object value : values) {
//// JSONObject vJson = (JSONObject) value;
////
//// Set<String> keySet = vJson.keySet();
//// for (String skey : keySet) {
//// JSONArray sValues = vJson.getJSONArray(skey);
////// if(ki != 0) {
//// MathOperatorEnum operatorEnum = MathOperatorEnum.fromOperator(skey);
//// Console.log("math Operator = {}, isLogical = {}", operatorEnum.toString(), operatorEnum.isLogical());
////// }
////
//// if(operatorEnum.isLogical()) {
//// stringJoiner.add(parseCondition(sValues));
//// } else {
//// 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());
//// }
// 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);
}
}