[rules-users] Infinite Recursion, with no-loop also
Arjun Dhar
dhar_ar at yahoo.com
Wed Aug 22 00:13:57 EDT 2007
Hi,
This problem needs to be solved conceptually before technically.
Assuming (I can't use Agenda Groups in decision tables).
SUMMARY
-------
Some rules evaluate some logic and pass it to a rule which aggregates the logic
to give the final outcome. Now that requires use of update. (or insert)
Before I get into the details as I usually do; one quick Question:
Q) Are recursion a result of update() or can they be caused by insert()???
because i have an alternative hypothesis using insert() (described in my
solution section)
DETAILS
--------
So exact scenario in 'Rules' is below; and this causes infinite-recursion.
Note: I've solved it but I'm looking for something more sophisticated or clean.
My current solution is written below after the problem is described in rules.
rule "Main"
no-loop true
when
cntct: Contact(initialized==true)
eval(cntct.extendedProperty("Table1_Output",true) ==true)
then
...
end
# setExtendedProperty = hashMap
rule "Rule_1"
no-loop true
when
cntct: Contact(initialized==true)
cfg_tab1: BooleanConfiguration(value!=false, param=="x1")
then
cntct.setExtendedProperty("Table1_Output", false);
...
update(cntct);
end
rule "Rule_2"
no-loop true
when
cntct: Contact(initialized==true)
cfg_tab2: BooleanConfiguration(value!=false, param=="x2")
then
cntct.setExtendedProperty("Table2_Output", false);
...
update(cntct);
end
rule "Rule_3"
no-loop true
when
cntct: Contact(initialized==true)
cfg_tab3: BooleanConfiguration(value!=false, param=="x3")
then
cntct.setExtendedProperty("Table3_Output", false);
...
update(cntct);
end
-----------------------
My solution: take one of the rules:
rule "Rule_3"
no-loop true
when
cntct: Contact(initialized==true)
cfg_tab3: BooleanConfiguration(value!=false, param=="x3")
## Line below filters & restrcits the execution to once only per table ##
eval(cntct.extendedProperty("Table1_Output",true) ==true)
then
cntct.setExtendedProperty("Table3_Output", false);
...
update(cntct);
end
Criticism of my own solution:
1. This solution, will only allow one rule to fire per table (For each rule 1,
there is a table of rules like rule 1, similarly for rule 2 type rules there is
a table if you just play with true and false values in those rules)?
Even with Agenda-Groups; again how do you do an update() once you know the
rules of the agenda have all fired??? Can we program that in the rules itself??
2. Can i use insert instead of update(cntct) and insert another Object into
working memoy and evaluate that as part of a condition to prevent recursion?
I feel adding conditions to control activations and sequence as a path of long
term confusion, so can you please provide a more sophisticated approach or re-
evaluate my approaches to the least?
Thanks,
Arjun
More information about the rules-users
mailing list