首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将angular2 2查询生成器查询转换为逻辑表达式

将angular2 2查询生成器查询转换为逻辑表达式
EN

Stack Overflow用户
提问于 2018-08-20 08:38:38
回答 2查看 2.1K关注 0票数 4

我在我的项目中使用Angular2-查询生成器。此外,后端项目使用Java、Spring引导和规则簿作为规则引擎,以激发由angular2查询生成器生成的规则。因此,我需要从angular2-query-builder的输出中生成一个逻辑表达式。

这是由查询生成器生成的类型脚本对象.

代码语言:javascript
复制
  query = {
    condition: 'and',
    rules: [
      {field: 'age', operator: '<=', value: '16'},
      {field: 'gender', operator: '=', value: 'm'}
    ]
  };

我在后端创建的映射模型类:

代码语言:javascript
复制
RuleSet {
    String field;
    String value;
    String operator;
    String entity;
    String condition;
    RuleSet[] rules;
//...getters and setters}

我需要从对象中获取(age <= 16) && (gender = 'm')

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-21 09:39:48

创建递归方法以遍历规则

代码语言:javascript
复制
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();
}

那就这样说吧:

代码语言:javascript
复制
List<String> expressions = new ArrayList<>();
decode(querySchema.ruleSet.rules, expressions, querySchema.ruleSet.condition);

通过将表达式的所有项添加到字符串对象中。将生成逻辑表达式。

票数 2
EN

Stack Overflow用户

发布于 2020-05-17 19:46:59

参考ramin,typeScript实现

首先,将模型定义为:

代码语言:javascript
复制
export class RuleSet {
    field?  : string;
    value? : string | string[] | number;
    operator? : string;
    entity ?: string;
    condition ?: string;
    rules ?: RuleSet[];
}

然后定义解码函数:

代码语言:javascript
复制
  //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;
  }

称其为:

代码语言:javascript
复制
expression : string = "";
this.decodeQuery(query.rules,query.condition);

由此产生的产出如下:

代码语言:javascript
复制
(age <= 16) && (gender = 'm')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51926966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档