在规则Drools

时间:2017-07-25 15:45:22

标签: drools rule

我们正在制定一条规则,其结构如下:

  • 我们有一个包含经过验证和未经验证的元素的列表。验证和未验证之间的区别是通过为元素提供不同的状态来完成。
  • 我们从列表中获取未经验证的元素。
  • 将每个未经验证的元素与同一列表中的验证元素进行比较。
  • 经过比较,未经验证的元素将成为验证未经验证的元素时需要考虑的有效元素。

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

三个问题:

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

  

"在规则的右侧,建议使用修改声明,   因为它进行更改并通知单个引擎   。声明"

因此,one和other之间的区别只是简单的语义,如:

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

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

这个假设是否正确?

其次,是否可以在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

这会对整个过程产生什么影响?工作记忆的实现将激发重新评估的第一条规则。此规则已经启动两次,因为我们遇到了两个未经验证的元素。剩下的元素只会被评估一次或多次吗?

1 个答案:

答案 0 :(得分:0)

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

第二个问题的方案并未使用相同形式的更新。将List作为事实插入但在列表元素上操作通常被认为是错误的。插入列表元素。容器可能或可能不用作将列表元素保存到一个事务或其他任何事物的容器。