DROOLS模式匹配具有复杂对象的嵌套列表

DROOLS模式匹配具有复杂对象的嵌套列表,drools,Drools,我正在DROOLs中处理一个模式匹配例程,该例程遍历复杂嵌套对象的列表 我的POJO结构如下: class MyFact { private List<A> listOfA; public List<A> getListOfA() { return listOfA; } } class A { private List<B> listOfB; private String stringField; public Lis

我正在DROOLs中处理一个模式匹配例程,该例程遍历复杂嵌套对象的列表

我的POJO结构如下:

class MyFact {
    private List<A> listOfA;
    public List<A> getListOfA() { return listOfA; }
}

class A {
    private List<B> listOfB;
    private String stringField;
    public List<B> getListOfB() { return listOfB; }
    public String getStringField() { return stringField; }
}

class B {
    private String otherStringField;
    public String getOtherStringField() { return otherStringField; }
}
我知道它可以这样写,每个元素都是迭代匹配的,但我只想触发一次操作,如果有匹配的话,就有一个单独的元素列表。 谢谢

这在使用“collect”时是不可能的,因为collect CE中不可能有多个模式。(你的意思是收集A或B或两者吗?)

$myFact: MyFact()
$filteredListOfA: List( size > 0 ) from accumulate ( 
    $a: A( stringField == "something", $listOfB: listOfB ) from $myFact.listOfA
    and
    B( otherStringField == "somethingElse" ) from $listOfB;
    collectList( $a )
) 
以后


如果在多次选择listOfA中的元素时列表元素只出现一次,只需使用
集合
集合

使用collectSet()而不是collectList()对修复语法和删除重复的

感谢您为我们指出了正确的方向

另外,值得注意的是,使用collectSet()和collectList()不一定会保留匹配顺序(由于DROOLs LIFO行为)。下面是一个替代解决方案,它保留操作的匹配顺序(如果这很重要)


这是非常有用的,让我更进一步,但不是100%正确。需要删除该文件;在“somethingElse”之后,将ArrayList导入更改为List(以避免类强制转换异常-UnmodifyableRandomAccessList到ArrayList)。修复后,如果$listOfB中有多个匹配的对象B,代码将返回一个filteredListOfA,其中包含a的副本。现在我更好地理解了累积CE,我想我可以解决这个问题。谢谢。谢谢你的反馈。我添加了Set作为消除duplicates@laune请看一下这个
$myFact: MyFact()
$filteredListOfA: List( size > 0 ) from accumulate ( 
    $a: A( stringField == "something", $listOfB: listOfB ) from $myFact.listOfA
    and
    B( otherStringField == "somethingElse" ) from $listOfB;
    collectList( $a )
) 
import java.util.Set;
rule "Tricky Syntax"
when
    $myFact: MyFact()
    $filteredListOfA: Set( size > 0 ) from accumulate ( 
        $a: A( stringField == "something", $listOfB: listOfB ) from $myFact.listOfA
        and
        B( otherStringField == "somethingElse" ) from $listOfB;
        collectSet( $a )
    )
then
    // Do something with the $filteredListOfA Set
end
import java.util.Set;
import java.util.LinkedHashSet;
rule "Tricky Syntax"
when
    $myFact: MyFact()
    $filteredListOfA: Set( size > 0 ) from accumulate ( 
        $a: A( stringField == "something", $listOfB: listOfB ) from $myFact.listOfA
        and
        B( otherStringField == "somethingElse" ) from $listOfB,
        init( Set set = new LinkedHashSet(); ),
        action( set.add( $a ); ),
        result( set )
    )
then
    // Do something with the $filteredListOfA Set
end