当一个人使用 "in" 运算符时,drools 事实检查是什么(何时)return
What does a drools fact check (when) return when one uses the "in" operator
我有以下规则
rule One
when
vg1 : Vgdoc(code() in ("IA1003", "IA1004"), colour == "red")
then
.. do something with vg1
end
当我在 then 子句中使用 vg1 时,我看到它代表一个对象,但如果两个 ("IA1003"、"IA1004") 都存在怎么办?流口水只发送第一个还是两个?如果它同时发送了我如何检查它。
是否可以对
做这样的事情
vglist : List() from collect (Vgdok(code() in ("IA1003", "IA1004")))
如果内存中存在这两个事实,此列表是否会包含这两个事实?
干杯
es
您的规则将命中工作记忆中匹配的每个项目。
为简化起见,假设您的模型如下所示:
class Vgdoc {
public String getCode() { ... }
public String getColour() { ... }
}
你的规则就像你拥有的一样,语法更正:
rule "One"
when
vg1: Vgdoc( code in ("IA1003", "IA1004"),
colour == "red" )
then
Systen.out.println("Rule 1 fired");
end
并且您在工作内存中有对象:
Vgdoc{ code: "IA1003", colour: "red" } // A
Vgdoc{ code: "IA1004", colour: "red" } // B
Vgdoc{ code: "IA1005", colour: "red" } // C
Vgdoc{ code: "IA1003", colour: "blue" } // D
那么您的规则将触发两次,一次针对我评论为“A”的项目,一次针对我评论为“B”的项目。 (例如,将打印 Rule 1 fired
的两个实例。)它不会触发注释为“C”的项目,因为代码不匹配,也不会触发注释为“D”的项目,因为颜色字段匹配不匹配。
现在,如果您只想触发一次并使用符合条件(颜色 'red' 和代码 'IA1003' 的所有 Vgdoc 的 集合 ] 或 'IA1004'),那么是的,您将使用收集。像这样:
rule "IA1003 and IA1004 with red"
when
vgList: List() from collect( Vgdoc( code in ("IA1003", "IA1004"), colour == "red" ))
then
System.out.println("Rule fired, match count: " + vgList.size());
// vgList will contain all items that match the conditions for code and colour
end
这个版本的规则,与之前的输入相同,将恰好触发一次并打印:Rule fired, match count: 2
.
您选择使用哪一个取决于您的用例。
我有以下规则
rule One
when
vg1 : Vgdoc(code() in ("IA1003", "IA1004"), colour == "red")
then
.. do something with vg1
end
当我在 then 子句中使用 vg1 时,我看到它代表一个对象,但如果两个 ("IA1003"、"IA1004") 都存在怎么办?流口水只发送第一个还是两个?如果它同时发送了我如何检查它。
是否可以对
做这样的事情vglist : List() from collect (Vgdok(code() in ("IA1003", "IA1004")))
如果内存中存在这两个事实,此列表是否会包含这两个事实?
干杯
es
您的规则将命中工作记忆中匹配的每个项目。
为简化起见,假设您的模型如下所示:
class Vgdoc {
public String getCode() { ... }
public String getColour() { ... }
}
你的规则就像你拥有的一样,语法更正:
rule "One"
when
vg1: Vgdoc( code in ("IA1003", "IA1004"),
colour == "red" )
then
Systen.out.println("Rule 1 fired");
end
并且您在工作内存中有对象:
Vgdoc{ code: "IA1003", colour: "red" } // A
Vgdoc{ code: "IA1004", colour: "red" } // B
Vgdoc{ code: "IA1005", colour: "red" } // C
Vgdoc{ code: "IA1003", colour: "blue" } // D
那么您的规则将触发两次,一次针对我评论为“A”的项目,一次针对我评论为“B”的项目。 (例如,将打印 Rule 1 fired
的两个实例。)它不会触发注释为“C”的项目,因为代码不匹配,也不会触发注释为“D”的项目,因为颜色字段匹配不匹配。
现在,如果您只想触发一次并使用符合条件(颜色 'red' 和代码 'IA1003' 的所有 Vgdoc 的 集合 ] 或 'IA1004'),那么是的,您将使用收集。像这样:
rule "IA1003 and IA1004 with red"
when
vgList: List() from collect( Vgdoc( code in ("IA1003", "IA1004"), colour == "red" ))
then
System.out.println("Rule fired, match count: " + vgList.size());
// vgList will contain all items that match the conditions for code and colour
end
这个版本的规则,与之前的输入相同,将恰好触发一次并打印:Rule fired, match count: 2
.
您选择使用哪一个取决于您的用例。