我们正在制定一个结构如下的规则:
- 我们有一个包含已验证和未验证元素的列表。已验证和未验证之间的区别是通过为元素提供不同的状态来完成的。
- 我们从列表中获取未经验证的元素。
- 将每个未经验证的元素与同一列表中已验证的元素进行比较。 比较后,未经验证的元素将成为验证的元素,在验证
- 未验证的元素时需要考虑该元素。
当我们要更新元素的原始数组列表时,就会出现问题。我们需要能够更新工作内存中刚刚在其原始 ArrayList 中经过验证的未验证元素,以便循环可以考虑"刷新"的 ArrayList。
三个问题:
首先,在Drools中使用修改和更新之间的确切区别是什么。根据Drools文档:
"在规则的右侧,建议使用修改语句, 因为它进行更改并在单个中通知引擎 声明。
因此,一个和另一个之间的区别只是简单的语义,例如:
modify( $sprinkler ) { setOn( true ) };
和
$sprinkler.setOn(true);
update($sprinkler);
这个假设正确吗?
其次,是否可以在不使用普通 Java 迭代器("for"(的情况下更新或修改 Drools 中工作内存中 ArrayList 中的特定元素。在我们的例子中,每个元素都用我们从列表中获得的唯一 ID 标识,因此我们将有一个有效的参考来更新其状态(已验证或未验证(。
最后,我们知道更新工作内存会导致规则再次触发。假设我们有一个包含两个未经验证的项目的 ArrayList。如果我们要获取所有未经验证的项目来验证它们,我将创建一个"首先"的规则,为每个未验证的项目触发两次:
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
这将如何影响整个过程?工作记忆的实现将引发重新评估的第一条规则。此规则已经启动了两次,因为我们遇到了两个未经验证的元素。剩余元素是只计算一次还是多次计算?
第一个问题的答案是两个代码段之间没有区别。(在第二个两个之间插入的陈述会影响我的回答。
第二个问题的方案不使用相同形式的更新。插入列表作为事实,但对列表元素进行操作通常被认为是不好的。插入列表元素。容器可能有用,也可能没有用,作为将列表元素保存到一个事务或其他任何事务的容器。