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

David Hill (JIRA) jira-events at lists.jboss.org
Sat Oct 25 22:50:20 EDT 2008


    [ https://jira.jboss.org/jira/browse/JBRULES-966?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12435484#action_12435484 ] 

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

        



More information about the jboss-jira mailing list