代码之家  ›  专栏  ›  技术社区  ›  Ramin PK

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

  •  1
  • Ramin PK  · 技术社区  · 6 年前

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

      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') 从物体上。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Ramin PK    6 年前

    使用递归方法遍历规则

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

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