DROOLS模式匹配具有复杂对象的嵌套列表
我正在DROOLs中处理一个模式匹配例程,该例程遍历复杂嵌套对象的列表 我的POJO结构如下: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
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