[rules-users] some basic questions to grouping

Kris Nuttycombe kris.nuttycombe at gmail.com
Tue Aug 19 11:54:05 EDT 2008


Thanks for your very informative reply, Edson! I hadn't picked up on
the significance of stating conditions in the same order from the
Drools documentation.

Kris

On Tue, Aug 19, 2008 at 7:14 AM, Edson Tirelli <tirelli at post.com> wrote:
>
> 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
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
>



More information about the rules-users mailing list