我和Drools一起开始了一个项目。我的项目的drl文件看起来像:
rule "Rule 1"
when
Item( id > 100)
// consequence implementation
rule "Rule 2"
when
Item( type == "phone")
// consequence implementation
rule "Rule 3"
when
Item( screenSize == 5)
// consequence implementation
rule "Rule 4"
when
Item( branch == "motorola")
// consequence implementation
rule "Rule 5"
when
Item( price > 200)
// consequence implementation
当Drools跑步时,我有5个被解雇的规则。如果一个项目没有通过5个消防规则中的一个,我希望Drools会忽略其余4个被解雇的规则。 Drools是否具有我的目的?
另一个重要的事情是我的Drools与AgendaFilter一起运行。该功能是否支持AgendaFilter?
答案 0 :(得分:0)
首先,标题中的短语"其余规则"似乎表明您认为规则是按特定顺序评估的(例如,如文件中所写)。事实并非如此:没有订单。因此,如果规则#1和#2解雇(ìd > 0
和type == "phone"
)和screenSize != 5
,规则#4和规则#5仍然会触发,或它们可能已经触发烧制强>
要发现在规则1到5中引用类的某个事实是否参与了这些规则中的全部或部分规则,您必须创建自己的逻辑。例如,使用
声明一个类型/类class Marker {
Set<Integer> rules;
TheClassOfYourItem item;
//...
}
并将其与项目一起插入。然后,每个规则在触发时,将其编号添加到集合中。
规则&#34;规则1&#34; 什么时候 $ item:TheClassOfYourItem(...) $ m:Marker(item == $ item) 然后 $ m.add(1); 端
然后一个低显着性的规则可以检查该集合是否具有all / some / none元素。
由于一些评论,编辑:如果除非所有规则都可以触发,否则不会触发任何规则:只需将所有条件放入单个规则并合并所有后果。
rule "Rule 1-5"
when
Item( id > 100, type == "phone". screenSize == 5,
branch == "motorola", price > 200)
then
// ... Do what needs to be done if all five conditions are true
end