"if then else "with rule engines

21,178

Solution 1

By nature the Rete engine looks for positive matches, so yes you will need multiple rules, one for each condition check in your if-then-else block. Your first example is cleaner and more intuitive, I would go with that.

As an alternative, if you are processing a simple logic negation (if-else) where your variables value matches the conditional, then you can use just one rule:

rule "test"
where 
  $o: Object()
then 
  $o.a = (! Condition);
end

Solution 2

Remember that a Rule engine is not a IF/ELSE container only. You are changing from the imperative approach of if(condition){} else {} to a declarative approach where you are letting the engine to decide and evaluate the rules based on the context (facts) that you have in your working memory.

Having two rules is fine, but what exactly are you trying to achieve? depending the Object structure and the business logic that you want to implement there are several ways to solve different problems. Can you give us more details about what do you want to achieve? Cheers

Share:
21,178
Ricky Bobby
Author by

Ricky Bobby

Updated on November 04, 2020

Comments

  • Ricky Bobby
    Ricky Bobby over 3 years

    I'm new to drools and given a condition (Condition) and a boolean variable "a" , I would like to create the following rule with drools :

    if (Condition)
       { 
        a = true;
       }
    else
       {
        a = false;
       }
    

    What is the best way to do it ?

    For the time being I have 2 options :

    1.Create 2 rules with Condition and not contidition (If ... then ... , If not ... then ...)

    rule "test"
    where
      $o: Object( Condition)
    then 
      $o.a = true;
    end
    
    
    rule "test2"
    where
      $o: Object( not Condition)
    then 
      $o.a = false
    end
    

    2.Set the variable a to false by default and then fire the rule

    rule "test"
    no loop
    salience 100
    where 
      $o: Object()
    then 
      $o.a = false;
    end
    
    
    rule "test"
    where
      $o: Object( not Condition)
    then 
      $o.a = true;
    end