2016-10-14 88 views
0

我有兩個事實名爲OptionalCoverOptionalPremiumComponentOptionalCover其中有一個參考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)); 

我已經創建了滴料

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。