[jboss-jira] [JBoss JIRA] Created: (JBRULES-966) update(fact) in 2 rules dont check for other updated facts - a loop is created

Felipe Piccolini (JIRA) jira-events at lists.jboss.org
Tue Jul 3 15:28:12 EDT 2007


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: Mark Proctor


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: http://jira.jboss.com/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        



More information about the jboss-jira mailing list