[jboss-jira] [JBoss JIRA] Commented: (JBRULES-1315) Rule that uses a 'collect' and 'from' clause together causes problem

Pavlin Zahariev (JIRA) jira-events at lists.jboss.org
Tue Feb 5 15:26:04 EST 2008


    [ http://jira.jboss.com/jira/browse/JBRULES-1315?page=comments#action_12398341 ] 
            
Pavlin Zahariev commented on JBRULES-1315:
------------------------------------------

Hi there,

I think I found the reason why this happens. 

If  you use "collect",  this creates CollectNode in the reteoo tree. CollectNode has leftInput and rightInput data members.
If then your rules share two nodes, which are parents of a collectNode, i.e. ParentNode1->ParentNode2->CollectNode, 
In my case it was LeftInputAdapterNode->EvalCondition->Node->FromNode->CollectNode, where the first two were shared 8 times,
then when the package (and the rules) are destroyed, you get two calls to the both parent's remove(final BaseNode node,... method - one from the leftInput and one for the rightInput members of the CollectNode. 
This in turn will decreese the sharedCount of  Parent2 twice instead of just once, those somewhere in the middle of the destruction process
Parent1 will try to removeTupleSink( (TupleSink) parentNode2 ); twice and it will fail because there are no more tupleSink objects to remove.

The code where it fails is Ok, but care should be taken to manuipulte sharedCount correctly both ways.

Ok, Is there any chance we can get this fixed?

I know it sounds kinda stupid, but we are going to the release phase of very-very important project (very important only for me and my customer of course :)
and this is a bad issue. I can fix it my self, but... I'm new in Drools and  bit affraid I may brake something else. And then I just don't have enough time for the moment to sit down and study Drools sources carefully.

Cheers,

Pavlin


> Rule that uses a 'collect' and 'from' clause together causes problem
> --------------------------------------------------------------------
>
>                 Key: JBRULES-1315
>                 URL: http://jira.jboss.com/jira/browse/JBRULES-1315
>             Project: JBoss Drools
>          Issue Type: Bug
>      Security Level: Public(Everyone can see) 
>          Components: Reteoo
>    Affects Versions: 4.0.3
>            Reporter: Igor Bolic
>         Attachments: testRemovePackage.rar
>
>
> Test case:
> Write a Rule that uses a 'collect' and 'from' clause together, example:
> package com.sample.mypackage
> rule "Apply discount"
>         when
>                 $order: Order();
>                 $items : ArrayList() from collect (OrderItem() from $order.items)
>         then
>                 #apply discount
> end
> first i add the package to RuleBase object, everthing works fine. When i try to 'refresh' my rules, i.e. first remove the package and again 
> add the same (modified) package to the RuleBase object, following error occurs: 
> java.lang.IllegalArgumentException: Cannot remove a sink, when the list of sinks is null
>         at org.drools.reteoo.ObjectSource.removeObjectSink(ObjectSource.java:116)
>         at org.drools.reteoo.AlphaNode.remove(AlphaNode.java:181)
>         at org.drools.reteoo.LeftInputAdapterNode.remove(LeftInputAdapterNode.java:204)
>         at org.drools.reteoo.FromNode.remove(FromNode.java:153)
>         at org.drools.reteoo.RightInputAdapterNode.remove(RightInputAdapterNode.java:167)
>         at org.drools.reteoo.BetaNode.remove(BetaNode.java:186)
>         at org.drools.reteoo.RuleTerminalNode.remove(RuleTerminalNode.java:461)
>         at org.drools.reteoo.ReteooBuilder.removeRule(ReteooBuilder.java:224)
>         at org.drools.reteoo.ReteooRuleBase.removeRule(ReteooRuleBase.java:272)
>         at org.drools.common.AbstractRuleBase.removePackage(AbstractRuleBase.java:460)
>         ... 
> I've found a workaround for this error by writing my .drl code as following:
> package com.sample.mypackage
> rule "Explode Cart"  
>         salience 11
>         dialect "java"
>         when
>                 $order: Order()
>                 $item : OrderItem() from $order.items
>         then
>                 insert( $item );
> end
> rule "Apply discount"
>         no-loop true
>         when
>                 $order : Order();
>                 $items : ArrayList() from collect (OrderItem())
>         then
>                 #apply discount
> end 
> Now, my rules are 'refreshed' without any error.

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