2016-09-29 2 views
0

Ich habe einen Großteil der Drools Regeln mit den ähnlichen when Teile. Z.B.Wiederverwendung Teil von Drools `when` Anweisung

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 

Ist es möglich, diese Aussage einmal zu definieren

not ConfirmEvent (
    processMessageId == trn.groupId) 

und irgendwie wieder verwenden, wo nötig?

Antwort

2

Zwei Ansatz Ideen:

  1. die Regel verwenden „extends“ mit jeder Regel Schlüsselwort eine Grundregel enthält, die gemeinsam benutzten, wenn Aussagen zu verlängern.

  2. Erstellen Sie eine Regel mit den gemeinsamen Anweisungen when, die auf eine Tatsache schließen ("extract rule"). Verwenden Sie diese Tatsache in den Bedingungen der Regeln, die die gemeinsamen Bedingungen benötigen. Diese Option ist normalerweise mein bevorzugter Ansatz, da sie ein "Konzept" (eine benannte Tatsache) für diese Bedingungen definiert und nur einmal für jede Regel auswertet.

    Regel Beispiel für # 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 
    
+0

Könnten Sie, pls, die zweite Idee erklären und es mit etwas Frieden des Codes (Regeln) veranschaulichen? –

+0

Zu meiner Antwort hinzugefügt. – Jeff

+0

danke für das Beispiel! –

1

Es sollte offensichtlich sein, dass die not CE ist nicht gültig, da es sich auf einige trn bezieht. Aber da die trn von einem anderen CE eingeführt wird, können Sie erstreckt sich auf ihre Kombination verwenden basiert:

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 

und so weiter, für Rule 2 und andere.