Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在rule Drools的工作内存中修改/更新ArrayList中的元素_Drools_Rule - Fatal编程技术网

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

在rule Drools的工作内存中修改/更新ArrayList中的元素,drools,rule,Drools,Rule,我们正在制定一项规则,其结构如下: 我们有一个包含已验证和未验证元素的列表。已验证和未验证之间的差异是通过为元素提供不同的状态来实现的 我们从列表中获取未验证的元素 将每个未验证的元素与同一列表中的验证元素进行比较 比较后,未验证元素将成为验证元素,验证未验证元素时需要考虑该元素 当我们想要更新元素的原始ArrayList时,问题就出现了。我们需要能够更新工作内存中的原始ArrayList中刚刚经过验证的未验证元素,以便循环可以考虑“刷新”的ArrayList 三个问题: 首先,在Drool

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

  • 我们有一个包含已验证和未验证元素的列表。已验证和未验证之间的差异是通过为元素提供不同的状态来实现的
  • 我们从列表中获取未验证的元素
  • 将每个未验证的元素与同一列表中的验证元素进行比较
  • 比较后,未验证元素将成为验证元素,验证未验证元素时需要考虑该元素
当我们想要更新元素的原始ArrayList时,问题就出现了。我们需要能够更新工作内存中的原始ArrayList中刚刚经过验证的未验证元素,以便循环可以考虑“刷新”的ArrayList

三个问题:

首先,在Drools中使用modify和update的确切区别是什么。根据Drools文件:

“在规则的右侧,建议使用modifystatement, 当它进行更改并在一个小时内通知引擎时 声明。”

因此,一个和另一个之间的区别只是简单的语义,如:

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