Apologies if this question has been addressed before.
We generate our Drools rules automatically from a business rules repository 
we've had here for years.

Currently, our code generator is doing something I'd rather not have to do - it 
inspects assignments on the RHS and inserts "anti-recursion" logic into the LHS.
This leads to rules like the following:

        rule "RS6631.1.2"
        no-loop true
        dialect "mvel"
        when
                $policySet : PolicySet
                (
                        marketType == MarketTypeEnum.FHA
# anti-recursion logic derived from assignments in action section
                        , isSetSelectedDecisionIndicator == false
                                || selectedDecisionIndicator != true
# end anti-recursion logic
                )
        then
                modify($policySet)
                {
                        selectedDecisionIndicator = true
                };
end

Notice the two lines between the comments - the code generator has analyzed the 
assignment on the RHS and has inserted this defensive logic in order to prevent 
(possibly infinite) re-firings of this rule anytime other rules also update the 
PolicySet object. This approach does not work in all scenarios, however, and 
there is an occasional struggle by our rule analysts to find ways to suppress 
the loops caused by rule "A" updating an object versus rule "B" updating the 
same object, even when the attributes changed by the two rules are different.

The root issue, I believe, is that the modify and update require fact handles 
that refer to whole objects, not to individual attributes of those objects. 
When an attribute value is updated, my intuition suggests that only the new 
value of that attribute should be propagated through the network, not the whole 
object. Re-propagating the entire object causes all rules that have already 
fired to be reactivated, since their conditions are still true. All we really 
want is that the rules whose conditions NEWLY match both the unchanged 
attributes and the changed attributes should be activated, not rules that 
matched previously on the unchanged attributes and whose CE's or constraints 
have not been affected by the change.

I've seen several conversations on this list about how to prevent infinite 
loops.  "No-loop" only seems to work within the context of the current rule. 
Two rules that update an object, even if their changes are to non-overlapping 
attributes, cause each other to be reactivated in the absence of some defensive 
logic like that shown above. "Lock-on-active" doesn't appear to achieve the 
goal either, because it suppresses firings that might in fact be desired.

Feel free to educate me if my limited understanding is showing here.

But does anyone know of a way to tell the Drools engine to only propagate the 
attributes that have changed, and not the entire object?



Tom Murphy
Wells Fargo HCFG - CORE Deal Decisioning Platform


_______________________________________________
rules-users mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/rules-users

Reply via email to