条件组中包含运算符的 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
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