Bug 777781 (SOA-297) - Rules with Collect / Accumulate CEs not working correctly when dinamically added to a rulebase
Summary: Rules with Collect / Accumulate CEs not working correctly when dinamically ad...
Keywords:
Status: CLOSED NEXTRELEASE
Alias: SOA-297
Product: JBoss Enterprise SOA Platform 4
Classification: JBoss
Component: JBoss Rules
Version: 4.2 Beta 1
Hardware: Unspecified
OS: Unspecified
high
high
Target Milestone: ---
: 4.2 Beta 2
Assignee: Fernando Meyer
QA Contact:
URL: http://jira.jboss.org/jira/browse/SOA...
Whiteboard:
Depends On:
Blocks:
TreeView+ depends on / blocked
 
Reported: 2008-01-09 13:14 UTC by Fernando Meyer
Modified: 2008-01-10 15:43 UTC (History)
0 users

Fixed In Version:
Doc Type: Bug Fix
Doc Text:
Clone Of:
Environment:
Last Closed: 2008-01-10 15:43:21 UTC
Type: Bug


Attachments (Terms of Use)


Links
System ID Private Priority Status Summary Last Updated
Red Hat Issue Tracker JBRULES-1410 0 None None None Never
Red Hat Issue Tracker SOA-297 0 None None None Never

Description Fernando Meyer 2008-01-09 13:14:41 UTC
Date of First Response: 2008-01-09 09:48:06
project_key: SOA

Comment 2 Fernando Meyer 2008-01-09 14:54:05 UTC
Link: Added: This issue related JBRULES-1410


Comment 3 Fernando Meyer 2008-01-09 14:54:30 UTC
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?


Comment 4 Fernando Meyer 2008-01-10 15:43:21 UTC
Patch applied


Note You need to log in before you can comment on or make changes to this bug.