2016-10-14 67 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。