【问题标题】:HashMap to cayenne ExpressionHashMap 到 cayenne 表达式
【发布时间】:2016-07-26 01:45:55
【问题描述】:

我有一个原创的 Cayenne Expression

(effectiveDate >= 01/01/2015) and ((specialFeaturesString like "*808*") and ((amortizationType = "05") or (amortizationType = "06")) and (loanType = 2))

我的代码库中有一个 util 方法可以将上述表达式转换为 HashMap。 我遍历地图并转换为 JSON 格式并将该 JSON 提供给 jquery QueryBuilder。我在 UI 层更改 JSON 并使用 Jackson 将 JSON 转换为 HashMap HashMap sysout 如下

{condition=AND, rules=[{id=effectiveDate, field=effectiveDate, type=date, input=text, operator=greater_or_equal, value=04/05/2016}, {condition=AND, rules=[{id=specialFeaturesString, field=specialFeaturesString, type=string, input=text, operator=contains, value="*808*"}, {condition=OR, rules=[{id=amortizationType, field=amortizationType, type=string, input=select, operator=equal, value=05}, {id=amortizationType, field=amortizationType, type=string, input=select, operator=equal, value=06}]}, {id=loanType, field=loanType, type=string, input=select, operator=equal, value=2}]}]}

我需要遍历HashMap并将其转换为Cayenne Expression。

最终结果应该是

(effectiveDate >= 04/05/2016) and ((specialFeaturesString like "*808*") and ((amortizationType = "05") or (amortizationType = "06")) and (loanType = 2))

请提供代码

【问题讨论】:

    标签: jquery json hashmap jackson apache-cayenne


    【解决方案1】:

    这是一个递归解析器的框架,可以帮助您入门:

    public class ExpressionParser {
    
        public SimpleNode parse(Map<String, Object> map) {
    
            SimpleNode e = expForAggregateCondition(map);
    
            if (e == null) {
                e = expForRule(map);
            } else {
    
                Collection<Map<String, Object>> rules = 
                  (Collection<Map<String, Object>>) map.get("rules");
                if (rules != null) {
                    for (Map<String, Object> submap : rules) {
    
                        SimpleNode subExp = parse(submap);
                        e.jjtAddChild(subExp, e.jjtGetNumChildren());
                    }
                }
            }
    
            return e;
        }
    
        private SimpleNode expForAggregateCondition(Map<String, Object> map) {
            String condition = (String) map.get("condition");
            if (condition == null) {
                return null;
            }
    
            switch (condition) {
            case "AND":
                return new ASTAnd();
            case "OR":
                return new ASTOr();
            default:
                throw new IllegalArgumentException("Bad condition: " + condition);
            }
        }
    
        private SimpleNode expForRule(Map<String, Object> map) {
            // TODO...
        }
    
    }
    

    将 expForRule 方法更新为

      private SimpleNode expForRule(Map<String, Object> map) {
        return (SimpleNode) ExpressionFactory.matchExp((String) map.get("id"), map.get("value"));
    }
    

    这导致

    effectiveDate = "04/05/2016" and specialFeaturesString = "\"*808*\"" and amortizationType = "05" or amortizationType = "06" and loanType = "2"
    

    不带括号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-10
      • 2012-01-17
      • 2015-05-26
      • 1970-01-01
      相关资源
      最近更新 更多