0

オリジナルのカイエン エクスプレッションを持っています

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

私のコードベースには、上記の式を HashMap に変換する util メソッドがあります。マップを走査して 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))

コードを入力してください

4

1 に答える 1

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"

括弧付きでは表示されません。

于 2016-04-06T04:57:42.440 に答える