我有大量的Drools规则与类似的when
部分。 E.g。
rule "Rule 1"
when
trn: TransactionEvent()
// some `trn` related statements
not ConfirmEvent (
processMessageId == trn.groupId )
then
// some actions
end
rule "Rule 2"
when
trn: TransactionEvent()
// some other `trn` related statements
not ConfirmEvent (
processMessageId == trn.groupId )
then
// some other actions
end
是否可以定义一次这个陈述
not ConfirmEvent (
processMessageId == trn.groupId )
并在需要的地方重复使用?
答案 0 :(得分:3)
两种方法:
使用规则" extends"每个规则的关键字,用于扩展包含共享when语句的基本规则。
使用共享的when语句创建一个规则来推断事实("提取规则")。在需要共享条件的规则的when条件中使用该事实。这个选项通常是我首选的方法,因为它定义了一个"概念" (一个命名事实)对于这些条件,并且每个规则只评估一次。
#2的规则示例:
rule "Transaction situation exists"
when
trn: TransactionEvent()
// some `trn` related statements
$optionalData : // bind as wanted
not ConfirmEvent (
processMessageId == trn.groupId )
then
InferredFact $inferredFact = new InferredFact($optionalData);
insertLogical($inferredFact);
end
rule "Rule 1"
when
InferredFact()
AdditionalCondition()
then
// some actions
end
rule "Rule 2"
when
InferredFact()
OtherCondition()
then
// some other actions
end
答案 1 :(得分:2)
很明显,not
CE本身无效,因为它引用了一些trn
。但由于trn
是由另一个CE引入的,因此您可以根据它们的组合使用扩展:
rule "Commont TE + not CE"
when
trn: TransactionEvent()
not ConfirmEvent ( processMessageId == trn.groupId )
then
end
rule "Rule 1" extends "Commont TE + not CE"
when
// some `trn` related statements
then
//...
end
依此类推,适用于Rule 2
和其他人。