代码地址:https://github.com/ImTravis/drools
1、Accumulate内联语法(推荐)
<result pattern> from accumulate( <source pattern>,
init( <init code> ),
action( <action code> ),
reverse( <reverse code> ),
result( <result expression> ) )
<result pattern>:这是一个规则模式,引擎试图匹配从返回的对象。如果匹配,则累加条件元素的计算结果为true,然后引擎继续计算规则中的下一个CE。如果不匹配,累加CE的值将为false,引擎将停止为该规则计算CEs。
<source pattern>:源模式是一个常规模式,引擎将尝试匹配每个源对象。
<init code>:这是所选方言中的一个语义代码块,在遍历源对象之前,将对每个元组执行一次。
<action code>:这是所选方言中的一个语义代码块,将为每个源对象执行。
<reverse code>:这是所选方言中可选的语义代码块,如果存在,将为不再匹配源模式的每个源对象执行。这个代码块的目的是撤销在块中所做的任何计算,这样引擎就可以在修改或删除源对象时进行递减计算,极大地提高了这些操作的性能。(实操时没有起作用,编码中...)
<result expression>:这是在所选方言中的一个语义表达式,在遍历所有源对象之后执行。
通俗得讲
- init 初始化变量
- action 每次遍历执行的动作
- reverse (可选)反转动作,用于优化
- result 返回的执行结果
2、accumulate 中可使用的Drools内置的累加函数功能
- average
- min
- max
- count
- sum
- variance
- standardDeviation
- collectList
- collectSet
2.1 collectList (注意写法)
累加函数返回:从遍历数据中取出指定数据的集合
取出动物集合中价格低于120的动物的名字集合
与From相比,取出集合中性别为女性的集合
实际操作中,collectList的方式更为强大,且不容易出错
2.2 其他相关的函数操作,见代码
ComponentRuleTest.accumulate()测试类
执行得时候,把其他规则调用注释了,防止同时调用几条规则;(小伙伴可以试下,多条连续的fireAllRules
(入参Fact一样)之间如果没有kieSession.insert(...),操作,只执行最上一条规则)
如果需要同时调用几条规则,建议通过group或者RuleNameEndsWithAgendaFilter...等来控制