在Drools中激活子对象的规则

时间:2016-10-14 04:56:56

标签: 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

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

谢谢。

1 个答案:

答案 0 :(得分:0)

Drools引擎无法告诉你的Cover包含一个Component。 (嗯,它有,因为它可能使用反射 - 但它应该停在哪里?)

因此,您还必须插入OptionalPremiumComponent。

为了减少代码中的混乱程度,您可以编写一些巧妙的方法,以便可以通过一次调用插入Cover和Component。 例如,如果你有许多类似的“包含”关系,如果你想自由推理,你可以实现s.th.像

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

其中factChildren将返回带有premiumComponent或空List的List,或者一个方法insertAll,它在内部处理所有内容。