[rules-users] User and/or Code problem with insert/retract and salience
Jared Davis
sunray at davisprogramming.com
Tue Mar 30 12:58:22 EDT 2010
I've narrowed it down to a smaller example. The order of insertion seems to
trump the rule salience.
The following rule inserts 4 objects. Inserted as A4,A3,A2,A1 the rules
sequence is unexpected. Inserted A1,A3,A4,A2 they fire as expected.
rule "setup.two"
when
then
> // generates out of salience rule execution
> insert (new RuleLink("A4", new Double(65), null));
> insert (new RuleLink("A3", new Double(70), null));
> insert (new RuleLink("A2", new Double(65), null));
> insert (new RuleLink("A1", new Double(70), null));
>
> /* // works ok
> insert (new RuleLink("A1", new Double(70), null));
> insert (new RuleLink("A3", new Double(70), null));
> insert (new RuleLink("A4", new Double(65), null));
> insert (new RuleLink("A2", new Double(65), null));
> */
end
Here are 3 of the 6 identical LHS rules differing only by salience
(70,65,60,55,50,0):
rule "a70"
salience 70
when
> link: RuleLink( linkName: name matches "A.", d : aasDouble)
> RuleLink( name == "SKINS", partsO : a)
then
> System.out.println("START 070 " + d);
> if ( d > 69.9) {
> System.out.println(drools.getRule().getName() + " retract " +
> linkName);
> retract(link);
> } else {
> System.out.println(drools.getRule().getName() + " no retract " +
> linkName);
> }
end
rule "a65"
salience 65
when
> link: RuleLink( linkName: name matches "A.", d : aasDouble)
> RuleLink( name == "SKINS", partsO : a)
then
> System.out.println("START 065 " + d);
> if ( d > 64.9) {
> System.out.println(drools.getRule().getName() + " retract " +
> linkName);
> retract(link);
> } else {
> System.out.println(drools.getRule().getName() + " no retract " +
> linkName);
> }
end
rule "a60"
salience 60
when
> link: RuleLink( linkName: name matches "A.", d : aasDouble)
> RuleLink( name == "SKINS", partsO : a)
then
> System.out.println("******* ERROR ************");
> System.out.println("START 060 " + d);
> if ( d > 59.9) {
> System.out.println(drools.getRule().getName() + " retract " +
> linkName);
> retract(link);
> } else {
> System.out.println(drools.getRule().getName() + " no retract " +
> linkName);
> }
end
// One more setup rule
rule "setup.one"
when
then
> List skinParts = new ArrayList();
> insert (new RuleLink("SKINS", skinParts, null));
end
Here is the test run:
START 070 70.0
a70 retract A1
START 070 65.0
a70 no retract A2
START 070 70.0
a70 retract A3
START 070 65.0
a70 no retract A4
START 065 65.0
a65 retract A2
******** ERROR ********
START 060 65.0
a60 retract A4
A4 never ran rule 065. It skipped to rule 060 from 070.
The error is very sensitive to other rules in the package.
Is this the expected behavior?
(I would like to keep the reasons for a branch on the RHS vs an eval on the
LHS out of this discussion.)
--
View this message in context: http://n3.nabble.com/User-and-or-Code-problem-with-insert-retract-and-salience-tp685963p686283.html
Sent from the Drools - User mailing list archive at Nabble.com.
More information about the rules-users
mailing list