[jboss-svn-commits] JBL Code SVN: r6565 - in labs/jbossrules/trunk/drools-core/src: main/java/org/drools/common main/java/org/drools/reteoo main/java/org/drools/spi main/java/org/drools/util test/java/org/drools/reteoo

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Tue Oct 3 19:00:30 EDT 2006


Author: mark.proctor at jboss.com
Date: 2006-10-03 19:00:21 -0400 (Tue, 03 Oct 2006)
New Revision: 6565

Removed:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ObjectTypeResolver.java
Modified:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalRuleBase.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CompositeObjectSinkAdapter.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectSinkPropagator.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/SingleObjectSinkAdapter.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/AbstractHashTable.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/ObjectHashMap.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockObjectSink.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ObjectTypeNodeTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ReteTest.java
Log:
JBRULES-498 Optimised HashMap implementations
-Rete and ObjectTypeNode  and  their test now pass

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalRuleBase.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalRuleBase.java	2006-10-03 22:47:09 UTC (rev 6564)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalRuleBase.java	2006-10-03 23:00:21 UTC (rev 6565)
@@ -61,10 +61,6 @@
                              PropagationContext context,
                              ReteooWorkingMemory workingMemory) throws FactException;
 
-    public void modifyObject(FactHandle handle,
-                             PropagationContext context,
-                             ReteooWorkingMemory workingMemory) throws FactException;
-
     /**
      * Retract a fact object.
      * 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CompositeObjectSinkAdapter.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CompositeObjectSinkAdapter.java	2006-10-03 22:47:09 UTC (rev 6564)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CompositeObjectSinkAdapter.java	2006-10-03 23:00:21 UTC (rev 6565)
@@ -1,11 +1,7 @@
 package org.drools.reteoo;
 
 import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
 
 import org.drools.base.evaluators.Operator;
 import org.drools.common.InternalFactHandle;
@@ -15,8 +11,11 @@
 import org.drools.spi.FieldConstraint;
 import org.drools.spi.FieldExtractor;
 import org.drools.spi.PropagationContext;
+import org.drools.util.Iterator;
 import org.drools.util.LinkedList;
 import org.drools.util.LinkedListNode;
+import org.drools.util.ObjectHashMap;
+import org.drools.util.ObjectHashMap.ObjectEntry;
 
 public class CompositeObjectSinkAdapter
     implements
@@ -27,7 +26,7 @@
 
     private LinkedList         hashedFieldIndexes;
 
-    private Map                hashedSinkMap;
+    private ObjectHashMap      hashedSinkMap;
 
     private HashKey            hashKey;
 
@@ -54,9 +53,11 @@
                             hashSinks( fieldIndex );
                        }
                         Object value = literalConstraint.getField().getValue();
+                        // no need to check, we know  the sink  does not exist
                         hashedSinkMap.put( new HashKey( index,
                                                         value ),
-                                           sink );    
+                                           sink,
+                                           false );    
                     } else {
                         if ( this.hashedSinks == null ) {
                             this.hashedSinks = new ObjectSinkNodeList();
@@ -124,7 +125,7 @@
         List list = new ArrayList();
         
         if ( this.hashedSinkMap == null ) {
-            this.hashedSinkMap = new HashMap();
+            this.hashedSinkMap = new ObjectHashMap();
         }
 
         for ( ObjectSinkNode sink = this.hashedSinks.getFirst(); sink != null; sink = sink.getNextObjectSinkNode() ) {
@@ -141,7 +142,7 @@
             }
         }        
         
-        for ( Iterator it = list.iterator(); it.hasNext(); ) {
+        for ( java.util.Iterator it = list.iterator(); it.hasNext(); ) {
             ObjectSinkNode sink = ( ObjectSinkNode ) it.next();
             this.hashedSinks.remove( sink );
         }
@@ -281,39 +282,6 @@
 
     }
 
-    public void propagateModifyObject(InternalFactHandle handle,
-                                      PropagationContext context,
-                                      InternalWorkingMemory workingMemory) {
-
-        if ( this.hashedSinkMap != null ) {
-            for ( Iterator it = this.hashedSinkMap.values().iterator(); it.hasNext(); ) {
-                ObjectSink sink = (ObjectSink) it.next();
-                sink.modifyObject( handle,
-                                   context,
-                                   workingMemory );
-            }
-        }
-
-        if ( this.hashedSinks != null ) {
-            // we can't retrieve hashed sinks, as the field value might have changed, so we have to iterate and propagate to all hashed sinks
-            for ( ObjectSinkNode sink = this.hashedSinks.getFirst(); sink != null; sink = sink.getNextObjectSinkNode() ) {
-                sink.modifyObject( handle,
-                                   context,
-                                   workingMemory );
-            }
-        }
-
-        if ( this.otherSinks != null ) {
-            // propagate others
-            for ( ObjectSinkNode sink = this.otherSinks.getFirst(); sink != null; sink = sink.getNextObjectSinkNode() ) {
-                sink.modifyObject( handle,
-                                   context,
-                                   workingMemory );
-            }
-        }
-
-    }
-
     public void propagateRetractObject(InternalFactHandle handle,
                                        PropagationContext context,
                                        InternalWorkingMemory workingMemory,
@@ -337,9 +305,10 @@
                     }
                 }
             } else if ( this.hashedSinkMap != null ) {
-                for ( Iterator it = this.hashedSinkMap.values().iterator(); it.hasNext(); ) {
-                    ObjectSink sink = (ObjectSink) it.next();
-                    sink.modifyObject( handle,
+                Iterator it = this.hashedSinkMap.iterator();
+                for ( ObjectEntry entry = (ObjectEntry) it.next(); entry != null; entry = (ObjectEntry) it.next() ) {
+                    ObjectSink sink = (ObjectSink) entry.getValue();
+                    sink.retractObject( handle,
                                        context,
                                        workingMemory );
                 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectSinkPropagator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectSinkPropagator.java	2006-10-03 22:47:09 UTC (rev 6564)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectSinkPropagator.java	2006-10-03 23:00:21 UTC (rev 6565)
@@ -16,9 +16,5 @@
                                        InternalWorkingMemory workingMemory,
                                        boolean useHash);
 
-    public void propagateModifyObject(InternalFactHandle handle,
-                                      PropagationContext context,
-                                      InternalWorkingMemory workingMemory);
-
     public ObjectSink[] getSinks(); 
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java	2006-10-03 22:47:09 UTC (rev 6564)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java	2006-10-03 23:00:21 UTC (rev 6565)
@@ -18,7 +18,6 @@
 
 import java.io.Serializable;
 import java.util.ArrayList;
-import java.util.Iterator;
 import java.util.List;
 
 import org.drools.RuleBaseConfiguration;
@@ -30,7 +29,11 @@
 import org.drools.common.PropagationContextImpl;
 import org.drools.spi.ObjectType;
 import org.drools.spi.PropagationContext;
+import org.drools.util.FactHashTable;
+import org.drools.util.Iterator;
+import org.drools.util.ObjectHashMap;
 import org.drools.util.PrimitiveLongMap;
+import org.drools.util.AbstractHashTable.FactEntry;
 
 /**
  * <code>ObjectTypeNodes<code> are responsible for filtering and propagating the matching
@@ -65,7 +68,7 @@
     /**
      * 
      */
-    private static final long serialVersionUID = 1397702820739948690L;
+    private static final long serialVersionUID = 320L;
 
     /** The <code>ObjectType</code> semantic module. */
     private final ObjectType  objectType;
@@ -136,9 +139,9 @@
     public void assertObject(final InternalFactHandle handle,
                              final PropagationContext context,
                              final InternalWorkingMemory workingMemory) {
-        final PrimitiveLongMap memory = (PrimitiveLongMap) workingMemory.getNodeMemory( this );
-        memory.put( handle.getId(),
-                    handle );
+        final FactHashTable memory = (FactHashTable) workingMemory.getNodeMemory( this );
+        // we do not need to check if the fact exists already
+        memory.add( handle, false );
         
         this.sink.propagateAssertObject( handle, context, workingMemory );
     }
@@ -157,26 +160,17 @@
     public void retractObject(final InternalFactHandle handle,
                               final PropagationContext context,
                               final InternalWorkingMemory workingMemory) {
-        final PrimitiveLongMap memory = (PrimitiveLongMap) workingMemory.getNodeMemory( this );
-        memory.remove( handle.getId() );
+        final FactHashTable memory = (FactHashTable) workingMemory.getNodeMemory( this );
+        memory.remove( handle );
 
         this.sink.propagateRetractObject( handle, context, workingMemory, true );
-    }
+    }   
     
-
-    public void modifyObject(final InternalFactHandle handle,
-                             final PropagationContext context,
-                             final InternalWorkingMemory workingMemory) {        
-        this.sink.propagateModifyObject( handle, context, workingMemory );       
-    }
-
-    
     public void updateSink(ObjectSink sink, PropagationContext context, InternalWorkingMemory workingMemory) {
-        final PrimitiveLongMap memory = (PrimitiveLongMap) workingMemory.getNodeMemory( this );        
-
-        for ( final Iterator it = memory.values().iterator(); it.hasNext(); ) {            
-            final DefaultFactHandle handle = (DefaultFactHandle) it.next();
-            sink.assertObject( handle, context, workingMemory );
+        final FactHashTable memory = (FactHashTable) workingMemory.getNodeMemory( this );        
+        Iterator it =  memory.iterator();
+        for ( FactEntry entry = ( FactEntry ) it.next(); entry != null; entry = ( FactEntry ) it.next() ) {            
+            sink.assertObject( entry.getFactHandle(), context, workingMemory );
         }
     }    
 
@@ -190,7 +184,7 @@
     public void attach(final InternalWorkingMemory[] workingMemories) {
         attach();
 
-        // we need to call updateNewNode on Rete, because someone 
+        // we need to call updateSink on Rete, because someone 
         // might have already added facts matching this ObjectTypeNode 
         // to working memories
         for ( int i = 0, length = workingMemories.length; i < length; i++ ) {
@@ -199,8 +193,9 @@
                                                                                       PropagationContext.RULE_ADDITION,
                                                                                       null,
                                                                                       null );
-            this.rete.updateNewNode( workingMemory,
-                                     propagationContext );
+            this.rete.updateSink( this,
+                                  propagationContext,
+                                  workingMemory );
         }
     }
 
@@ -232,8 +227,7 @@
      * to switch back to a standard HashMap.
      */
     public Object createMemory(final RuleBaseConfiguration config) {
-        return new PrimitiveLongMap( 32,
-                                     8 );
+        return new FactHashTable();
     }
 
     public String toString() {
@@ -260,16 +254,5 @@
 
         return this.objectType.equals( other.objectType );
     }
-
-    public List getPropagatedFacts(InternalWorkingMemory workingMemory) {
-        final PrimitiveLongMap memory = (PrimitiveLongMap) workingMemory.getNodeMemory( this );
-        final List facts = new ArrayList();
-
-        for ( final Iterator it = memory.values().iterator(); it.hasNext(); ) {            
-            final DefaultFactHandle handle = (DefaultFactHandle) it.next();
-            facts.add( handle );
-        }
-        return facts;
-    }
-
+    
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.java	2006-10-03 22:47:09 UTC (rev 6564)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.java	2006-10-03 23:00:21 UTC (rev 6565)
@@ -18,24 +18,20 @@
 
 import java.io.Serializable;
 import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
-import java.util.Map;
 
 import org.drools.FactException;
 import org.drools.RuleBaseConfiguration;
 import org.drools.common.BaseNode;
-import org.drools.common.DefaultFactHandle;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.common.NodeMemory;
 import org.drools.facttemplates.Fact;
 import org.drools.facttemplates.FactImpl;
-import org.drools.spi.ObjectType;
-import org.drools.spi.ObjectTypeResolver;
 import org.drools.spi.PropagationContext;
+import org.drools.util.Iterator;
+import org.drools.util.ObjectHashMap;
+import org.drools.util.ObjectHashMap.ObjectEntry;
 
 /**
  * The Rete-OO network.
@@ -68,27 +64,17 @@
     /**
      * 
      */
-    private static final long        serialVersionUID = -7166421271509211041L;
+    private static final long        serialVersionUID = 320L;
     /** The <code>Map</code> of <code>ObjectTypeNodes</code>. */
-    private final Map                objectTypeNodes  = new HashMap();
-    private ObjectTypeNode           lastAddedNode    = null;
+    private final ObjectHashMap      objectTypeNodes;
 
-    private final ObjectTypeResolver resolver;
-
     // ------------------------------------------------------------
     // Constructors
     // ------------------------------------------------------------
 
-    /**
-     * Construct.
-     */
     public Rete() {
-        this( null );
-    }
-
-    public Rete(final ObjectTypeResolver resolver) {
         super( 0 );
-        this.resolver = resolver;
+        this.objectTypeNodes = new ObjectHashMap();
     }
 
     // ------------------------------------------------------------
@@ -110,7 +96,7 @@
     public void assertObject(final InternalFactHandle handle,
                              final PropagationContext context,
                              final InternalWorkingMemory workingMemory) {
-        final HashMap memory = (HashMap) workingMemory.getNodeMemory( this );
+        final ObjectHashMap memory = (ObjectHashMap) workingMemory.getNodeMemory( this );
 
         final Object object = handle.getObject();
         
@@ -126,7 +112,8 @@
         if ( cachedNodes == null ) {
             cachedNodes = getMatchingNodes( object );
             memory.put( key,
-                        cachedNodes );
+                        cachedNodes,
+                        false );
         }
 
         for ( int i = 0, length = cachedNodes.length; i < length; i++ ) {
@@ -148,17 +135,16 @@
     public void retractObject(final InternalFactHandle handle,
                               final PropagationContext context,
                               final InternalWorkingMemory workingMemory) {
-        final HashMap memory = (HashMap) workingMemory.getNodeMemory( this );
+        final ObjectHashMap memory = (ObjectHashMap) workingMemory.getNodeMemory( this );
 
         final Object object = handle.getObject();
 
         ObjectTypeNode[] cachedNodes = (ObjectTypeNode[]) memory.get( object.getClass() );
         if ( cachedNodes == null ) {
-            cachedNodes = getMatchingNodes( object );
-            memory.put( object.getClass(),
-                        cachedNodes );
+            // it is  possible that there are no ObjectTypeNodes for an  object being retracted
+            return;
         }
-
+        
         for ( int i = 0; i < cachedNodes.length; i++ ) {
             cachedNodes[i].retractObject( handle,
                                           context,
@@ -166,85 +152,21 @@
         }
     }
 
-    public void modifyObject(final InternalFactHandle handle,
-                             final PropagationContext context,
-                             final InternalWorkingMemory workingMemory) {
-        final HashMap memory = (HashMap) workingMemory.getNodeMemory( this );
-
-        final Object object = handle.getObject();
-
-        ObjectTypeNode[] cachedNodes = (ObjectTypeNode[]) memory.get( object.getClass() );
-        if ( cachedNodes == null ) {
-            cachedNodes = getMatchingNodes( object );
-            memory.put( object.getClass(),
-                        cachedNodes );
-        }
-
-        for ( int i = 0; i < cachedNodes.length; i++ ) {
-            cachedNodes[i].modifyObject( handle,
-                                         context,
-                                         workingMemory );
-        }
-    }
-
     private ObjectTypeNode[] getMatchingNodes(final Object object) throws FactException {
         final List cache = new ArrayList();
 
-        for ( final Iterator it = objectTypeNodeIterator(); it.hasNext(); ) {
-            final ObjectTypeNode node = (ObjectTypeNode) it.next();
+        Iterator it = this.objectTypeNodes.iterator();
+        for ( ObjectEntry entry = (ObjectEntry)it.next(); entry != null; entry =  (ObjectEntry)it.next() ) {
+            final ObjectTypeNode node = (ObjectTypeNode) entry.getValue();
             if ( node.matches( object ) ) {
                 cache.add( node );
-            }
+            }            
         }
+        
         return (ObjectTypeNode[]) cache.toArray( new ObjectTypeNode[cache.size()] );
-    }
+    }   
 
     /**
-     * Retrieve all <code>ObjectTypeNode</code> children of this node.
-     * 
-     * @return The <code>Set</code> of <code>ObjectTypeNodes</code>.
-     */
-    Collection getObjectTypeNodes() {
-        return this.objectTypeNodes.values();
-    }
-
-    /**
-     * Retrieve an <code>Iterator</code> over the <code>ObjectTypeNode</code>
-     * children of this node.
-     * 
-     * @return An <code>Iterator</code> over <code>ObjectTypeNodes</code>.
-     */
-    Iterator objectTypeNodeIterator() {
-        return this.objectTypeNodes.values().iterator();
-    }
-
-    /**
-     * Retrieve an <code>ObjectTypeNode</code> keyed by
-     * <code>ObjectType</code>.
-     * 
-     * @param objectType
-     *            The <code>ObjectType</code> key.
-     * 
-     * @return The matching <code>ObjectTypeNode</code> if one has already
-     *         been created, else <code>null</code>.
-     */
-    ObjectTypeNode getObjectTypeNode(final ObjectType objectType) {
-        return (ObjectTypeNode) this.objectTypeNodes.get( objectType );
-    }
-
-    /**
-     * Add an <code>ObjectTypeNode</code> child to this <code>Rete</code>.
-     * 
-     * @param node
-     *            The node to add.
-     */
-    private void addObjectTypeNode(final ObjectTypeNode node) {
-        this.lastAddedNode = node;
-        this.objectTypeNodes.put( node.getObjectType(),
-                                  node );
-    }
-
-    /**
      * Adds the <code>TupleSink</code> so that it may receive
      * <code>Tuples</code> propagated from this <code>TupleSource</code>.
      * 
@@ -253,7 +175,10 @@
      *            <code>Tuples</code>.
      */
     protected void addObjectSink(final ObjectSink objectSink) {
-        addObjectTypeNode( (ObjectTypeNode) objectSink );
+        ObjectTypeNode node = ( ObjectTypeNode  ) objectSink;
+        this.objectTypeNodes.put( node.getObjectType(),
+                                  node,
+                                  false );
     }
 
     protected void removeObjectSink(final ObjectSink objectSink) {
@@ -261,41 +186,22 @@
     }
 
     public void attach() {
-        // do nothing this is the root node
+        throw new UnsupportedOperationException( "cannot call attach() from the root Rete node");
     }
 
     public void attach(final InternalWorkingMemory[] workingMemories) {
-        // do nothing this is the root node        
+        throw new UnsupportedOperationException( "cannot call attach() from the root Rete node");        
     }
 
-    // when a new ObjectTypeNode is added, check for possible 
-    // propagations into the new node
-    public void updateNewNode(final InternalWorkingMemory workingMemory,
-                              final PropagationContext context) {
-        if ( this.lastAddedNode != null ) {
-            final ObjectType objType = this.lastAddedNode.getObjectType();
-            for ( final Iterator i = workingMemory.getFactHandleMap().entrySet().iterator(); i.hasNext(); ) {
-                final Map.Entry entry = (Map.Entry) i.next();
-                final DefaultFactHandle handle = (DefaultFactHandle) entry.getValue();
-                if ( objType.matches( handle.getObject() ) ) {
-                    this.lastAddedNode.assertObject( handle,
-                                                     context,
-                                                     workingMemory );
-                }
-            }
-            this.lastAddedNode = null;
-        }
-    }
-
     public void remove(final BaseNode node,
                        final InternalWorkingMemory[] workingMemories) {
-        final ObjectTypeNode objectTypeNode = (ObjectTypeNode) node;
+        final ObjectTypeNode objectTypeNode = (ObjectTypeNode) node;                        
         removeObjectSink( objectTypeNode );
         //@todo: we really should attempt to clear the memory cache for this ObjectTypeNode        
     }
 
     public Object createMemory(final RuleBaseConfiguration config) {
-        return new HashMap();
+        return new ObjectHashMap();
     }
 
     public int hashCode() {
@@ -318,11 +224,16 @@
     public void updateSink(ObjectSink sink,
                            PropagationContext context,
                            InternalWorkingMemory workingMemory) {
-        for ( final Iterator i = workingMemory.getFactHandleMap().entrySet().iterator(); i.hasNext(); ) {
-            final Map.Entry entry = (Map.Entry) i.next();
-            final DefaultFactHandle handle = (DefaultFactHandle) entry.getValue();
-            sink.assertObject( handle, context, workingMemory );
-        }
+        ObjectTypeNode node  = ( ObjectTypeNode) sink;
+        for ( final java.util.Iterator i = workingMemory.getFactHandleMap().entrySet().iterator(); i.hasNext(); ) {
+            final java.util.Map.Entry entry = (java.util.Map.Entry) i.next();
+            final InternalFactHandle handle = (InternalFactHandle) entry.getValue();
+            if ( node.matches( handle.getObject() ) ) {                
+                node.assertObject( handle,
+                                   context,
+                                   workingMemory );
+            }
+        }                
     }
 
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java	2006-10-03 22:47:09 UTC (rev 6564)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java	2006-10-03 23:00:21 UTC (rev 6565)
@@ -52,7 +52,6 @@
 import org.drools.rule.Rule;
 import org.drools.spi.FieldConstraint;
 import org.drools.spi.FieldValue;
-import org.drools.spi.ObjectTypeResolver;
 
 /**
  * Builds the Rete-OO network for a <code>Package</code>.
@@ -83,8 +82,6 @@
 
     private transient ReteooWorkingMemory[] workingMemories;
 
-    private final ObjectTypeResolver        resolver;
-
     /** Nodes that have been attached. */
     private final Map                       attachedNodes;
 
@@ -110,11 +107,9 @@
      * Construct a <code>Builder</code> against an existing <code>Rete</code>
      * network.
      */
-    ReteooBuilder(final ReteooRuleBase ruleBase,
-                  final ObjectTypeResolver resolver) {
+    ReteooBuilder(final ReteooRuleBase ruleBase) {
         this.ruleBase = ruleBase;
         this.rete = this.ruleBase.getRete();
-        this.resolver = resolver;
         this.attachedNodes = new HashMap();
         this.rules = new HashMap();
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java	2006-10-03 22:47:09 UTC (rev 6564)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java	2006-10-03 23:00:21 UTC (rev 6565)
@@ -30,14 +30,10 @@
 import org.drools.WorkingMemory;
 import org.drools.common.AbstractRuleBase;
 import org.drools.common.DefaultFactHandle;
-import org.drools.common.PropagationContextImpl;
-import org.drools.common.AbstractWorkingMemory.WorkingMemoryRetractAction;
 import org.drools.rule.CompositePackageClassLoader;
 import org.drools.rule.InvalidPatternException;
 import org.drools.rule.Rule;
-import org.drools.spi.ClassObjectTypeResolver;
 import org.drools.spi.FactHandleFactory;
-import org.drools.spi.ObjectTypeResolver;
 import org.drools.spi.PropagationContext;
 
 /**
@@ -125,10 +121,8 @@
         this.globals = new HashMap();
         this.workingMemories = new WeakHashMap();
 
-        final ObjectTypeResolver resolver = new ClassObjectTypeResolver();
-        this.rete = new Rete( resolver );
-        this.reteooBuilder = new ReteooBuilder( this,
-                                                resolver );
+        this.rete = new Rete( );
+        this.reteooBuilder = new ReteooBuilder( this );
     }
 
     /**
@@ -196,14 +190,6 @@
                                 workingMemory );
     }
 
-    public void modifyObject(final FactHandle handle,
-                             final PropagationContext context,
-                             final ReteooWorkingMemory workingMemory) throws FactException {
-        getRete().modifyObject( (DefaultFactHandle) handle,
-                                context,
-                                workingMemory );
-    }
-
     /**
      * Retract a fact object.
      * 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/SingleObjectSinkAdapter.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/SingleObjectSinkAdapter.java	2006-10-03 22:47:09 UTC (rev 6564)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/SingleObjectSinkAdapter.java	2006-10-03 23:00:21 UTC (rev 6565)
@@ -20,13 +20,6 @@
         this.sink.assertObject( handle, context, workingMemory );
 
     }
-
-    public void propagateModifyObject(InternalFactHandle handle,
-                                      PropagationContext context,
-                                      InternalWorkingMemory workingMemory) {
-        this.sink.modifyObject( handle, context, workingMemory );
-
-    }
     
     public void propagateRetractObject(InternalFactHandle handle,
                                        PropagationContext context,
@@ -36,14 +29,6 @@
 
     }    
 
-    public void propagateNewObjectSink(InternalFactHandle handle,
-                                       PropagationContext context,
-                                       InternalWorkingMemory workingMemory) {
-        // do nothing as this cannot have new sinks
-        throw new RuntimeException( "This is a bug you cannot update new data through this single sink adapter" );
-
-    }
-
     public ObjectSink[] getSinks() {
         return new ObjectSink[] { this.sink };
     }

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ObjectTypeResolver.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ObjectTypeResolver.java	2006-10-03 22:47:09 UTC (rev 6564)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ObjectTypeResolver.java	2006-10-03 23:00:21 UTC (rev 6565)
@@ -1,25 +0,0 @@
-package org.drools.spi;
-
-/*
- * Copyright 2005 JBoss Inc
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import java.io.Serializable;
-
-public interface ObjectTypeResolver
-    extends
-    Serializable {
-    ObjectType resolve(Object object);
-}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/AbstractHashTable.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/AbstractHashTable.java	2006-10-03 22:47:09 UTC (rev 6564)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/AbstractHashTable.java	2006-10-03 23:00:21 UTC (rev 6565)
@@ -155,6 +155,10 @@
     public int size() {
         return this.size;
     }
+    
+    public boolean isEmpty() {
+        return this.size == 0;
+    }
 
     protected int indexOf(int hashCode,
                           int dataSize) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/ObjectHashMap.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/ObjectHashMap.java	2006-10-03 22:47:09 UTC (rev 6564)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/ObjectHashMap.java	2006-10-03 23:00:21 UTC (rev 6565)
@@ -28,6 +28,7 @@
         int index = indexOf( hashCode,
                              table.length );
 
+        //@todo when in debug for ReteTest and the testCached method, something slows down  here???
         // scan the linked entries to see if it exists
         if ( checkExists ) {
             ObjectEntry current = (ObjectEntry) this.table[index];

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockObjectSink.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockObjectSink.java	2006-10-03 22:47:09 UTC (rev 6564)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockObjectSink.java	2006-10-03 23:00:21 UTC (rev 6565)
@@ -23,13 +23,16 @@
 import org.drools.common.InternalWorkingMemory;
 import org.drools.spi.PropagationContext;
 
-public class MockObjectSink
+public class MockObjectSink 
     implements
-    ObjectSink {
+    ObjectSinkNode {
     private final List asserted  = new ArrayList();
     private final List retracted = new ArrayList();
     private final List modified  = new ArrayList();
 
+    private ObjectSinkNode        previousObjectSinkNode;
+    private ObjectSinkNode        nextObjectSinkNode;
+    
     public void assertObject(final InternalFactHandle handle,
                              final PropagationContext context,
                              final InternalWorkingMemory workingMemory) {
@@ -61,4 +64,40 @@
         return this.modified;
     }
 
+    /**
+     * Returns the next node
+     * @return
+     *      The next ObjectSinkNode
+     */
+    public ObjectSinkNode getNextObjectSinkNode() {
+        return this.nextObjectSinkNode;
+    }
+
+    /**
+     * Sets the next node 
+     * @param next
+     *      The next ObjectSinkNode
+     */
+    public void setNextObjectSinkNode(ObjectSinkNode next) {
+        this.nextObjectSinkNode = next;
+    }
+
+    /**
+     * Returns the previous node
+     * @return
+     *      The previous ObjectSinkNode
+     */
+    public ObjectSinkNode getPreviousObjectSinkNode() {
+        return this.previousObjectSinkNode;
+    }
+
+    /**
+     * Sets the previous node 
+     * @param previous
+     *      The previous ObjectSinkNode
+     */
+    public void setPreviousObjectSinkNode(ObjectSinkNode previous) {
+        this.previousObjectSinkNode = previous;
+    }
+
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ObjectTypeNodeTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ObjectTypeNodeTest.java	2006-10-03 22:47:09 UTC (rev 6564)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ObjectTypeNodeTest.java	2006-10-03 23:00:21 UTC (rev 6565)
@@ -16,6 +16,7 @@
  * limitations under the License.
  */
 
+import java.lang.reflect.Field;
 import java.util.List;
 
 import org.drools.DroolsTestCase;
@@ -23,9 +24,12 @@
 import org.drools.RuleBaseFactory;
 import org.drools.base.ClassObjectType;
 import org.drools.common.DefaultFactHandle;
+import org.drools.common.InternalFactHandle;
 import org.drools.common.PropagationContextImpl;
 import org.drools.spi.ObjectType;
 import org.drools.spi.PropagationContext;
+import org.drools.util.FactHashTable;
+import org.drools.util.ObjectHashMap;
 import org.drools.util.PrimitiveLongMap;
 
 public class ObjectTypeNodeTest extends DroolsTestCase {
@@ -42,16 +46,20 @@
         assertEquals( 1,
                       objectTypeNode.getId() );
 
-        assertLength( 0,
-                      source.getObjectTypeNodes() );
+        Field field =  Rete.class.getDeclaredField( "objectTypeNodes" );
+        field.setAccessible( true );
+        ObjectHashMap map = ( ObjectHashMap ) field.get( source );
+        
+        assertEquals( 0,
+                      map.size() );
 
         objectTypeNode.attach();
 
-        assertLength( 1,
-                      source.getObjectTypeNodes() );
+        assertEquals( 1,
+                      map.size() );
 
         assertSame( objectTypeNode,
-                    source.getObjectTypeNode( objectType ) );
+                    map.get( objectType ) );
     }
 
     public void testAssertObject() throws Exception {
@@ -60,10 +68,11 @@
                                                                        null,
                                                                        null );
 
+        ReteooRuleBase ruleBase  = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
         final ReteooWorkingMemory workingMemory = new ReteooWorkingMemory( 1,
-                                                                           (ReteooRuleBase) RuleBaseFactory.newRuleBase() );
+                                                                           ruleBase );
 
-        final Rete source = new Rete();
+        final Rete source = ruleBase.getRete();
 
         final ObjectTypeNode objectTypeNode = new ObjectTypeNode( 1,
                                                                   new ClassObjectType( String.class ),
@@ -74,26 +83,25 @@
 
         final Object string1 = "cheese";
 
-        final DefaultFactHandle handle1 = (DefaultFactHandle) workingMemory.assertObject( string1 );
+        final InternalFactHandle handle1 = (InternalFactHandle) workingMemory.assertObject( string1 );
 
-        /* should assert as ObjectType matches */
+        // should assert as ObjectType matches
         objectTypeNode.assertObject( handle1,
                                      context,
                                      workingMemory );
 
-        /* make sure just string1 was asserted */
+        // make sure just string1 was asserted 
         final List asserted = sink.getAsserted();
         assertLength( 1,
                       asserted );
         assertSame( string1,
                     workingMemory.getObject( (DefaultFactHandle) ((Object[]) asserted.get( 0 ))[0] ) );
 
-        /* check asserted object was added to memory */
-        final PrimitiveLongMap memory = (PrimitiveLongMap) workingMemory.getNodeMemory( objectTypeNode );
+        // check asserted object was added to memory
+        final FactHashTable memory = (FactHashTable) workingMemory.getNodeMemory( objectTypeNode );
         assertEquals( 1,
                       memory.size() );
-        assertSame( handle1,
-                    memory.get( handle1.getId() ) );
+        assertTrue( memory.contains( handle1 ) );
     }
 
     public void testMemory() {
@@ -104,7 +112,7 @@
                                                                   new ClassObjectType( String.class ),
                                                                   new Rete() );
 
-        final PrimitiveLongMap memory = (PrimitiveLongMap) workingMemory.getNodeMemory( objectTypeNode );
+        final FactHashTable memory = (FactHashTable) workingMemory.getNodeMemory( objectTypeNode );
 
         assertNotNull( memory );
     }
@@ -159,7 +167,7 @@
                                      context,
                                      workingMemory );
         /* check asserted object was added to memory */
-        final PrimitiveLongMap memory = (PrimitiveLongMap) workingMemory.getNodeMemory( objectTypeNode );
+        final FactHashTable memory = (FactHashTable) workingMemory.getNodeMemory( objectTypeNode );
         assertEquals( 1,
                       memory.size() );
 
@@ -179,7 +187,7 @@
                     ((Object[]) retracted.get( 0 ))[0] );
     }
 
-    public void testUpdateNewNode() throws FactException {
+    public void testUpdateSink() throws FactException {
         // Tests that when new child is added only the last added child is
         // updated
         // When the attachingNewNode flag is set
@@ -217,27 +225,22 @@
                                      context,
                                      workingMemory );
 
-        assertLength( 2,
-                      sink1.getAsserted() );
+        assertEquals( 2,
+                      sink1.getAsserted().size() );
 
-        objectTypeNode.attachingNewNode = true;
-
         final MockObjectSink sink2 = new MockObjectSink();
         objectTypeNode.addObjectSink( sink2 );
 
-        assertLength( 0,
-                      sink2.getAsserted() );
+        assertEquals( 0,
+                      sink2.getAsserted().size() );
 
-        objectTypeNode.updateNewNode( workingMemory,
-                                      null );
+        objectTypeNode.updateSink( sink2,
+                                   null,
+                                   workingMemory );
 
-        objectTypeNode.attachingNewNode = false;
+        assertEquals( 2,
+                      sink2.getAsserted().size() );
 
-        assertLength( 2,
-                      sink1.getAsserted() );
-        assertLength( 2,
-                      sink2.getAsserted() );
-
         final Object string3 = "water";
 
         final DefaultFactHandle handle3 = new DefaultFactHandle( 3,
@@ -247,11 +250,11 @@
                                      context,
                                      workingMemory );
 
-        assertLength( 3,
-                      sink1.getAsserted() );
+        assertEquals( 3,
+                      sink1.getAsserted().size() );
 
-        assertLength( 3,
-                      sink2.getAsserted() );
+        assertEquals( 3,
+                      sink2.getAsserted().size() );
 
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ReteTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ReteTest.java	2006-10-03 22:47:09 UTC (rev 6564)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ReteTest.java	2006-10-03 23:00:21 UTC (rev 6565)
@@ -16,6 +16,7 @@
  * limitations under the License.
  */
 
+import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
@@ -28,6 +29,7 @@
 import org.drools.RuleBaseFactory;
 import org.drools.base.ClassObjectType;
 import org.drools.common.DefaultFactHandle;
+import org.drools.util.ObjectHashMap;
 
 /**
  * @author mproctor
@@ -55,16 +57,16 @@
                                                                   rete );
         stringTypeNode.attach();
 
-        final Collection objectTypeNodes = rete.getObjectTypeNodes();
+        Field field =  Rete.class.getDeclaredField( "objectTypeNodes" );
+        field.setAccessible( true );
+        ObjectHashMap map = ( ObjectHashMap ) field.get( rete );
 
         // Check the ObjectTypeNodes are correctly added to Rete
         assertEquals( 2,
-                      objectTypeNodes.size() );
+                      map.size() );
 
-        assertContains( objectTypeNode,
-                        objectTypeNodes );
-        assertContains( stringTypeNode,
-                        objectTypeNodes );
+        assertNotNull( map.get( new ClassObjectType( Object.class ) ) );
+        assertNotNull( map.get( new ClassObjectType( String.class ) ) );
     }
 
     /**
@@ -83,14 +85,22 @@
                                                             new ClassObjectType( List.class ),
                                                             rete );
         objectTypeNode.attach();
+        MockObjectSink sink = new MockObjectSink();
+        objectTypeNode.addObjectSink( sink );
+        
         objectTypeNode = new ObjectTypeNode( 1,
                                              new ClassObjectType( Collection.class ),
                                              rete );
         objectTypeNode.attach();
+        sink = new MockObjectSink();
+        objectTypeNode.addObjectSink( sink );        
+        
         objectTypeNode = new ObjectTypeNode( 1,
                                              new ClassObjectType( ArrayList.class ),
                                              rete );
         objectTypeNode.attach();
+        sink = new MockObjectSink();
+        objectTypeNode.addObjectSink( sink );
 
         // ArrayList matches all three ObjectTypeNodes
         final DefaultFactHandle h1 = new DefaultFactHandle( 1,
@@ -105,7 +115,7 @@
                            null,
                            workingMemory );
 
-        final Map map = (HashMap) workingMemory.getNodeMemory( rete );
+        final ObjectHashMap map = (ObjectHashMap) workingMemory.getNodeMemory( rete );
         assertLength( 3,
                       (ObjectTypeNode[]) map.get( ArrayList.class ) );
 
@@ -130,7 +140,8 @@
                                                                   new ClassObjectType( List.class ),
                                                                   rete );
         objectTypeNode.attach();
-        objectTypeNode.addObjectSink( new MockObjectSink() );
+        MockObjectSink sink1 = new MockObjectSink();
+        objectTypeNode.addObjectSink( sink1 );
 
         // There are no String ObjectTypeNodes, make sure its not propagated
 
@@ -142,7 +153,6 @@
                            null,
                            workingMemory );
 
-        final MockObjectSink sink1 = (MockObjectSink) objectTypeNode.getObjectSinksAsList().get( 0 );
         assertLength( 0,
                       sink1.getAsserted() );
 
@@ -179,7 +189,8 @@
                                                                   new ClassObjectType( List.class ),
                                                                   rete );
         objectTypeNode.attach();
-        objectTypeNode.addObjectSink( new MockObjectSink() );
+        MockObjectSink sink1 = new MockObjectSink();
+        objectTypeNode.addObjectSink( sink1 );
 
         // There are no String ObjectTypeNodes, make sure its not propagated
         final String string = "String";
@@ -189,8 +200,6 @@
         rete.assertObject( h1,
                            null,
                            workingMemory );
-
-        final MockObjectSink sink1 = (MockObjectSink) objectTypeNode.getObjectSinksAsList().get( 0 );
         assertLength( 0,
                       sink1.getRetracted() );
 
@@ -199,6 +208,11 @@
         final DefaultFactHandle h2 = new DefaultFactHandle( 1,
                                                             list );
 
+        // need  to assert first, to force it to build  up the cache
+        rete.assertObject( h2,
+                           null,
+                           workingMemory );
+        
         rete.retractObject( h2,
                             null,
                             workingMemory );




More information about the jboss-svn-commits mailing list