[jboss-svn-commits] JBL Code SVN: r22784 - in labs/jbossrules/trunk: drools-core/src/main/java/org/drools/marshalling and 1 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Mon Sep 15 17:25:15 EDT 2008
Author: tirelli
Date: 2008-09-15 17:25:15 -0400 (Mon, 15 Sep 2008)
New Revision: 22784
Modified:
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/FirstOrderLogicTest.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/InputMarshaller.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/OutputMarshaller.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CollectNode.java
Log:
Fixing collect serialization
Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/FirstOrderLogicTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/FirstOrderLogicTest.java 2008-09-15 20:15:52 UTC (rev 22783)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/FirstOrderLogicTest.java 2008-09-15 21:25:15 UTC (rev 22784)
@@ -51,8 +51,8 @@
final Reader reader = new InputStreamReader( getClass().getResourceAsStream( "test_Collect.drl" ) );
RuleBase ruleBase = loadRuleBase( reader );
- final WorkingMemory wm = ruleBase.newStatefulSession();
- final List results = new ArrayList();
+ StatefulSession wm = ruleBase.newStatefulSession();
+ List results = new ArrayList();
wm.setGlobal( "results",
results );
@@ -67,15 +67,23 @@
5 ) );
wm.insert( new Cheese( "provolone",
150 ) );
+ wm = SerializationHelper.getSerialisedStatefulSession( wm );
+ results = (List) wm.getGlobal( "results" );
+
wm.insert( new Cheese( "provolone",
20 ) );
wm.insert( new Person( "Bob",
"stilton" ) );
wm.insert( new Person( "Mark",
"provolone" ) );
+ wm = SerializationHelper.getSerialisedStatefulSession( wm );
+ results = (List) wm.getGlobal( "results" );
wm.fireAllRules();
+ wm = SerializationHelper.getSerialisedStatefulSession( wm );
+ results = (List) wm.getGlobal( "results" );
+
Assert.assertEquals( 1,
results.size() );
Assert.assertEquals( 3,
@@ -92,24 +100,33 @@
RuleBase ruleBase = getRuleBase();
ruleBase.addPackage( pkg );
ruleBase = SerializationHelper.serializeObject(ruleBase);
- final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+ StatefulSession workingMemory = ruleBase.newStatefulSession();
- final List list = new ArrayList();
+ List results = new ArrayList();
workingMemory.setGlobal( "results",
- list );
+ results );
+ workingMemory = SerializationHelper.getSerialisedStatefulSession( workingMemory );
+ results = (List) workingMemory.getGlobal( "results" );
+
workingMemory.insert( new Cheese( "stilton",
10 ) );
+ workingMemory = SerializationHelper.getSerialisedStatefulSession( workingMemory );
+ results = (List) workingMemory.getGlobal( "results" );
+
workingMemory.insert( new Cheese( "brie",
15 ) );
workingMemory.fireAllRules();
+ workingMemory = SerializationHelper.getSerialisedStatefulSession( workingMemory );
+ results = (List) workingMemory.getGlobal( "results" );
+
assertEquals( 1,
- list.size() );
+ results.size() );
assertEquals( 2,
- ((List) list.get( 0 )).size() );
+ ((List) results.get( 0 )).size() );
}
public void testCollectModify() throws Exception {
@@ -117,8 +134,8 @@
final Reader reader = new InputStreamReader( getClass().getResourceAsStream( "test_Collect.drl" ) );
RuleBase ruleBase = loadRuleBase( reader );
- final WorkingMemory wm = ruleBase.newStatefulSession();
- final List results = new ArrayList();
+ StatefulSession wm = ruleBase.newStatefulSession();
+ List results = new ArrayList();
wm.setGlobal( "results",
results );
@@ -154,6 +171,7 @@
cheese[index].setPrice( 9 );
wm.update( cheeseHandles[index],
cheese[index] );
+
wm.fireAllRules();
Assert.assertEquals( ++fireCount,
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/InputMarshaller.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/InputMarshaller.java 2008-09-15 20:15:52 UTC (rev 22783)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/InputMarshaller.java 2008-09-15 21:25:15 UTC (rev 22784)
@@ -52,6 +52,8 @@
import org.drools.reteoo.RuleTerminalNode;
import org.drools.reteoo.AccumulateNode.AccumulateContext;
import org.drools.reteoo.AccumulateNode.AccumulateMemory;
+import org.drools.reteoo.CollectNode.CollectContext;
+import org.drools.reteoo.CollectNode.CollectMemory;
import org.drools.reteoo.EvalConditionNode.EvalMemory;
import org.drools.reteoo.RuleTerminalNode.TerminalNodeMemory;
import org.drools.rule.EntryPoint;
@@ -358,6 +360,10 @@
memory = ((AccumulateMemory) context.wm.getNodeMemory( (BetaNode) sink )).betaMemory;
break;
}
+ case NodeTypeEnums.CollectNode : {
+ memory = ((CollectMemory) context.wm.getNodeMemory( (BetaNode) sink )).betaMemory;
+ break;
+ }
default : {
memory = (BetaMemory) context.wm.getNodeMemory( (BetaNode) sink );
break;
@@ -527,6 +533,56 @@
}
break;
}
+ case NodeTypeEnums.CollectNode : {
+ // accumulate nodes generate new facts on-demand and need special procedures when de-serializing from persistent storage
+ CollectMemory memory = (CollectMemory) context.wm.getNodeMemory( (BetaNode) sink );
+ memory.betaMemory.getLeftTupleMemory().add( parentLeftTuple );
+
+ CollectContext colctx = new CollectContext();
+ memory.betaMemory.getCreatedHandles().put( parentLeftTuple,
+ colctx,
+ false );
+ // first we de-serialize the generated fact handle
+ InternalFactHandle handle = readFactHandle( context );
+ colctx.resultTuple = new RightTuple( handle,
+ (RightTupleSink) sink );
+
+ // then we de-serialize the boolean propagated flag
+ colctx.propagated = stream.readBoolean();
+
+ // then we de-serialize all the propagated tuples
+ short head = -1;
+ while ( (head = stream.readShort()) != PersisterEnums.END ) {
+ switch ( head ) {
+ case PersisterEnums.RIGHT_TUPLE : {
+ int factHandleId = stream.readInt();
+ RightTupleKey key = new RightTupleKey( factHandleId,
+ sink );
+ RightTuple rightTuple = context.rightTuples.get( key );
+ // just wiring up the match record
+ new LeftTuple( parentLeftTuple,
+ rightTuple,
+ sink,
+ true );
+ break;
+ }
+ case PersisterEnums.LEFT_TUPLE : {
+ LeftTupleSink childSink = (LeftTupleSink) sinks.get( stream.readInt() );
+ LeftTuple childLeftTuple = new LeftTuple( parentLeftTuple,
+ colctx.resultTuple,
+ childSink,
+ true );
+ readLeftTuple( childLeftTuple,
+ context );
+ break;
+ }
+ default : {
+ throw new RuntimeDroolsException( "Marshalling error. This is a bug. Please contact the development team." );
+ }
+ }
+ }
+ break;
+ }
case NodeTypeEnums.RuleTerminalNode : {
RuleTerminalNode ruleTerminalNode = (RuleTerminalNode) sink;
TerminalNodeMemory memory = (TerminalNodeMemory) wm.getNodeMemory( ruleTerminalNode );
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/OutputMarshaller.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/OutputMarshaller.java 2008-09-15 20:15:52 UTC (rev 22783)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/OutputMarshaller.java 2008-09-15 21:25:15 UTC (rev 22784)
@@ -46,6 +46,8 @@
import org.drools.reteoo.RuleTerminalNode;
import org.drools.reteoo.AccumulateNode.AccumulateContext;
import org.drools.reteoo.AccumulateNode.AccumulateMemory;
+import org.drools.reteoo.CollectNode.CollectContext;
+import org.drools.reteoo.CollectNode.CollectMemory;
import org.drools.rule.EntryPoint;
import org.drools.rule.Rule;
import org.drools.ruleflow.instance.RuleFlowProcessInstance;
@@ -471,7 +473,7 @@
case NodeTypeEnums.AccumulateNode : {
context.out.println( "AccumulateNode" );
// accumulate nodes generate new facts on-demand and need special procedures when serializing to persistent storage
- AccumulateMemory memory = (AccumulateMemory) context.wm.getNodeMemory( (BetaNode) leftTuple.getLeftTupleSink() );
+ AccumulateMemory memory = (AccumulateMemory) context.wm.getNodeMemory( (BetaNode) sink );
AccumulateContext accctx = (AccumulateContext) memory.betaMemory.getCreatedHandles().get( leftTuple );
// first we serialize the generated fact handle
writeFactHandle( context,
@@ -504,6 +506,40 @@
context.out.println( "AccumulateNode --- END" );
break;
}
+ case NodeTypeEnums.CollectNode : {
+ context.out.println( "CollectNode" );
+ // collect nodes generate new facts on-demand and need special procedures when serializing to persistent storage
+ CollectMemory memory = (CollectMemory) context.wm.getNodeMemory( (BetaNode) sink );
+ CollectContext colctx = (CollectContext) memory.betaMemory.getCreatedHandles().get( leftTuple );
+ // first we serialize the generated fact handle
+ writeFactHandle( context,
+ stream,
+ context.resolverStrategyFactory,
+ colctx.resultTuple.getFactHandle() );
+ // then we serialize the boolean propagated flag
+ stream.writeBoolean( colctx.propagated );
+
+ // then we serialize all the propagated tuples
+ for ( LeftTuple childLeftTuple = getLeftTuple( leftTuple.getBetaChildren() ); childLeftTuple != null; childLeftTuple = (LeftTuple) childLeftTuple.getLeftParentPrevious() ) {
+ if( leftTuple.getLeftTupleSink().getId() == childLeftTuple.getLeftTupleSink().getId()) {
+ // this is a matching record, so, associate the right tuples
+ context.out.println( "RightTuple(match) int:" + childLeftTuple.getLeftTupleSink().getId() + " int:" + childLeftTuple.getRightParent().getFactHandle().getId() );
+ stream.writeShort( PersisterEnums.RIGHT_TUPLE );
+ stream.writeInt( childLeftTuple.getRightParent().getFactHandle().getId() );
+ } else {
+ // this is a propagation record
+ context.out.println( "RightTuple(propagation) int:" + childLeftTuple.getLeftTupleSink().getId() + " int:" + childLeftTuple.getRightParent().getFactHandle().getId() );
+ stream.writeShort( PersisterEnums.LEFT_TUPLE );
+ stream.writeInt( childLeftTuple.getLeftTupleSink().getId() );
+ writeLeftTuple( childLeftTuple,
+ context,
+ recurse );
+ }
+ }
+ stream.writeShort( PersisterEnums.END );
+ context.out.println( "CollectNode --- END" );
+ break;
+ }
case NodeTypeEnums.RuleTerminalNode : {
context.out.println( "RuleTerminalNode" );
int pos = context.terminalTupleMap.size();
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CollectNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CollectNode.java 2008-09-15 20:15:52 UTC (rev 22783)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CollectNode.java 2008-09-15 21:25:15 UTC (rev 22784)
@@ -20,7 +20,6 @@
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
-import java.io.Serializable;
import java.util.Arrays;
import java.util.Collection;
@@ -543,12 +542,22 @@
}
}
- private static class CollectContext
+ public static class CollectContext
implements
- Serializable {
+ Externalizable {
private static final long serialVersionUID = -3076306175989410574L;
public RightTuple resultTuple;
public boolean propagated;
+
+ public void readExternal(ObjectInput in) throws IOException,
+ ClassNotFoundException {
+ resultTuple = (RightTuple) in.readObject();
+ propagated = in.readBoolean();
+ }
+ public void writeExternal(ObjectOutput out) throws IOException {
+ out.writeObject( resultTuple );
+ out.writeBoolean( propagated );
+ }
}
More information about the jboss-svn-commits
mailing list