在rule Drools的工作内存中修改/更新ArrayList中的元素
我们正在制定一项规则,其结构如下:在rule Drools的工作内存中修改/更新ArrayList中的元素,drools,rule,Drools,Rule,我们正在制定一项规则,其结构如下: 我们有一个包含已验证和未验证元素的列表。已验证和未验证之间的差异是通过为元素提供不同的状态来实现的 我们从列表中获取未验证的元素 将每个未验证的元素与同一列表中的验证元素进行比较 比较后,未验证元素将成为验证元素,验证未验证元素时需要考虑该元素 当我们想要更新元素的原始ArrayList时,问题就出现了。我们需要能够更新工作内存中的原始ArrayList中刚刚经过验证的未验证元素,以便循环可以考虑“刷新”的ArrayList 三个问题: 首先,在Drool
- 我们有一个包含已验证和未验证元素的列表。已验证和未验证之间的差异是通过为元素提供不同的状态来实现的
- 我们从列表中获取未验证的元素
- 将每个未验证的元素与同一列表中的验证元素进行比较
- 比较后,未验证元素将成为验证元素,验证未验证元素时需要考虑该元素
modify( $sprinkler ) { setOn( true ) };
及
这个假设正确吗
其次,是否可以在Drools的工作内存中更新或修改ArrayList中的特定元素,而无需使用普通Java迭代器(“for”)。在我们的例子中,每个元素都用从列表中获得的唯一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
这将如何影响整个过程?工作记忆的实现将促使人们重新评估第一条规则。这个规则已经启动了两次,因为我们遇到了两个未验证的元素。剩下的元素将只评估一次还是多次 第一个问题的答案是这两个片段之间没有区别。(第二条中两条之间插入的语句会影响我的回答。)
第二个问题的场景不使用相同形式的更新。将列表作为事实插入,但对列表元素进行操作通常被认为是不好的。插入列表元素。该容器可能有用,也可能不有用,因为它将列表元素保存到一个事务或其他事务中。非常感谢您的回答:关于第一个问题的说明,以及关于第二个问题的说明。我按照你的指导方针重新编码了规则,现在它运行得很好。在我的例子中,容器仍然有用,但它已超出工作内存,从而节省了许多潜在问题。在使用Drools编码时,是否有任何文档或链接提供有关不良做法的信息?
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