"if then else "with rule engines

Ricky Bobby picture Ricky Bobby · Nov 3, 2011 · Viewed 19.6k times · Source

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

Answer

Perception picture Perception · Nov 3, 2011

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