我处于这样一种情况,我需要构建一个符合两个标准的分离('或')的对象列表。这些标准本身对我来说是原子的,我无法改变它们。
我无法使用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>
为此,我需要连接两个列表,到目前为止我还没有发现它是可能的。我有点卡住......
答案 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>