Although I noticed the other day that this is not documented yet, Drools 5.0.x does support rule inheritance. In your case, it would be written as:
rule r1
when
A()
then
// do something
end
rule r2 extends r1
when
B()
then
// do something else
end
When using inheritance, the subrule will inherit the whole LHS of the parent rule.
Integration test here:
http://anonsvn.jboss.org/repos/labs/labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/extend_rule_test.drl
http://anonsvn.jboss.org/repos/labs/labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_RuleExtend.drl
In your case, you have an extra requirement that if a child rule fires, you don't want the parent rule to fire. My suggestion is either doing this with a logical condition, or adding drools.halt() on the consequence of rules that should stop subsequent firings, or using activation-groups + salience. Example, in the above case, you could have:
rule r1
activation-group "example rules"
salience 10
when
A()
then
// do something
end
rule r2 extends r1
activation-group "example rules"
salience 20
when
B()
then
// do something else
end
Since rule 2 has a higher salience, if it activates it will fire first, and due to the activation-group, it will cancel the activation of r1 preventing it to fire.
Hope it helps.
Edson
2010/3/5 malkhafaji
<moe.alkhafaji@medcpu.com>
Hello,
I know, from searching this forum and posting before, that the concept of
inheritance does not exist today in Drools. However, I have a need for it.
Here is my specific situation:
I have certain rules that have some generic conditions to be fired:
Rule 1
If A Then X end
Rule 2
If A, B Then Y end
What I would like to do is, if Rule 2 is true, then I don't want Rule 1 to
execute. I have many and many of those rules, so combining all the
conditions in less number of rules violates our design having rules being
mutually exclusive. That is why I wanted to include this behavior as a
natural inheritance behavior rather than forcing the flow with logic inside
the rule itself (you will make rules aware of others this way).
So, since there is not built-in feature that allows you to do that, do
people suggest anything that I can do without having to mix Rule 1 and Rule
2 into one rule with complex conditional statements? Any ideas?
The only thing I can think of is taking this logic processing outside of
drools, which is something that I am not too excited about.
Thanks.
--
View this message in context: http://n3.nabble.com/Inheritance-Like-Design-Question-tp430848p430848.html
Sent from the Drools - User mailing list archive at Nabble.com.
_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users
--
Edson Tirelli
JBoss Drools Core Development
JBoss by Red Hat @ www.jboss.com