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

标签 drools

我正在努力使用 DROOL 中的模式匹配例程,该例程遍历复杂嵌套对象的列表。

我有一个像这样的 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; }
}

我试图找到正确的语法来收集与一组条件匹配的所有类型为“A”的对象,这些条件还包括包含在“A”中的对象中的匹配字段 listOfB .

我认为规则需要看起来像这样,但是当它在 collect( ... ) 中时我不会编译该模式
import java.util.ArrayList;
rule "Tricky Syntax"
when
    $myFact: MyFact()
    $filteredListOfA: ArrayList( size > 0 ) from collect ( 
        A( stringField == "something", $listOfB: listOfB ) from $myFact.listOfA
        B( otherStringField == "somethingElse" ) from $listOfB
    ) 
then
   // Do something neat with $filteredListOfA
end

我知道它可以以这样一种方式编写,其中每个元素都迭代匹配,但我只想触发一次操作,如果有任何匹配,则有一个 A 列表。
谢谢!

最佳答案

这不可能使用“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 中的元素被多次选择时列表元素应该只出现一次,只需使用 SetcollectSet .

关于DROOLS 模式匹配具有复杂对象的嵌套列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27326773/

相关文章:

java - Drools 规则过滤数字属性低于列表总数百分比的元素

java - 使用工作流引擎、状态机引擎还是自己动手?

maven - Drools 6 sisu-guava 与 Guava 冲突

java - 流口水正则表达式来匹配非 Alpha

Drools 规则编写最佳实践

java - 在 Drools 中为组执行单个规则

java - 如何在StatelessKieSession中设置AgendaGroup 流口水

drools - Drools 6.5 中的规则流组与议程组

java - 有没有办法重用知识库,而不是通过无状态知识 session 重新插入所有事实?

drools - 如何优化Drools执行性能?