Uploaded image for project: 'JBRULES'
  1. JBRULES
  2. JBRULES-966

update(fact) in 2 rules dont check for other updated facts - a loop is created

This issue belongs to an archived project. You can view it, but you can't modify it. Learn more

    XMLWordPrintable

Details

    • Bug
    • Resolution: Done
    • Blocker
    • 4.0.0.GA
    • 4.0.0.MR3
    • drools-core (expert)
    • None

    Description

      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...

      Attachments

        Activity

          People

            etirelli@redhat.com Edson Tirelli
            thesilversurfer_jira Felipe Piccolini (Inactive)
            Archiver:
            rhn-support-ceverson Clark Everson

            Dates

              Created:
              Updated:
              Resolved:
              Archived:

              PagerDuty