[rules-users] Inheritance-Like Design Question

Edson Tirelli ed.tirelli at gmail.com
Fri Mar 5 12:45:29 EST 2010


      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 at 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 at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>



-- 
 Edson Tirelli
 JBoss Drools Core Development
 JBoss by Red Hat @ www.jboss.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20100305/762a9b9b/attachment.html 


More information about the rules-users mailing list