Drools 口水累积是在更新一个不相关的事实

Drools 口水累积是在更新一个不相关的事实,drools,Drools,在Drools中使用累积时,将针对未更新的事实计算并触发规则 规则如下: 规则“WidgetsPerUser” 什么时候 $user:user() 积累( 小部件(checkIsUser($user)); $widgetCount:总和(1) ) 然后 System.out.println($user+“有”+$widgetCount+“小部件”); 结束 想法很简单:计算每个用户的小部件对象的数量checkIsUser()是一种简单的相等性检查,但表示无法使用索引的检查 以下是Drools

在Drools中使用累积时,将针对未更新的事实计算并触发规则

规则如下:

规则“WidgetsPerUser”
什么时候
$user:user()
积累(
小部件(checkIsUser($user));
$widgetCount:总和(1)
)
然后
System.out.println($user+“有”+$widgetCount+“小部件”);
结束
想法很简单:计算每个
用户
小部件
对象的数量
checkIsUser()
是一种简单的相等性检查,但表示无法使用索引的检查

以下是Drools 7.0.0.Final的示例输出:

-- Calling fire all rules --
User5 has 10 widgets
User4 has 10 widgets
User3 has 10 widgets
User2 has 10 widgets
User1 has 10 widgets

Widget moved from User3 to User1

-- Calling fire all rules --
User5 has 10 widgets
User3 has 9 widgets
User1 has 11 widgets
在这里,我们将5个
用户
事实插入到内存中,并且所有的
小部件
计数都是10。第一次调用
fireAllRules
显示正确的打印,因为所有
User
事实都被插入内存。接下来是一个更新,其中一个
小部件
从User3移动到User1。预期输出存在,但是User5没有理由显示为正在更新

要直观地突出问题,请执行以下操作:

User5 has 10 widgets    (User5 should NOT be triggered!)

                        (User4 is correctly ignored)

User3 has 9 widgets     (User3 is correctly triggered)

                        (User2 is correctly ignored)

User1 has 11 widgets    (User1 is correctly triggered)
User5与User2或User4的唯一不同之处在于它是最后添加的用户事实,那么为什么它的行为会有所不同呢

是否需要额外评估?它有什么用途?


请注意,问题不在于如何避免或绕过额外的触发器。

我自己在drools核心周围挖掘,以获得一些答案。我发现了以下内容(在7.0.0和7.39.0版本中):

在计算累加节点更新的方法中,就在方法
doRightUpdatesProcessChildren
(用于左元组和右元组之间的匹配)之前,存在以下代码:

//如果LeftTupleMemory为空,则没有可修改的匹配项
if(leftTuple!=null){
if(leftTuple.getStagedType()==leftTuple.NONE){

trgLeftTuples.addUpdate(leftTuple);//您的分析是100%正确的。我在这里报告了这个问题,并发送了一个pul请求,按照您的建议进行修复,该修复将从Drools 7.41中提供。如果您将来会发现类似的问题,请随时打开我们jira的记录。非常感谢!谢谢您,很高兴我能提供帮助!