[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