]
Edson Tirelli closed JBRULES-966.
---------------------------------
Fix Version/s: 4.0.0.MR4
Resolution: Done
Special shadow proxies are now implemented for collections and maps, avoiding problems
like this.
Thank you for reporting and let us know if you face any other problem.
update(fact) in 2 rules dont check for other updated facts - a loop
is created
------------------------------------------------------------------------------
Key: JBRULES-966
URL:
http://jira.jboss.com/jira/browse/JBRULES-966
Project: JBoss Rules
Issue Type: Bug
Security Level: Public(Everyone can see)
Components: Reteoo
Affects Versions: 4.0.0.MR3
Environment: tested on eclipse 3.2, JBossRules 4.0MR3, OS Mac OSX 10.4.10
Reporter: Felipe Piccolini
Assigned To: Edson Tirelli
Priority: Blocker
Fix For: 4.0.0.MR4
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...
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: