Drools:在规则的 LHS 中匹配数组中的本地字符串
Drools: Match local string from array in LHS of rule
我正在尝试创建规则,在其中检查字符串是否在我规则的 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 区分规则。
"list" 的内容因许多类似规则而异。有一个更好的方法吗?我无法想象 LAN 数据库调用会更快。
这可以简单地重写为:
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 参考手册中详细记录了技术细节。
我正在尝试创建规则,在其中检查字符串是否在我规则的 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 区分规则。
"list" 的内容因许多类似规则而异。有一个更好的方法吗?我无法想象 LAN 数据库调用会更快。
这可以简单地重写为:
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 参考手册中详细记录了技术细节。