[jboss-jira] [JBoss JIRA] Updated: (JBRULES-966) update(fact) in 2 rules dont check for other updated facts - a loop is created
Edson Tirelli (JIRA)
jira-events at lists.jboss.org
Tue Jul 3 20:17:51 EDT 2007
[ http://jira.jboss.com/jira/browse/JBRULES-966?page=all ]
Edson Tirelli updated JBRULES-966:
----------------------------------
Priority: Blocker (was: Major)
> 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
>
> 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