[jboss-jira] [JBoss JIRA] (DROOLS-487) Accumulation returns n-times more value than actual number of summed values present by PHREAK engine when **split and join** are used in JBPM flow.

Anantjot Anand (JIRA) issues at jboss.org
Wed May 21 16:30:56 EDT 2014


     [ https://issues.jboss.org/browse/DROOLS-487?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Anantjot Anand updated DROOLS-487:
----------------------------------

    Attachment: TestTwoLevelDeepAccumulateWithSplit.java


This is self-contained junit test that DOES NOT reproduces the accumulate function issue of this JIRA. The two level deep in this context means is the qualifying object of type PolicySet that is used for accumulate function is selected by 2 ANDS i.e., object is of type TransactionDetail() and PolicySet(parentId==TransactionDetail.id).

Rest rules and flow are same as previous example.

> Accumulation returns n-times more value than actual number of summed values present by PHREAK engine when **split and join** are used in JBPM flow.
> ---------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: DROOLS-487
>                 URL: https://issues.jboss.org/browse/DROOLS-487
>             Project: Drools
>          Issue Type: Bug
>      Security Level: Public(Everyone can see) 
>    Affects Versions: 6.1.0.Beta3
>            Reporter: Anantjot Anand
>            Assignee: Mark Proctor
>         Attachments: TestFourLevelDeepAccumulateWithSplit.java, TestTwoLevelDeepAccumulateWithSplit.java
>
>
> Accumulation returns n-times more value than actual number of summed values present. The factor n is dependent upon the number of times the parent object
> updates are called before rule that does the summation is invoked in the flow.
> How to reproduce?
> A simple test project is attached to this report. This project has following DataModel. 
> InvokeServiceRequest=>LoanRequest==>TransactionDetail==>PolicySet	and WorkingObjectTransactionDetail
> 					
> <?xml version="1.0" encoding="UTF-8"?> 
> <process xmlns="http://drools.org/drools-5.0/process"
>          xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
>          xs:schemaLocation="http://drools.org/drools-5.0/process drools-processes-5.0.xsd"
>          type="RuleFlow" name="RF6365_200" id="278865" package-name="com.test.sumofall.GeneratedRules" version="200" >
>   <header>
>     <imports>
>       <import name="com.test.sumofall.InvokeServicesRequest" />
>       <import name="com.test.sumofall.TransactionDetail" />
>       <import name="com.test.sumofall.LoanRequest" />
>       <import name="com.test.sumofall.WorkingObjectsTransactionDetail" />
>     </imports>
>   </header>
>   <nodes>
>     <ruleSet id="1" name="1" x="307" y="31" width="80" height="48" ruleFlowGroup="group_1" />
>     <start id="70004" name="Start" x="61" y="33" width="48" height="48" />
>     <ruleSet id="2" name="2" x="463" y="27" width="80" height="48" ruleFlowGroup="group_2" />
>     <ruleSet id="3" name="3" x="315" y="230" width="80" height="48" ruleFlowGroup="group_3" />
>     <join id="90004" name="EndJoin90004" x="532" y="80" width="49" height="49" type="2" />
>     <split id="11" name="11" x="337" y="101" width="49" height="49" type="2" >
>       <constraints>
>         <constraint toNodeId="90004" toType="DROOLS_DEFAULT" name="ServiceFlowCode Equal to Post Rules Processing" priority="1" type="rule" dialect="mvel" >$invokeServices : 
> 					InvokeServicesRequest(  )
> 					$lendingTransaction : 
> 					LoanRequest(  parentId == $invokeServices.myId )
> 					$transactionDetail : 
> 					TransactionDetail(  parentId == $lendingTransaction.myId )
> 					$workingTransactionDetail : 
> 					WorkingObjectsTransactionDetail(  parentId == $transactionDetail.myId
> 						, serviceFlowCode == "Post Rules Processing" )</constraint>
>         <constraint toNodeId="3" toType="DROOLS_DEFAULT" name="ServiceFlowCode Not Equal to Post Rules Processing" priority="1" type="rule" dialect="mvel" >$invokeServices : 
> 					InvokeServicesRequest(  )
> 					$lendingTransaction : 
> 					LoanRequest(  parentId == $invokeServices.myId )
> 					$transactionDetail : 
> 					TransactionDetail(  parentId == $lendingTransaction.myId )
> 					$workingTransactionDetail : 
> 					WorkingObjectsTransactionDetail(  parentId == $transactionDetail.myId
> 						, serviceFlowCode != "Post Rules Processing" )</constraint>
>       </constraints>
>     </split>
>     <end id="80004" name="End" x="640" y="30" width="48" height="48" />
>   </nodes>
>   <connections>
>     <connection from="70004" to="1" />
>     <connection from="1" to="2" />
>     <connection from="2" to="11" />
> 	<!--If WE change order of the following two lines to this it works for this example but similar change doesn't work when multiple split and joins are present in ruleflow
>     <connection from="11" to="3" />
>     <connection from="11" to="90004" />
> 		-->
>     <connection from="11" to="90004" />
>     <connection from="11" to="3" />
>     <connection from="3" to="90004" />
>     <connection from="90004" to="80004" />
>   </connections>
> </process>				
> ****ROOT CAUSE****			
> I believe the problem is caused by the childLeftTuple.getStagedType() being equal to LeftTuple.INSERT instead of LeftTuple.NONE or LeftTuple.UPDATE. 
> Thread [main] (Suspended)	
> 	PhreakJoinNode.updateChildLeftTuple(LeftTuple, LeftTupleSets, LeftTupleSets) line: 443	
> 	PhreakJoinNode.doRightUpdatesProcessChildren(LeftTuple, LeftTuple, RightTuple, LeftTupleSets, ContextEntry[], BetaConstraints, LeftTupleSink, FastIterator, LeftTupleSets) line: 363	
> 	PhreakJoinNode.doRightUpdates(JoinNode, LeftTupleSink, BetaMemory, InternalWorkingMemory, RightTupleSets, LeftTupleSets, LeftTupleSets) line: 307	
> 	PhreakJoinNode.doNode(JoinNode, LeftTupleSink, BetaMemory, InternalWorkingMemory, LeftTupleSets, LeftTupleSets, LeftTupleSets) line: 48	
> 	RuleNetworkEvaluator.switchOnDoBetaNode(NetworkNode, LeftTupleSets, InternalWorkingMemory, LeftTupleSets, LeftTupleSets, LeftTupleSinkNode, BetaMemory, AccumulateNode$AccumulateMemory) line: 547	
> 	RuleNetworkEvaluator.evalBetaNode(LeftInputAdapterNode, PathMemory, NetworkNode, Memory, SegmentMemory[], int, LeftTupleSets, InternalWorkingMemory, LinkedList<StackEntry>, LinkedList<StackEntry>, Set<String>, boolean, RuleExecutor, LeftTupleSets, LeftTupleSets, LeftTupleSinkNode) line: 533	
> 	RuleNetworkEvaluator.innerEval(LeftInputAdapterNode, PathMemory, NetworkNode, long, Memory, SegmentMemory[], int, LeftTupleSets, InternalWorkingMemory, LinkedList<StackEntry>, LinkedList<StackEntry>, Set<String>, boolean, RuleExecutor) line: 334	
> 	RuleNetworkEvaluator.outerEval(LeftInputAdapterNode, PathMemory, NetworkNode, long, Memory, SegmentMemory[], int, LeftTupleSets, InternalWorkingMemory, LinkedList<StackEntry>, LinkedList<StackEntry>, Set<String>, boolean, RuleExecutor) line: 161	
> 	RuleNetworkEvaluator.evaluateNetwork(PathMemory, LinkedList<StackEntry>, RuleExecutor, InternalWorkingMemory) line: 116	
> 	RuleExecutor.evaluateNetwork(InternalWorkingMemory) line: 54	
> 	DefaultAgenda.evaluateEagerList() line: 958	
> 	DefaultAgenda.fireNextItem(AgendaFilter, int, int) line: 913	
> 	DefaultAgenda.fireAllRules(AgendaFilter, int) line: 1198	
> 	StatefulKnowledgeSessionImpl.fireAllRules(AgendaFilter, int) line: 1202	
> 	StatefulKnowledgeSessionImpl.fireAllRules() line: 1175	
> 	SumOfAllTest.main(String[]) line: 133	



--
This message was sent by Atlassian JIRA
(v6.2.3#6260)


More information about the jboss-jira mailing list