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

Rules with Collect / Accumulate CEs not working correctly when dinamically added to a rulebase

    XMLWordPrintable

    Details

      Description

      Reported by Dirk:
      --------------------------

      I have modified my application to allow adding/removing/updating rules during
      runtime. However, when I add a new rule to the rulebase, I don't get the
      behavior I expect.

      First, as soon as I call RuleBase.addPackage(), the new rules fire (the RHS code
      runs). Shouldn't that happen only when I call fireAllRules()?

      Second, newly added collect() rules don't collect already asserted objects. New
      non-collect rules can see the objects just fine.

      Attached is a testcase, and below is the output it produces. Am I doing
      something wrong, or is this a bug? I'm running Drools 4.0.3 on JDK 1.5.0.13.

      Start
      RuleBase created
      Adding rules about 'tom':
      package rules;
      import java.util.ArrayList;
      import test.Tester.Record;
      import test.Tester;
      rule "Collect tom"
      when
      $list : ArrayList(size > 0) from collect( Record(field1 == "tom") )
      then
      Tester.show($list, "Collect tom");
      end

      rule "Non collect tom"
      when
      $rec : Record( field1 == "tom" )
      then
      System.out.println("Find 'tom' " + $rec.dump());
      end

      inserting record 1:"tom",
      inserting record 2:"fred",
      inserting record 3:"harry",
      inserting record 4:"fred",
      inserting record 5:"ed",
      inserting record 6:"tom",
      inserting record 7:"sreeni",
      inserting record 8:"jill",
      inserting record 9:"ralph",
      inserting record 10:"tom",

      fireAllRules()
      Find 'tom' 10:"tom",
      'Collect tom' collected 3 records => 1:"tom", 6:"tom", 10:"tom",
      Find 'tom' 6:"tom",
      Find 'tom' 1:"tom",

      adding rules about 'fred':
      package morerules;
      import java.util.ArrayList;
      import test.Tester.Record;
      import test.Tester;
      rule "Collect fred"
      when
      $list : ArrayList(size > 0) from collect( Record(field1 == "fred") )
      then
      Tester.show($list, "Collect fred");
      end

      rule "Non collect fred"
      when
      $rec : Record( field1 == "fred" )
      then
      System.out.println("Find 'fred' " + $rec.dump());
      end

      ==> Why do the new rules fire when added?
      Find 'fred' 4:"fred",
      Find 'fred' 2:"fred",
      'Collect fred' collected 0 records =>
      ==> Why doesn't the collect rule collect? The non-collect rule works.
      fireAllRules()

      Changing record 3 to 'fred'
      fireAllRules()
      Find 'fred' 3:"fred",
      'Collect fred' collected 1 records => 3:"fred",
      ==> Why does the collect rule not see the other two 'fred' records?

        Gliffy Diagrams

          Attachments

            Issue Links

              Activity

                People

                • Assignee:
                  tirelli Edson Tirelli
                  Reporter:
                  tirelli Edson Tirelli
                • Votes:
                  0 Vote for this issue
                  Watchers:
                  0 Start watching this issue

                  Dates

                  • Created:
                    Updated:
                    Resolved: