在 Drools 中激活子对象的规则

Activate Rules on child objects in Drools

我有两个名为 OptionalCoverOptionalPremiumComponent 的事实,OptionalCover 在其中引用了 OptionalPremiumComponent。所以这就是我要插入工作记忆的内容。

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

问题是,当我插入父对象时,上面的规则没有被触发。我是否需要做任何其他事情来启用此行为?是否支持?

谢谢。

Drools 引擎无法判断您的封面是否包含组件。 (好吧,它有,因为它可能会使用反射 - 但它应该在哪里停止?)

因此,您还必须插入 OptionalPremiumComponent。

为了减少代码中的混乱程度,您可以编写一些巧妙的方法,以便您可以通过一次调用插入 Cover 和 Component。 比如你有很多相似的"contains"关系,想自由推理,你可以实现s.th。喜欢

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

其中 factChildren 将 return 带有 premiumComponent 的列表或空列表,或者,另一种方法是在内部处理所有内容的 insertAll 方法。