как написать условие, используя j-easy easy-rules, чтобы найти любое подходящее значение в наборе - PullRequest
0 голосов
/ 02 марта 2019

Я хотел бы написать условие для оценки, если любое из установленных значений в фактах соответствует условию.

Это определение моего правила:

public void evaluateRule(Facts facts, String ruleNum) {
        SpRuleDefinition spRuleDefinition = spRuleDefinitionService.findByRuleNum(ruleNum);
        System.out.println("Invoke Action : " + spRuleDefinition.getActionNum());
        facts.put("action", "ACTION1");
        MVELRule rule = new MVELRule()
                            .name("Rule1")
                            .description("My Rule")
                            .priority(1)
                            .when("shipment.orgNum=='ORG1' && (shipment.fromAddress.country=='IN' || shipment.toAddress.country=='IN') && shipment.shipmentLines.itemDetail.active==false")
                            .then("shipment.setOutcome(action);");
        Rules rules = new Rules();
        rules.register(rule);   
        //Fire rules on known facts
        RulesEngine rulesEngine = new DefaultRulesEngine();
        rulesEngine.fire(rules, facts);
    }

Входные данныечто я передаю, может быть что-то вроде этого:

{"orgNum": "ORG1", "fromAddress": {"country": "SGP"}, "shipmentLines": [{"itemDetail": {"active": true, "countryOfOrigin": "IN"}, "itemNum": "I1", "amount": 10}, {"itemDetail": {"active": false, "countryOfOrigin": "US"}, "itemNum": "I2", "amount": 1}], "toAddress": {"country": "IN"}}

Я хотел бы оценить, имеет ли какая-либо из строк отгрузкиitemDetail с активным флагом, установленным в false.Вышеуказанное правило не выполняется со следующим исключением:

org.mvel2.PropertyAccessException: [Error: could not access: itemDetail; in class: java.util.HashSet]
[Near : {... s.country=='IN') && shipment.shipmentLines.itemDet ....}
]

1 Ответ

0 голосов
/ 17 марта 2019

Это вопрос MVEL, а не вопрос EasyRules.

Я хотел бы оценить, имеет ли какая-либо из строк отгрузки элемент itemDetail с активным флагом, установленным в false.

Вы можете определить функцию, которая выполняет итерации по набору и проверяет ваше состояние.Вот пример:

@Test
public void testConditionOnSet() {
    Set<ItemDetail> itemDetailSet = new HashSet<>();
    itemDetailSet.add(new ItemDetail(false));
    itemDetailSet.add(new ItemDetail(false));
    itemDetailSet.add(new ItemDetail(true));

    String condition = "active = false;\n" +
            "foreach (itemDetail : itemDetails) {\n" +
            "   active = active && itemDetail.active;\n" +
            "}\n" +
            "System.out.println(\"Is there a non active itemDetail?: \" + !active);";
    Map facts = new HashMap();
    facts.put("itemDetails", itemDetailSet);

    Object result = MVEL.eval(condition, facts);
}

static class ItemDetail {
    private boolean active;

    public ItemDetail(boolean active) {
        this.active = active;
    }

    public boolean isActive() {
        return active;
    }
}

Этот пример печатает: Is there a non active itemDetail? true.

Надеюсь, это поможет.

...