[rules-users] some basic questions to grouping

Edson Tirelli tirelli at post.com
Tue Aug 19 09:14:48 EDT 2008


1. when you are saying "rules fire", does this mean: matching/checking the
LHS of rule, or executing the RHS of rule

Means execute the RHS. The LHS of the rules is evaluated at "assert time".
Take a look at the docs for more info on that.

2. I plan to use the grouping features of drools, but still not sure..

First a quick explanation:
* agenda-groups allow you to control in what order rules are **fired**,
because only rules from the active agenda-group are allowed to fire.
* activation-groups allow you to create mutually exclusive rules, because
when a rule in an activation-group **fires**, it cancel all other
activations in the same group.

None of it is what you want. In fact, you should not worry about the cases
you described. Just write your patterns and constraints in the same order as
much as possible, and also always write more constraining patterns  before
the more general patterns and let the engine do its magic.

If you have 1 rule where gender is Gender.MALE, and 1000 rules where it is
Gender.FEMALE and you assert a male (or female, dos not matter) Person, the
engine will execute the condition only twice, because it shares the
Gender.FEMALE constraint among all the rules, assuming you write the
constraints in the same order. An even more interesting situation is:
pretend you have some kind of discriminating attribute for person, like
countryOfBirth, and you have 100 rules for each country that you have to
handle (lets say 100). So, you have 100 x 100 = 10000 rules:

Rule x1 when Person( countryOfBirth == Country.CANADA...
...
Rule x500 when Person( countryOfBirth == Country.BRAZIL...
...

Guess how many times that condition will be executed for a Person whose
country is CANADA (or any other country, does not matter)? Only **once**,
because of an optimization called alpha hashing.

Now range conditions are not hashed, but they still have node sharing, so as
long as you write them in the same order, they are still optimized. The only
problem you will have is if you start using accumulate and collect, that are
really expensive in terms of performance. In cases like that, you will need
a manual optimization, but it is still doable.

   Hope it helps.

         Edson


2008/8/19 psentosa <psentosa at yahoo.com>

>
> Hi,
>
> I'm having some difficulty to understand the concept of grouping, but maybe
> it's only because of my understanding of the terms, so please apologize for
> the silly question
> 1. when you are saying "rules fire", does this mean: matching/checking the
> LHS of rule, or executing the RHS of rule
>
> 2. I plan to use the grouping features of drools, but still not sure
> whether(and how) to use the agenda or activation group (or even the
> rule-flow). My problem domain is actually quite simple:
> - rules are applied based on e.g age of a person. Now, there are some rules
> for 17-year-or older, and some for 30-year-old person, if I'm to use the
> agenda group, I'd define the following:
>
> rule1
> agenda-group "17 years-old or older"
> when
>     p:Person (Age > 17)
> ....
>
> rule2
> agenda-group "17 years-old or older"
> when
>     p:Person (Age > 17)
> .....
>
> rule3
> agenda-group "30 years-old or older"
> when
>     p:Person (Age > 30)
> ......
>
> rule4
> agenda-group "30 years-old or older"
> when
>     p:Person (Age > 30)
> ......
>
> If I assert a person into the WM to check his/her age, I want that only the
> rules in 30-years-old agenda are CHECKED (and eventually executed when the
> other constraints are fulfilled), bcs they are surely older than 17 as
> well.
> And this is not only for comparing ages. Another example, some rules are
> only for Gender.MALE, and some only for Gender.FEMALE. So if a person is
> asserted, only the rules with corresponding gender will be checked and no
> need of checking/matching the other group
> The main purpose is just to skip checking unrelevant rules (imagine if
> there
> is only 1 rule for MALE and 1000 rules for FEMALE with 1000 times WHEN
> person (gender == FEMALE) checking for an asserted male-object).
> How can I do this effectively? Or will ALL rules checked and only the order
> of checking (and eventually exection of their RHS) is defined by the
> grouping?
>
> I hope I've described my problem clearly and I'll try to explain this again
> in case of difficulty :)
> Thanks in advance
>
> Regards
>
>
> --
> View this message in context:
> http://www.nabble.com/some-basic-questions-to-grouping-tp19048066p19048066.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, a division of Red Hat @ www.jboss.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20080819/faba2817/attachment.html 


More information about the rules-users mailing list