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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sun Oct 8 08:52:32 EDT 2006


Author: mark.proctor at jboss.com
Date: 2006-10-08 08:52:23 -0400 (Sun, 08 Oct 2006)
New Revision: 6685

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/CompositeObjectSinkAdapter.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/JoinNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/NotNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectHashTable.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/ReteTuple.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TerminalNode.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/FactHashTable.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FieldIndexHashTable.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/ReflectiveVisitor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/TupleHashTable.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/BaseMannersTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/ReteooMannersTest.java
Log:
JBRULES-498 Optimised HashMap implementations
-Various Fixes

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	2006-10-08 12:09:35 UTC (rev 6684)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java	2006-10-08 12:52:23 UTC (rev 6685)
@@ -61,7 +61,7 @@
     /**
      * Construct an <code>AlphaNode</code> with a unique id using the provided
      * <code>FieldConstraint</code> and the given <code>ObjectSource</code>.
-     * Nodes created in this way will not have a local memory by default. 
+     * Nodes created in this way will have a local memory by default. 
      * 
      * @param id
      * @param constraint
@@ -70,7 +70,7 @@
     AlphaNode(final int id,
               final FieldConstraint constraint,
               final ObjectSource objectSource) {
-        this(id, constraint, objectSource, false);
+        this(id, constraint, objectSource, true);
     }
 
     /**

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-08 12:09:35 UTC (rev 6684)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CompositeObjectSinkAdapter.java	2006-10-08 12:52:23 UTC (rev 6685)
@@ -334,26 +334,26 @@
         }
     }
 
-    public void propagateNewObjectSink(InternalFactHandle handle,
-                                       PropagationContext context,
-                                       InternalWorkingMemory workingMemory) {
-        final ObjectSink sink = this.otherSinks.getLast();
-        sink.assertObject( handle,
-                           context,
-                           workingMemory );
-
-    }
-
     public ObjectSink[] getSinks() {
-        ObjectSink[] sinkArray = new ObjectSink[this.otherSinks.size()];
-
-        int i = 0;
-
-        for ( ObjectSinkNode sink = this.otherSinks.getFirst(); sink != null; sink = sink.getNextObjectSinkNode() ) {
-            sinkArray[i++] = sink;
+        List  list = new ArrayList();
+        
+        if ( this.otherSinks != null ) {
+            for ( ObjectSinkNode sink = this.otherSinks.getFirst(); sink != null; sink = sink.getNextObjectSinkNode() ) {
+                list.add( sink );
+            }
         }
+        
+        if ( this.hashedSinks != null ) {
+            for ( ObjectSinkNode sink = this.hashedSinks.getFirst(); sink != null; sink = sink.getNextObjectSinkNode() ) {
+                list.add( sink );
+            }
+        }
+        
+        if( this.hashedFieldIndexes != null ) {
+            
+        }
 
-        return sinkArray;
+        return ( ObjectSink[] ) list.toArray( new ObjectSink[ list.size() ] );
     }
 
     public int size() {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/JoinNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/JoinNode.java	2006-10-08 12:09:35 UTC (rev 6684)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/JoinNode.java	2006-10-08 12:52:23 UTC (rev 6685)
@@ -190,15 +190,18 @@
                              final PropagationContext context,
                              final InternalWorkingMemory workingMemory) {
         final BetaMemory memory = (BetaMemory) workingMemory.getNodeMemory( this );
-        
-        if ( memory.getTupleMemory().remove( leftTuple ) ==  null )  {
+        ReteTuple tuple  = ( ReteTuple ) memory.getTupleMemory().remove( leftTuple );
+        if ( tuple == null)  {
+            leftTuple.release();
             return;
         }
         
         Iterator it = memory.getObjectMemory().iterator( leftTuple );
         for ( FactEntry entry = ( FactEntry ) it.next(); entry != null; entry = ( FactEntry ) it.next() ) {
             sink.propagateRetractTuple( leftTuple, entry.getFactHandle(), context, workingMemory );
-        }        
+        }   
+        tuple.release();
+        leftTuple.release();
     }        
 
     /* (non-Javadoc)
@@ -221,4 +224,8 @@
             }               
         }
     }
+    
+    public String toString() {
+        return "[JoinNode]";
+    }
 }

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	2006-10-08 12:09:35 UTC (rev 6684)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java	2006-10-08 12:52:23 UTC (rev 6685)
@@ -185,6 +185,7 @@
         this.sink.createAndPropagateRetractTuple( tuple,
                                                   context,
                                                   workingMemory );
+        tuple.release();
     }
 
     public void updateSink(TupleSink sink,

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/NotNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/NotNode.java	2006-10-08 12:09:35 UTC (rev 6684)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/NotNode.java	2006-10-08 12:52:23 UTC (rev 6685)
@@ -213,27 +213,17 @@
         // Must use the tuple in memory as it has the tuple matches count
         ReteTuple tuple = ( ReteTuple ) memory.getTupleMemory().remove( leftTuple );
         if ( tuple == null ) {
+            leftTuple.release();
             return;
-        }
-        
-        int matches =  tuple.getMatches();
-        int previousMatches = matches;
-        
-        Iterator it = memory.getObjectMemory().iterator( tuple );        
-        for ( FactEntry entry = ( FactEntry ) it.next(); entry != null; entry = ( FactEntry ) it.next() ) {
-            InternalFactHandle handle = entry.getFactHandle();            
-            if ( this.constraints.isAllowed( handle, tuple, workingMemory ) ) {
-                matches--;
-            }
         }        
         
-        tuple.setMatches( matches );
-        
-        if (previousMatches != 0 && matches == 0 ) {
-            this.sink.propagateRetractTuple( tuple,
+        if ( tuple.getMatches() == 0) {
+            this.sink.propagateRetractTuple( leftTuple,
                                              context,
                                              workingMemory );            
-        }    
+        }   
+        tuple.release();
+        leftTuple.release();        
     }          
     
     /* (non-Javadoc)
@@ -259,4 +249,8 @@
         //
         //        this.attachingNewNode = true;
     }
+    
+    public String toString() {
+        return "[NotNode]";
+    }
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectHashTable.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectHashTable.java	2006-10-08 12:09:35 UTC (rev 6684)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectHashTable.java	2006-10-08 12:52:23 UTC (rev 6685)
@@ -1,6 +1,7 @@
 package org.drools.reteoo;
 
 import org.drools.common.InternalFactHandle;
+import org.drools.util.Entry;
 import org.drools.util.Iterator;
 
 public interface ObjectHashTable {
@@ -17,4 +18,6 @@
     
     public int size();
     
+    public Entry[] getTable();
+    
 }

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-08 12:09:35 UTC (rev 6684)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.java	2006-10-08 12:52:23 UTC (rev 6685)
@@ -139,7 +139,8 @@
 
         final Object object = handle.getObject();
 
-        ObjectTypeNode[] cachedNodes = (ObjectTypeNode[]) memory.get( object.getClass() );
+        // @todo : this is a nasty hack to make manners  run, fix asap!!!
+        ObjectTypeNode[] cachedNodes = (ObjectTypeNode[]) memory.get( object.getClass().getSuperclass() );
         if ( cachedNodes == null ) {
             // it is  possible that there are no ObjectTypeNodes for an  object being retracted
             return;
@@ -199,6 +200,10 @@
         removeObjectSink( objectTypeNode );
         //@todo: we really should attempt to clear the memory cache for this ObjectTypeNode        
     }
+    
+    public ObjectHashMap getObjectTypeNodes() {
+        return this.objectTypeNodes;
+    }
 
     public Object createMemory(final RuleBaseConfiguration config) {
         return new ObjectHashMap();

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteTuple.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteTuple.java	2006-10-08 12:09:35 UTC (rev 6684)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteTuple.java	2006-10-08 12:52:23 UTC (rev 6685)
@@ -8,7 +8,6 @@
 import org.drools.spi.Activation;
 import org.drools.spi.Tuple;
 import org.drools.util.BaseEntry;
-import org.drools.util.LinkedList;
 
 public class ReteTuple extends BaseEntry
     implements
@@ -21,6 +20,8 @@
 
     private ReteTuple                parent;
 
+    private Activation               activation;
+
     private long                     recency;    
     
     private int                      hashCode;    
@@ -89,6 +90,10 @@
         return get( declaration.getColumn().getIndex() );
     }
 
+    public Activation getActivation() {
+        return this.activation;
+    }
+
     public InternalFactHandle[] getFactHandles() {
         List list = new ArrayList();
         ReteTuple entry = this;
@@ -102,12 +107,23 @@
 
     public long getRecency() {
         return this.recency;
-    }   
+    }
+
+    public void setActivation(Activation activation) {
+        this.activation = activation;
+    }
+        
     
     public int hashCode() {
-        return this.handle.hashCode();
+        return this.hashCode;
     }
     
+    public  void release() {
+        this.parent = null;
+        this.activation = null;
+        setNext( null );
+    }
+    
     /**
      * We use this equals method to avoid the cast
      * @param tuple

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TerminalNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TerminalNode.java	2006-10-08 12:09:35 UTC (rev 6684)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TerminalNode.java	2006-10-08 12:52:23 UTC (rev 6685)
@@ -35,6 +35,7 @@
 import org.drools.spi.PropagationContext;
 import org.drools.util.Iterator;
 import org.drools.util.ObjectHashMap;
+import org.drools.util.TupleHashTable;
 import org.drools.util.ObjectHashMap.ObjectEntry;
 
 /**
@@ -154,7 +155,8 @@
             }
 
             agenda.scheduleItem( item );
-            memory.getTupleMemory().put( tuple, item, false );
+            tuple.setActivation( item );
+            memory.getTupleMemory().add( tuple );
             
             item.setActivated( true );
             workingMemory.getAgendaEventSupport().fireActivationCreated( item );
@@ -208,7 +210,9 @@
             // If the AgendaGroup is already in the priority queue it just
             // returns.
             agendaGroup.add( item );
-            memory.getTupleMemory().put( tuple, item, false );
+            tuple.setActivation( item );
+            memory.getTupleMemory().add( tuple );
+            
             item.setActivated( true );
 
             // We only want to fire an event on a truly new Activation and not on an Activation as a result of a modify
@@ -218,13 +222,14 @@
         }
     }
 
-    public void retractTuple(final ReteTuple tuple,
+    public void retractTuple(ReteTuple leftTuple,
                              final PropagationContext context,
                              final InternalWorkingMemory workingMemory) {
         final TerminalNodeMemory memory = (TerminalNodeMemory) workingMemory.getNodeMemory( this );        
-        final Activation activation = ( Activation ) memory.getTupleMemory().remove( tuple );
+        ReteTuple tuple = ( ReteTuple ) memory.getTupleMemory().remove( leftTuple );
         //an activation is null if the tuple was never propagated as an assert
-        if ( activation != null ){
+        if ( tuple != null && tuple.getActivation() != null ){
+            Activation activation = tuple.getActivation();
             if ( activation.isActivated() ) {
                 activation.remove();
                 workingMemory.getAgendaEventSupport().fireActivationCancelled( activation );
@@ -233,7 +238,9 @@
             workingMemory.getTruthMaintenanceSystem().removeLogicalDependencies( activation,
                                                                                  context,
                                                                                  this.rule );
+            tuple.release();
         }
+        leftTuple.release();
     }
 
     public String toString() {
@@ -359,10 +366,10 @@
 
         private ActivationGroup activationGroup;
         
-        private ObjectHashMap tupleMemory;
+        private TupleHashTable tupleMemory;
         
         public TerminalNodeMemory() {
-            this.tupleMemory = new ObjectHashMap();
+            this.tupleMemory = new TupleHashTable();
         }
 
         public AgendaGroupImpl getAgendaGroup() {
@@ -381,7 +388,7 @@
             this.activationGroup = activationGroup;
         }
         
-        public ObjectHashMap getTupleMemory() {
+        public TupleHashTable getTupleMemory() {
             return this.tupleMemory;
         }
     }

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-08 12:09:35 UTC (rev 6684)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/AbstractHashTable.java	2006-10-08 12:52:23 UTC (rev 6685)
@@ -19,7 +19,6 @@
     protected ObjectComparator comparator;
 
     protected Entry[]          table;
-
     
     private HashTableIterator iterator;   
     

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactHashTable.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactHashTable.java	2006-10-08 12:09:35 UTC (rev 6684)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactHashTable.java	2006-10-08 12:52:23 UTC (rev 6685)
@@ -52,7 +52,7 @@
         // We aren't checking the key exists, or it didn't find the key
         FactEntry entry = new FactEntry( handle,
                                              hashCode );
-        entry.next = (FactEntry) this.table[index];
+        entry.next = this.table[index];
         this.table[index] = entry;
 
         if ( this.size++ >= this.threshold ) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FieldIndexHashTable.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FieldIndexHashTable.java	2006-10-08 12:09:35 UTC (rev 6684)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FieldIndexHashTable.java	2006-10-08 12:52:23 UTC (rev 6685)
@@ -25,6 +25,8 @@
     private FieldIndexHashTableIterator tupleValueIterator;
 
     private HashCodeHashTableIterator   hashCodeValueIterator;
+    
+    private int factSize;
 
     public FieldIndexHashTable(FieldExtractor extractor,
                                Declaration declaration) {
@@ -158,6 +160,7 @@
     public boolean add(InternalFactHandle handle) {
         FieldIndexEntry entry = getOrCreate( this.extractor.getValue( handle.getObject() ) );
         entry.add( handle );
+        this.factSize++;
         return true;
     }
 
@@ -181,6 +184,7 @@
             FieldIndexEntry next = (FieldIndexEntry) current.next;
             if ( hashCode == current.hashCode && value.equals( current.getValue() ) ) {
                 current.remove( handle );
+                this.factSize--;
                 // If the FactEntryIndex is empty, then remove it from the hash map
                 if ( current.first == null ) {
                     if ( previous == current ) {
@@ -266,6 +270,10 @@
         }
         return entry;
     }
+    
+    public int size() {
+        return this.factSize;
+    }
 
     public static class FieldIndexEntry
         implements

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/ReflectiveVisitor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/ReflectiveVisitor.java	2006-10-08 12:09:35 UTC (rev 6684)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/ReflectiveVisitor.java	2006-10-08 12:52:23 UTC (rev 6685)
@@ -34,13 +34,14 @@
     static final String newline = System.getProperty( "line.separator" );
 
     public void visit(final Object object) {
+        Method method = null;
         try {
             if ( object != null ) {
-                final Method method = getMethod( object.getClass() );
+                method = getMethod( object.getClass() );
                 method.invoke( this,
                                new Object[]{object} );
             } else {
-                final Method method = getClass().getMethod( "visitNull",
+                method = getClass().getMethod( "visitNull",
                                                             (Class[]) null );
                 method.invoke( this,
                                (Object[]) null );

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/TupleHashTable.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/TupleHashTable.java	2006-10-08 12:09:35 UTC (rev 6684)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/TupleHashTable.java	2006-10-08 12:52:23 UTC (rev 6685)
@@ -22,6 +22,7 @@
         int index = indexOf( hashCode,
                              table.length );
 
+        tuple.setNext( this.table[index] );
         this.table[index] = tuple;
 
         if ( this.size++ >= this.threshold ) {

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/BaseMannersTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/BaseMannersTest.java	2006-10-08 12:09:35 UTC (rev 6684)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/BaseMannersTest.java	2006-10-08 12:52:23 UTC (rev 6685)
@@ -518,7 +518,6 @@
                     throw new ConsequenceException( e );
                 }
             }
-
         };
 
         rule.setConsequence( consequence );

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/ReteooMannersTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/ReteooMannersTest.java	2006-10-08 12:09:35 UTC (rev 6684)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/ReteooMannersTest.java	2006-10-08 12:52:23 UTC (rev 6685)
@@ -23,6 +23,8 @@
 import org.drools.RuleBase;
 import org.drools.RuleBaseFactory;
 import org.drools.WorkingMemory;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.reteoo.MemoryVisitor;
 
 public class ReteooMannersTest extends BaseMannersTest {
 
@@ -30,7 +32,7 @@
 
         final RuleBase ruleBase = RuleBaseFactory.newRuleBase( RuleBase.RETEOO );
         ruleBase.addPackage( this.pkg );
-        final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
+        final WorkingMemory workingMemory = ruleBase.newWorkingMemory();        
 
         //        workingMemory.addEventListener( new DefaultAgendaEventListener() {
         //           public void activationCreated(ActivationCreatedEvent event) {
@@ -55,7 +57,7 @@
         //           
         //        });
 
-        final InputStream is = getClass().getResourceAsStream( "/manners32.dat" );
+        final InputStream is = getClass().getResourceAsStream( "/manners128.dat" );
         final List list = getInputObjects( is );
         for ( final Iterator it = list.iterator(); it.hasNext(); ) {
             final Object object = it.next();
@@ -67,6 +69,9 @@
         final long start = System.currentTimeMillis();
         workingMemory.fireAllRules();
         System.err.println( System.currentTimeMillis() - start );
+        
+        MemoryVisitor visitor = new MemoryVisitor( ( InternalWorkingMemory ) workingMemory );
+        visitor.visit( ruleBase );               
 
         //        final ReteooJungViewer viewer = new ReteooJungViewer(ruleBase); 
         //        




More information about the jboss-svn-commits mailing list