[jboss-svn-commits] JBL Code SVN: r14997 - labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Sep 10 16:21:22 EDT 2007


Author: tirelli
Date: 2007-09-10 16:21:22 -0400 (Mon, 10 Sep 2007)
New Revision: 14997

Modified:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java
Log:
JBRULES-1177: implementing definitive solution

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java	2007-09-10 17:16:48 UTC (rev 14996)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java	2007-09-10 20:21:22 UTC (rev 14997)
@@ -28,7 +28,6 @@
 import org.drools.util.FactEntry;
 import org.drools.util.FactHashTable;
 import org.drools.util.Iterator;
-import org.drools.util.AbstractHashTable.FactEntryImpl;
 
 /**
  * <code>AlphaNodes</code> are nodes in the <code>Rete</code> network used
@@ -61,9 +60,6 @@
 
     private boolean                        objectMemoryAllowed;
 
-    // a reference to the ObjectSink currently being updated
-    private transient ObjectSink           sinkBeingUpdated;
-
     /**
      * Construct an <code>AlphaNode</code> with a unique id using the provided
      * <code>FieldConstraint</code> and the given <code>ObjectSource</code>.
@@ -141,17 +137,9 @@
                             false );
             }
 
-            if ( this.sinkBeingUpdated == null ) {
-                // this is a regular assert
-                this.sink.propagateAssertObject( handle,
-                                                 context,
-                                                 workingMemory );
-            } else {
-                // this is an assert as a result of sink update
-                this.sinkBeingUpdated.assertObject( handle,
-                                                    context,
-                                                    workingMemory );
-            }
+            this.sink.propagateAssertObject( handle,
+                                             context,
+                                             workingMemory );
         }
     }
 
@@ -181,11 +169,10 @@
 
         if ( !isObjectMemoryEnabled() ) {
             // get the objects from the parent
-            this.sinkBeingUpdated = sink;
-            this.objectSource.updateSink( this,
+            ObjectSinkUpdateAdapter adapter = new ObjectSinkUpdateAdapter( sink, this.constraint );
+            this.objectSource.updateSink( adapter,
                                           context,
                                           workingMemory );
-            this.sinkBeingUpdated = null;
         } else {
             // if already has memory, just iterate and propagate
             memory = (FactHashTable) workingMemory.getNodeMemory( this );
@@ -303,4 +290,53 @@
         this.previousObjectSinkNode = previous;
     }
 
+    /**
+     * Used with the updateSink method, so that the parent ObjectSource
+     * can  update the  TupleSink
+     * @author mproctor
+     *
+     */
+    private static class ObjectSinkUpdateAdapter
+        implements
+        ObjectSink {
+        private final ObjectSink sink;
+        private final AlphaNodeFieldConstraint constraint;
+
+        public ObjectSinkUpdateAdapter(final ObjectSink sink, 
+                                       final AlphaNodeFieldConstraint constraint ) {
+            this.sink = sink;
+            this.constraint = constraint;
+        }
+
+        public void assertObject(final InternalFactHandle handle,
+                                 final PropagationContext context,
+                                 final InternalWorkingMemory workingMemory) {
+            if ( this.constraint.isAllowed( handle.getObject(),
+                                            workingMemory ) ) {
+                this.sink.assertObject( handle,
+                                        context,
+                                        workingMemory );
+            }
+        }
+
+        public void modifyObject(final InternalFactHandle handle,
+                                 final PropagationContext context,
+                                 final InternalWorkingMemory workingMemory) {
+            throw new UnsupportedOperationException( "ObjectSinkUpdateAdapter onlys supports assertObject method calls" );
+        }
+
+        public void retractObject(final InternalFactHandle handle,
+                                  final PropagationContext context,
+                                  final InternalWorkingMemory workingMemory) {
+            throw new UnsupportedOperationException( "ObjectSinkUpdateAdapter onlys supports assertObject method calls" );
+        }
+
+        public boolean isObjectMemoryEnabled() {
+            throw new UnsupportedOperationException( "ObjectSinkUpdateAdapter have no Object memory" );
+        }
+
+        public void setObjectMemoryEnabled(boolean objectMemoryEnabled) {
+            throw new UnsupportedOperationException( "ObjectSinkUpdateAdapter have no Object memory" );
+        }
+    }
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java	2007-09-10 17:16:48 UTC (rev 14996)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java	2007-09-10 20:21:22 UTC (rev 14997)
@@ -27,7 +27,6 @@
 import org.drools.util.FactEntry;
 import org.drools.util.FactHashTable;
 import org.drools.util.Iterator;
-import org.drools.util.AbstractHashTable.FactEntryImpl;
 
 /**
  * All asserting Facts must propagated into the right <code>ObjectSink</code> side of a BetaNode, if this is the first Pattern




More information about the jboss-svn-commits mailing list