在这种情况下如何在drools中使用collect()

时间:2014-11-24 10:42:32

标签: java drools rule

我正在尝试做类似下面的事情来收集满足某些条件的某种类型的物体。

rule "collect_other"
$lineItem2 : A( $iVal : iValue, $qd2 : quantity) 
B($bVal : bId)
$rowLowerOther : C(iValue == $iVal, bId == $bVal,
                   $lsequence : sequence, $jValue : jAvlDate)
$rowHigherOther : List() 
    from collect(C(iValue == $iVal, bId == $bVal,
                   sequence == $lsequence-1, jAvlDate != $jValue))

then
    //do something
end

现在我正在获得一个对象,即使我有多个对象满足这个条件。

注意:我想通过从第一个对象实例“C”获取值来收集所有项目的满足条件

请帮帮我。

1 个答案:

答案 0 :(得分:1)

C类的对象是:

C(101, "BU1", 1,"2014-11-23");
C(101, "BU1", 2,"2014-11-24");
C(101, "BU1", 3,"2014-11-25");
C(101, "BU1", 4,"2014-11-26")

我们假设我们有

A(101,...)
B("BU1")

然后是模式

C(iValue == $iVal, bId == $bVal,$lsequence : sequence,...)

匹配任何这些C对象,将$ lsequence绑定到1,2,3等等。对于第一个绑定,规则不会触发,因为没有C事实匹配sequence == 1-1

对于值2,3,4等中的每一个,规则将匹配并准确地将C事实收集到列表中,即分别具有seuqnce == 1,2,3,...的那个。

也许这可以做你想要的 - 但我只是在猜测。

rule "collect_other"
when
  $lineItem2: A( $iVal: iValue, $qd2 : quantity ) 
              B( $bVal : bId )
  $rowLowerOther: C(iValue == $iVal, bId == $bVal,
                    $lsequence : sequence, $jValue: jAvlDate)
  not C( iValue == $iVal, bId == $bVal, sequence < $lsequence )
  $rowHigherOther : List() 
     from collect(C(iValue == $iVal, bId == $bVal, jAvlDate != $jValue))
then
  //...
end