Drools:在规则的LHS中匹配数组中的本地字符串

时间:2015-06-22 20:37:02

标签: java drools

我正在尝试创建规则,在其中我检查字符串是否在我的规则的LHS中的字符串列表中。要比较的字符串列表是常量且在规则创建时已知,但在许多类似的规则中有所不同。

一个示例规则就是这样(我现在写的方式):

rule "ruleX"
when
    $a: MyObject() 
then
    List<String> list = new ArrayList<String>();
    list.add("ABC");
    list.add("DEF");

    if (list.contains($a.getString()) {
        //do stuff
    }
end

这不会利用PHREAK引擎中的一些优化,因为在RHS中可以通过LHS完成工作来区分规则。

“列表”的内容因许多类似的规则而异。有一个更好的方法吗?我无法想象LAN数据库调用会更快。

1 个答案:

答案 0 :(得分:1)

这可以简单地重写为:

rule "ruleX"
when
    MyObject( string in ("ABC", "DEF") ) 
then
    //do stuff
end

请注意in之后的列表也可能包含(以前)绑定变量。

如果你有一个集合中的值,你也可以写

rule "ruleY"
when
    Data( $los: listOfStrings )
    MyObject( string memberOf $los ) 
then
    //do stuff
end
rule "ruleY"
when
    MyObject( $s: string ) 
    Data( listOfStrings contains $s )
then
    //do stuff
end

如果可以从某个地方(例如数据库)提取列表并将其包装到合适的事实中,以便预先插入,那么这可能更为可取。

请注意,Drools参考手册中详细记录了技术细节。