我在我的项目中使用Angular2-查询生成器。此外,后端项目使用Java、Spring引导和规则簿作为规则引擎,以激发由angular2查询生成器生成的规则。因此,我需要从angular2-query-builder的输出中生成一个逻辑表达式。
这是由查询生成器生成的类型脚本对象.
query = {
condition: 'and',
rules: [
{field: 'age', operator: '<=', value: '16'},
{field: 'gender', operator: '=', value: 'm'}
]
};我在后端创建的映射模型类:
RuleSet {
String field;
String value;
String operator;
String entity;
String condition;
RuleSet[] rules;
//...getters and setters}我需要从对象中获取(age <= 16) && (gender = 'm')。
发布于 2018-08-21 09:39:48
创建递归方法以遍历规则
private void decode(RuleSet[] rules, List<String> expressions, String condition) {
for (int i = 0; i < rules.length; i++) {
RuleSet item = rules[i];
if (item.rules == null) {
expressions.add(merge("(", item.field, item.operator, item.value, ")"));
if (i != rules.length - 1) {
expressions.add(condition);
}
} else {
condition = item.getCondition();
expressions.add("(");
decode(item.rules, expressions, condition);
expressions.add(")");
}
}
}
public String merge(String... strings) {
StringBuilder result = new StringBuilder();
for (String item : strings) {
if (item != null) {
result.append(item);
}
}
return result.toString();
}那就这样说吧:
List<String> expressions = new ArrayList<>();
decode(querySchema.ruleSet.rules, expressions, querySchema.ruleSet.condition);通过将表达式的所有项添加到字符串对象中。将生成逻辑表达式。
发布于 2020-05-17 19:46:59
参考ramin,typeScript实现
首先,将模型定义为:
export class RuleSet {
field? : string;
value? : string | string[] | number;
operator? : string;
entity ?: string;
condition ?: string;
rules ?: RuleSet[];
}然后定义解码函数:
//params : [{field: 'age', operator: '<=', value: '16'},{field: 'gender', operator:
//'=', value: 'm'}],'and'
decodeQuery(rules : RuleSet[], condition : string) {
for (var i = 0; i < rules.length; i++) {
var item :RuleSet = rules[i];
if (item.rules == null) {
this.expression = this.expression + this.mergeString("(", item.field, item.operator, item.value, ")");
if (i != rules.length - 1) {
this.expression = this.expression + " " + condition + " ";
}
} else {
condition = item.condition;
this.expression = this.expression + "(";
this.decodeQuery(item.rules, condition);
this.expression = this.expression + ")";
}
}
}
mergeString(bracket1,field,operator,value,bracket2) {
var mergedString = bracket1 + " " + field + " " + operator + " " + value + " " + bracket2 ;
return mergedString;
}称其为:
expression : string = "";
this.decodeQuery(query.rules,query.condition);由此产生的产出如下:
(age <= 16) && (gender = 'm')https://stackoverflow.com/questions/51926966
复制相似问题