重复使用部分Drools`of`陈述

时间:2016-09-29 20:15:55

标签: java drools

我有大量的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 )

并在需要的地方重复使用?

2 个答案:

答案 0 :(得分:3)

两种方法:

  1. 使用规则" extends"每个规则的关键字,用于扩展包含共享when语句的基本规则。

  2. 使用共享的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和其他人。