Drools:在标准中使用'或'来构建列表

时间:2016-07-20 07:33:00

标签: drools

我处于这样一种情况,我需要构建一个符合两个标准的分离('或')的对象列表。这些标准本身对我来说是原子的,我无法改变它们。

我无法使用from collect因为它不允许多种模式。 accumulate确实如此,但它不允许任何具有 - 或简化 - 在其条件部分中分离的东西。

例如,我可以这样做:

$myList: ArrayList() from accumulate (
    (and
        $book: Book()
        <Constraint A>
        <Constraint B>
    );
    collectList($book)
)

这些约束可以是以某种方式应用于$ book和/或其属性的其他模式或eval语句。但我想要做什么,但可以做:

$myList: ArrayList() from accumulate (
    (and
        $book: Book()
        (
            <Constraint A>
            or
            <Constraint B>
        )
    );
    collectList($book)
)

另一种解决方法是在accumulate子句之外使用析取,例如:

$listA: ArrayList() from accumulate (
    (and
        $book: Book()
        <Constraint A>
    );
    collectList($book)
)
$listB: ArrayList() from accumulate (
    (and
        $book: Book()
        <Constraint A>
    );
    collectList($book)
)
$myList: <somehow concatenate lists listA and listB>

为此,我需要连接两个列表,到目前为止我还没有发现它是可能的。我有点卡住......

1 个答案:

答案 0 :(得分:0)

所以在@raphaëλ的帮助下,现在这是一个有效的解决方案:

query listBuilder(Book book)
    (or
        <ConstraintA>
        <ConstraintB>
    )
end

rule "some rule using a list"
    when
        ...
        accumulate (
            (and
                $book: Book()
                listBuilder($book;)
            );
            $myList: collectList($book)
        )
        ...
end

$myList现在是我要构建的列表,因为它仍然使用accumulate构建,我甚至可以使用accumulate所有强大的聚合函数。< / p>