在规则 Drools 的工作内存中修改/更新 ArrayList 中的元素

Modify / Update element in ArrayList in working memory in rule Drools

我们正在制定结构如下的规则:

当我们想要更新元素的原始 ArrayList 时,问题就出现了。我们需要能够更新刚刚在工作内存中的原始 ArrayList 中验证的未验证元素,以便循环可以将 "refreshed" ArrayList 考虑在内。

三个问题:

首先,在 Drools 中使用修改和更新之间的确切区别是什么。根据 Drools 文档:

"On the right hand side of a rule the modifystatement is recommended, as it makes the changes and notifies the engine in a single statement."

因此两者之间的区别只是简单的语义,例如:

modify( $sprinkler ) { setOn( true ) };

$sprinkler.setOn(true);
update($sprinkler);

这个假设是否正确?

其次,是否可以在不使用普通 Java 迭代器("for")的情况下更新或修改 Drools 工作内存中 ArrayList 中的特定元素。在我们的例子中,每个元素都使用我们从列表中获得的唯一 ID 来标识,因此我们将有一个有效的参考来更新其状态(已验证或未验证)。

最后,我们知道更新工作记忆会导致规则再次触发。假设我们有一个包含两个未验证项的 ArrayList。如果我们要获取所有未验证的项目来验证它们,我会创建一个触发两次的规则 "first",对于每个未验证的项目一次:

rule "first"
  when
    $listOfElements : java.util.ArrayList ( )
    $itemsToValidate : Element ( status == "not validated" ) from $listOfElements
  then 
    //do something or not
end

如果在第二条规则中我会验证某些项目并希望将未验证元素的状态更改为在工作内存中验证,如下所示:

rule "second" extends "first"
  when
    //we validate attributes of the non-validated element against attributes of the validated elements
  then
    //my second question is if something like this is actually possible (solution without Java iterator)
    $itemsToValidate.setStatus("validated")
    modify ($listOfElements) { $itemsToValidate };
end

这将如何影响整个过程?工作记忆的实现将激发要重新评估的第一个规则。由于我们遇到了两个未经验证的元素,因此该规则已经启动了两次。剩下的元素会只被评估一次还是多次?

第一个问题的答案是两个片段之间没有区别。 (在第二个中间插入的语句会影响我的回答。)

第二个问题的场景没有使用相同形式的更新。将列表作为事实插入但对列表元素进行操作通常被认为是错误的。插入列表元素。该容器作为将列表元素保存到一个事务或其他任何内容的容器可能有用,也可能没有用。