条件组中包含运算符的 Drools 决策 table 不起作用

Drools decision table with contains operator in a conditional group not working

Drools 6.2Final

我正在使用具有以下表达式的决策 Table

<row 10> CONDITION
<row 12> classList $param

行包含

<row 43> (contains('AAA') || contains('BBB') ) && contains('CCC') <--fails to compile
<row 44> (contains('AAA') || contains('BBB') 
<row 45> (contains('AA') || contains('BB') || contains('CCC') || contains('DDD')

classList 所在的位置

List<String> classList = {'AAA', 'BB'.....}

如果列表包含 'AAA' OR 'BBB' AND 'CCC'

,规则 43 将被触发

但是 table 解析器的决定因规则 43

的异常而失败
[Error: Missing left node]
[Near : {... classList (contains("AAA") || contains("CCC")) ....}]

我有一个类似的规则适用于其他行

<row 42> contains('AAA') || contains('BBB') || contains('CCC')

在组条件中使用 contains 运算符似乎有些奇怪。关于如何正确表达的任何想法?

谢谢

-lp

table 条目在我看来不正确,并且您没有显示 classList 的 Java 代码 - "is List<String>" 的解释相当含糊。

如果插入 class List<Integer> 的事实,则以下条件条目工作正常 (5.5.0):

CONDITION
List
this (contains  || contains ) && contains 
match some funny numbers
42, 142, 100

如果列表是classSomeClass中的字段intList,可以使用

CONDITION
SomeClass
intList (contains  || contains ) && contains 
match some funny numbers
42, 142, 100

注意:我显示前四行作为一列加上一行以触发规则的创建。

编辑 以显示另一个变体正在工作:

CONDITION
$x: Country()
cities $param
match values in a List
(contains 'Rome' || contains 'Milan') && contains 'Naples'

编译规则为

rule "match cities"
when
    $x: Country(cities (contains 'Rome' || contains 'Milan') && contains 'Naples')
then
    //...
end

令人讨厌的是,您不能使用引号 (") 来分隔字符串文字,但撇号有效。

如果这在 6.2.0 中不起作用,这是一个回归,您应该在 Drools JIRA 上报告错误。

作为变通方法,考虑分离合取和析取:

CONDITION                           | CONDITION
                $x: Country()
cities $param                       | cities $param
alternatives                        | alternatives
contains 'Rome' || contains 'Milan' | contains 'Naples'

请注意,第二行已加入单元格!生成的 DRL 应该是

rule "match cities"
when
    $x: Country(cities contains 'Rome' || contains 'Milan', cities contains 'Naples')
then
    //...
end