在一个不起作用的条件组中使用包含运算符的Drools决策表

时间:2015-07-14 04:43:50

标签: drools

Drools 6.2Final

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

<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”和“#39”,则触发规则43。或者&#39; BBB&#39;和&#39; CCC&#39;

但是决策表解析器失败,但规则43

除外
[Error: Missing left node]
[Near : {... classList (contains("AAA") || contains("CCC")) ....}]

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

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

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

感谢

-lp

1 个答案:

答案 0 :(得分:0)

表条目看起来不对我,你没有显示classList的Java代码 - 解释&#34;是List<String>&#34;很暧昧。

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

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

如果列表在班级intList中为字段SomeClass,则可以使用

CONDITION
SomeClass
intList (contains $1 || contains $2) && contains $3
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

令人讨厌的是,您不能使用引号(&#34;)来分隔字符串文字,但撇号可以正常工作。

如果这在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