流口水变量绑定:不允许重新分配

时间:2019-12-05 16:52:32

标签: drools

假设MyObject是一个Java对象,其整数属性为integerProperty。 我想编写类似以下的Drools规则(语法上不正确):

rule "myRule"
    when
        MyObject( $integerProperty : integerProperty )
        accumulate(
            $o : MyObject( 
                integerProperty == $integerProperty + 1,
                $integerProperty : this.integerProperty
                );
            $total : count($o);
            $total > 10
            )
    then 
        [BLABLABLA]
end

当一组MyObject类型超过10个元素的integerProperty值构成算术序列时,例如, 123,……在这种情况下,我将为HardMediumSoftLongScore对象分配一个负值(希望该信息有帮助)。

我确信具有给定MyObject的{​​{1}}是唯一的(例如,只有一个integerProperty的{​​{1}}等于{{1} }。问题是不允许我重新分配变量绑定MyObject。有没有解决的办法?

1 个答案:

答案 0 :(得分:0)

尝试实现以下示例,并检查是否获得所需的输出。在触发规则之前,在流口水会话中将前一个对象作为全局变量(在下例中为prev)插入。

global MyObject prev;

rule "myRule"
when
  $total : Number(doubleValue > 10) from accumulate(
                        $o : MyObject( prev.getIntegerProperty() != null && $i : integerProperty == prev.getIntegerProperty() + 1),
                      init( double total = 0;),
                      action( total += 1; ),
                      reverse( total -= 1; ),
                      result( new Double( total ) ) )
then
    [BLABLABLA]
end

在触发规则之前,在Java代码中将之前的对象设置为全局对象。请遵循以下代码:

kieSession.setGlobal("prev",myprevobject)
kieSession.insert(myobject)
kieSession.fireAllRules()