Details
-
Bug
-
Resolution: Done
-
Blocker
-
4.0.0.MR3
-
None
Description
When using update in 2 rules that update the same object... a loop is created even when trying to
avoid the loop adding an extra condition to each rule inserting an ArrayList as a fact too, so each rule should not be
evaluated again...
//------RULES----------------------------
package org.drools.test
#list any import classes here.
import java.util.List
import java.util.ArrayList
import cl.bluesoft.test.rules.Fact
#declare any global variables here
rule "test update A"
salience 699
no-loop
when
$f : Fact($n: number > 0)
$list: ArrayList( this excludes "key1")
then
System.out.println("A-fact number1:"$f.getNumber()" list 1:"+$list);
$list.add("key1");
$f.setNumber($n + 1);
update ($f);
update ($list);
System.out.println("A-fact number2:"$f.getNumber()" list 2:"+$list);
end
rule "test update B"
salience 699
no-loop
when
$f : Fact($n: number > 1)
$list: ArrayList( this excludes "key2")
then
System.out.println("B-fact number1:"$f.getNumber()" list 1:"+$list);
$list.add("key2");
$f.setNumber($n + 1);
update ($f);
update ($list);
System.out.println("B-fact number2:"$f.getNumber()" list 2:"+$list);
end
//------FACT----------------------------
public class Fact implements Serializable {
private static final long serialVersionUID = 331627137981862975L;
private int number;
public Fact(int number)
{ this.number = number; }public Fact()
{ this(0); }/**
- @return the number
*/
public int getNumber() { return number; }
/**
- @param number the number to set
*/
public void setNumber(int number) { this.number = number; }
}
//-----TEST--------
public class TestUpdateFact implements Serializable {
private static final long serialVersionUID = -574789596641083743L;
/**
- @param args
*/
public static void main(String[] args) { RuleBase ruleBase = RuleBaseFactory.newRuleBase(); Package pkg = builder.getPackage(); .... WorkingMemory session = ruleBase.getStatefulSession(); ...etc etc... List list = new ArrayList(); Fact fact1 = new Fact(1); session.insert(fact1 false); session.insert(list, false); session.fireAllRules(); session.dispose(); }
}
//-------OUTPUT-----------
A-fact number1:1 list 1:[]
A-fact number2:2 list 2:[key1]
B-fact number1:2 list 1:[key1]
B-fact number2:3 list 2:[key1, key2]
A-fact number1:3 list 1:[key1, key2]
A-fact number2:4 list 2:[key1, key2, key1]
B-fact number1:4 list 1:[key1, key2, key1]
B-fact number2:5 list 2:[key1, key2, key1, key2]
A-fact number1:5 list 1:[key1, key2, key1, key2]
A-fact number2:6 list 2:[key1, key2, key1, key2, key1]
B-fact number1:6 list 1:[key1, key2, key1, key2, key1]
B-fact number2:7 list 2:[key1, key2, key1, key2, key1, key2]
A-fact number1:7 list 1:[key1, key2, key1, key2, key1, key2]
A-fact number2:8 list 2:[key1, key2, key1, key2, key1, key2, key1]
B-fact number1:8 list 1:[key1, key2, key1, key2, key1, key2, key1]
.... for ever.....
So a loop is created... only when I use update and both rules... condition about the
list not containing "key1" and "key2" seems not properly chequed...