[rules-users] accumulate vs collect

Edson Tirelli tirelli at post.com
Fri Nov 12 13:05:36 EST 2010


    I believe this is fixed in Drools 5.1.1, as in 5.0.1 declared
beans where not implementing the Serializable interface. Please try
5.1.1 and let us know if you still see the problem.

   Otherwise, Wolfgang's suggestion for the workaround should work as well.

    Edson

2010/11/12  <rouvas at di.uoa.gr>:
> Edson Tirelli wrote:
>>    Can you show us the stack trace? What version of Drools are you using?
>
> I am using Drools.5.0.1.
>
> For this accumulate:
>
> v945 : Number ( doubleValue  >=  1 ) from accumulate ( p : t_1 (  c_6 >=
> 20100512 && c_7 == "5" ) , count(p) )
>
> stack trace follows:
>
> EXCEPTION ERROR
> java.lang.ClassCastException: gr.fbi.rulez.t_1
> org.drools.rule.Accumulate.accumulate(Accumulate.java:172)
> org.drools.reteoo.AccumulateNode.modifyTuple(AccumulateNode.java:424)
> org.drools.reteoo.AccumulateNode.assertObject(AccumulateNode.java:284)
> org.drools.reteoo.SingleObjectSinkAdapter.propagateAssertObject(SingleObjectSinkAdapter.java:42)
> org.drools.reteoo.AlphaNode.assertObject(AlphaNode.java:147)
> org.drools.reteoo.SingleObjectSinkAdapter.propagateAssertObject(SingleObjectSinkAdapter.java:42)
> org.drools.reteoo.AlphaNode.assertObject(AlphaNode.java:147)
> org.drools.reteoo.SingleObjectSinkAdapter.propagateAssertObject(SingleObjectSinkAdapter.java:42)
> org.drools.reteoo.ObjectTypeNode.assertObject(ObjectTypeNode.java:185)
> org.drools.reteoo.EntryPointNode.assertObject(EntryPointNode.java:146)
> org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:1046)
> org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:1001)
> org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:788)
> org.drools.impl.StatefulKnowledgeSessionImpl.insert(StatefulKnowledgeSessionImpl.java:216)
> utils.LoadDynEntities.load(LoadDynEntities.java:102)
> gr.fbi.rulez.RulesRunner.ignite(RulesRunner.java:74)
> ...more irrelevant stuff..
>
> -Stathis
>
>
>>
>>    In Drools 5.1+, collect is just syntax sugar... internally, collect
>> is implemented using accumulate.
>>
>>    Edson
>>
>> 2010/11/11  <rouvas at di.uoa.gr>:
>>> Hi List,
>>>
>>> I'm trying to count the number of objects I have in the Working Memory
>>> using accumulate, but I'm having a ClassCastException thrown at me.
>>>
>>> Using a variant with collect, everything work OK.
>>>
>>> Can someone shed some light on this issue?
>>> Is it related to https://jira.jboss.org/browse/JBRULES-2202 ?
>>>
>>> I'm using Drools.5.0.1 and the fact is a declared one, as follows:
>>>
>>> declare t_1
>>>  regRowId : String
>>>  versionId : String
>>>  c_7 : String
>>>  c_1 : String
>>>  c_2 : String
>>>  c_3 : String
>>>  c_4 : String
>>>  c_5 : String
>>>  c_6 : Double
>>> end
>>>
>>> trying with :
>>>
>>> v945 : Number ( doubleValue  >=  1 ) from accumulate ( p : t_1 (  c_6 >=
>>> 20100511 && c_7 == "5" ) , count(p) )
>>>
>>> I'm getting a ClassCastException:t_1, while using :
>>>
>>> v945 : ArrayList ( size  >=  1 ) from collect ( t_1 (  c_6 >= 20100511
>>> &&
>>> c_7 == "5" )  )
>>>
>>> works OK.
>>>
>>> The reason I'm preferring accumulate over collect, is that I'm not
>>> really
>>> interested in constructing an ArrayList of the matched facts (worries
>>> about memory consumption), all I want is how many of them are there.
>>>
>>> The actual rule I'm using (although I don't think it matters) for the
>>> accumulate variant, is:
>>>
>>> rule "r95944.6"
>>>        dialect "mvel"
>>>        when
>>>                gnId : GoodNumbers()
>>>                 LogicalValue : Trader( gnId.goodNo==goodNo  )
>>>                 v945 : Number ( doubleValue  >=  1 ) from accumulate ( p
>>> : t_1 (  c_6
>>>>= 20100511 && c_7 == "5" ) , count(p) )
>>>        then
>>>                RaResultCode rrc = new RaResultCode();
>>>                  rrc.setResultRuleId("95944");
>>>                  rrc.setResultRuleVersionId("6");
>>>                  rrc.setResultColor("R");
>>>                  rrc.setResultRuleCode("01");
>>>                  rrc.setResultAction("1");
>>>                  rrc.setResultGoodNo(gnId.goodNo);
>>>                insertLogical(rrc);
>>> end
>>>
>>> Thank you for your time.
>>>
>>> -Stathis
>>>
>>>
>>> _______________________________________________
>>> rules-users mailing list
>>> rules-users at lists.jboss.org
>>> https://lists.jboss.org/mailman/listinfo/rules-users
>>>
>>
>>
>>
>> --
>>   Edson Tirelli
>>   JBoss Drools Core Development
>>   JBoss by Red Hat @ www.jboss.com
>>
>
>



-- 
  Edson Tirelli
  JBoss Drools Core Development
  JBoss by Red Hat @ www.jboss.com




More information about the rules-users mailing list