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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Oct 25 11:41:02 EDT 2006


Author: michael.neale at jboss.com
Date: 2006-10-25 11:40:56 -0400 (Wed, 25 Oct 2006)
New Revision: 7109

Modified:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CompositeObjectSinkAdapter.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/CompositeObjectSinkAdapterTest.java
Log:
Fixed copy and paste bug from removing hashed sinks when it drops below the threshold

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-25 15:09:08 UTC (rev 7108)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CompositeObjectSinkAdapter.java	2006-10-25 15:40:56 UTC (rev 7109)
@@ -22,6 +22,15 @@
     implements
     ObjectSinkPropagator {
 
+
+
+    /** You can override this property via a system property (eg -Ddrools.hashThreshold=4) */
+    public static final String HASH_THRESHOLD_SYSTEM_PROPERTY = "drools.hashThreshold";
+
+    /** The threshold for when hashing kicks in */
+    public static final int THRESHOLD_TO_HASH = Integer.parseInt( System.getProperty( HASH_THRESHOLD_SYSTEM_PROPERTY, "3" ));
+    
+    private static final long serialVersionUID = 2192568791644369227L;
     ObjectSinkNodeList otherSinks;
     ObjectSinkNodeList hashableSinks;
 
@@ -49,7 +58,7 @@
                     final FieldIndex fieldIndex = registerFieldIndex( index,
                                                                 literalConstraint.getFieldExtractor() );
 
-                    if ( fieldIndex.getCount() >= 3 ) {
+                    if ( fieldIndex.getCount() >= THRESHOLD_TO_HASH ) {
                         if ( !fieldIndex.isHashed() ) {
                             hashSinks( fieldIndex );
                         }
@@ -96,7 +105,7 @@
                         this.hashKey.setIndex( index );
                         this.hashKey.setValue( value );
                         this.hashedSinkMap.remove( this.hashKey );
-                        if ( fieldIndex.getCount() <= 2 ) {
+                        if ( fieldIndex.getCount() <= THRESHOLD_TO_HASH - 1 ) {
                             // we have less than three so unhash
                             unHashSinks( fieldIndex );
                         }
@@ -158,21 +167,35 @@
     public void unHashSinks(final FieldIndex fieldIndex) {
         final int index = fieldIndex.getIndex();
 
-     
-        for ( ObjectSinkNode sink = this.hashableSinks.getFirst(); sink != null; sink = sink.getNextObjectSinkNode() ) {
+        
+        List sinks = new ArrayList();
+        
+        //iterate twice as custom iterator is immutable
+        Iterator mapIt = this.hashedSinkMap.iterator();
+        for(ObjectHashMap.ObjectEntry e = (ObjectHashMap.ObjectEntry) mapIt.next(); e != null; ) {
+
+            sinks.add( e.getValue() );
+            e = (ObjectHashMap.ObjectEntry) mapIt.next();
+        }
+        
+        for ( java.util.Iterator iter = sinks.iterator(); iter.hasNext(); ) {
+            AlphaNode sink = (AlphaNode) iter.next();
             final AlphaNode alphaNode = (AlphaNode) sink;
             final AlphaNodeFieldConstraint fieldConstraint = alphaNode.getConstraint();
             final LiteralConstraint literalConstraint = (LiteralConstraint) fieldConstraint;
             final Evaluator evaluator = literalConstraint.getEvaluator();
             if ( evaluator.getOperator() == Operator.EQUAL && index == literalConstraint.getFieldExtractor().getIndex() ) {
-                final Object value = literalConstraint.getField();
-                this.hashKey.setIndex( index );
-                this.hashKey.setValue( value );
+                final Object value = literalConstraint.getField().getValue();
+                if (this.hashableSinks == null) {
+                    this.hashableSinks = new ObjectSinkNodeList();
+                }
                 this.hashableSinks.add( sink );
-                this.hashedSinkMap.remove( this.hashKey );
-            }
+                this.hashedSinkMap.remove( new HashKey(index, value) );
+            };
         }
+     
 
+
         if ( this.hashedSinkMap.isEmpty() ) {
             this.hashedSinkMap = null;
         }

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/CompositeObjectSinkAdapterTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/CompositeObjectSinkAdapterTest.java	2006-10-25 15:09:08 UTC (rev 7108)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/CompositeObjectSinkAdapterTest.java	2006-10-25 15:40:56 UTC (rev 7109)
@@ -146,7 +146,7 @@
         LiteralConstraint lit2 = new LiteralConstraint(new MockExtractor(),
                                                       StringFactory.getInstance().getEvaluator( Operator.EQUAL ),
                                                       new ObjectFieldImpl("cheddar"));
-        AlphaNode al2 = new AlphaNode(1, lit2,  new MockObjectSource(0) );
+        AlphaNode al2 = new AlphaNode(1, lit2,  new MockObjectSource(1) );
         
         ad.addObjectSink( al2 );
         
@@ -156,7 +156,7 @@
         LiteralConstraint lit3 = new LiteralConstraint(new MockExtractor(),
                                                        StringFactory.getInstance().getEvaluator( Operator.EQUAL ),
                                                        new ObjectFieldImpl("stinky"));
-        AlphaNode al3 = new AlphaNode(1, lit3,  new MockObjectSource(0) );
+        AlphaNode al3 = new AlphaNode(1, lit3,  new MockObjectSource(2) );
         ad.addObjectSink( al3 );
         
         //this should now be nicely hashed.
@@ -168,6 +168,7 @@
         //now remove one, check the hashing is undone
         ad.removeObjectSink( al2 );
         assertNotNull(ad.hashableSinks);
+        assertEquals(2, ad.hashableSinks.size());
         assertNull(ad.hashedSinkMap);
         
         




More information about the jboss-svn-commits mailing list