2016-10-14 2 views
0

У меня есть два факта: OptionalCover и OptionalPremiumComponent и OptionalCover имеет ссылку OptionalPremiumComponent. Так вот что я вставляю в рабочую память.Активировать правила для дочерних объектов в Drools

private static OptionalCover getOptionalCover(Double sumAssured, Double premiumRate) { 
    OptionalPremiumComponent premiumComponent = new OptionalPremiumComponent(); 
    premiumComponent.setSumAssured(sumAssured); 
    premiumComponent.setPremiumRate(premiumRate); 

    OptionalCover optionalCover = new OptionalCover(); 
    optionalCover.setPremiumComponent(premiumComponent); 
    return optionalCover; 
} 

kieSession.insert(getOptionalCover(1000000.0, 0.02)); 

Я создал следующее правило в Drools

import java.lang.Number; 

rule "OptionalCoverCalculation" 
    dialect "java" 
    when 
     opc : OptionalPremiumComponent(sumAssured > 1I && sumAssured != null && premiumRate != null && premiumRate > 0.0) 
    then 
     opc.setPremium(opc.getSumAssured() * 0.001 * opc.getPremiumRate()); 
     System.out.println("Here"); 
end 

Проблема, указанное правило не срабатывает, когда я вставляю родительский объект. Должен ли я сделать что-нибудь еще, чтобы включить это поведение? Поддерживается ли это?

спасибо.

ответ

0

Двигатель Drools не может сказать, что ваша обложка содержит компонент. (Ну, у него есть, так как он может использовать отражение, но где он должен остановиться?)

Итак, вам также придется вставить компонент OptionalPremiumComponent.

Чтобы уменьшить количество помех в коде, вы можете написать своего рода умные методы, чтобы вы могли вставлять Cover и Component с помощью одного вызова. Например, если у вас много похожих «содержит» отношения, и если вы хотите свободно рассуждать, вы можете реализовать s.th. как

interface FactContainer { 
    List<Object> factChildren(); -- return all contained fact objects 
    -- OR -- 
    void insertAll(KieSession ks); 
} 

где factChildren будет возвращать список с premiumComponent или пустой список, или, в качестве альтернативы, один метод insertAll, который обрабатывает все внутри.

Смежные вопросы