Hehe, ok, lets try to clarify then. In your example, you have 2 rules. Assuming your are *not* using any kind of grouping, when you insert the message with status HELLO, then engine knows that only the first rule is eligible to execute, and so the engine fires it. The consequence of rule 1 changes the message status, making rule 2 eligible and so it fires in sequence. That is called rule chaining, and that is how forward chaining engines like drools work and do inference. So, in that simplistic example, if you go simple (as in not using groups), the engine is smart enough to figure out what to do.
Now, real use cases can be modeled like that and implemented using a few tricks like control facts and it will work. Although, that would miss the point of being a declarative platform for behavior modeling. So, Drools introduced a few ways to coordinate the execution of rule groups, namely agenda-groups, ruleflow-groups and activation-groups. Whenever you *explicitly* set one of these attributes in the rule, you are telling the engine:
"- I know what I am doing. Do as you are told and don't try to be smart."
That is why, the setFocus() methods define the order in which elements are placed into the stack and it will execute them in the given FIFO (stack semantic) order, or not execute them at all. So:
* agenda-groups: uses stack semantics, as you quoted in your first e-mail. The stack starts with the MAIN agenda-group, and every time you call setFocus() from the application code *or* from a rules consequence *or* a rule with auto-focus true is activated, it will push that group on top of the stack. This is extremely useful for cases like exception handling (not *java* exception, more like "exceptional cases") among other situations. It can also emulate "sub-procedure" semantics, where a given reasoning cycle is paused while another reasoning cycle is called and when that finishes, it comes back to he original reasoning cycle and continues.
* ruleflow-group: uses workflow semantics, where you define a sequential flow/process and each step is executed in sequence. This is a much easier way to model sequencing, and specially useful for process-like or phased execution. The modeling is also visual, making it easier for users to deal with.
* activation-group: it tells the engine that the rules in that group are mutually exclusive and whenever one of them fires, it automatically cancels the activations of all other rules in the same group. I personally don't like this one and always avoid it when authoring rules, but it is there for those that want to use the feature.
Whenever you use any of these controls, you are telling the engine to comply with their semantics. That is why I thought your comment on "jeopardizing developer intentions" was funny, but I meant no disrespect. One thing is to admit you are not understanding something. I different thing is to criticize something you don't understand. I always tell users to start simple: try letting the engine figure out which rules to fire and which order. If that does not work for you, then look for alternatives. One can do extremely sophisticated models by mixing the above groups in the same rule, but you need to know what you are doing or things might not result in the way you expected them to be.
Edson
2010/1/21 Pritam
<infinity2heaven@gmail.com>
If you're curious how a Stack is implemented in Java, C or C++, have a look
at the method names: push, pop etc., There's a reason why the names are
push, pop and not setXXX.
It's not a good design where an operation with a method signature that
resembles a standard javabean accessor like setXXX hides a stack
implementation behind it, without documentation. Drools api doesn't even
have a javadocs for
http://downloads.jboss.com/drools/docs/5.0.1.26597.FINAL/apidocs/index.html
AgendaGroup setFocus and clear().
I'm curious about the ordering based on groups, since I've built a html
render engine that defers a part of the render process to a rules provider
and the input the rules provider (drools) is a URL which abstracts different
sections, sub sections and page. I need the rules to be applied to each of
this separately and override it as well.
If you're interested to solve a real problem, I'd appreciate.
--