[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