]
David Hill commented on JBRULES-966:
------------------------------------
I am experiencing the same error on the latest Drools 4.0.7
I wrapped an immutable Double inside of another object so I could mutate it as well as
have a distinct class name to match rules on. From the java code I put a single one of
these objects into the facts, then two different rules try to add to the value of this
fact. The rules are both marked no-loop and activation-group with unique group names. When
I use the update command in the two rules they bounce back and forth forever, when I
don't use the update then other LHS when conditions based on this number do not get
evaluated.
public class Score {
private Double score;
public Score(Double score){
this.score = score;
}
public void add(Double value){
this.score += value;
}
public String toString() {
return "score=" + score;
}
public Double getScore() {
return score;
}
}
rule "bootstrap1"
salience 100
activation-group "boot1"
no-loop
when
... some stuff ...
$s : Score();
then
$s.add(1.23);
update($s);
System.out.println("score initialized to " + $s.getScore());
end
rule "#1 whatever"
activation-group "#1"
salience 99
no-loop
when
... some stuff ...
$s : Score();
then
$s.add($c1.getValue() / 14.0);
update($s);
System.out.println("score updated to " + $s);
end
update(fact) in 2 rules dont check for other updated facts - a loop
is created
------------------------------------------------------------------------------
Key: JBRULES-966
URL:
https://jira.jboss.org/jira/browse/JBRULES-966
Project: JBoss Drools
Issue Type: Bug
Security Level: Public(Everyone can see)
Components: drools-core (expert)
Affects Versions: 4.0.0.MR3
Environment: tested on eclipse 3.2, JBossRules 4.0MR3, OS Mac OSX 10.4.10
Reporter: Felipe Piccolini
Assignee: Edson Tirelli
Priority: Blocker
Fix For: 4.0.0.GA
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: