[jboss-svn-commits] JBL Code SVN: r16828 - in labs/jbossrules/trunk/drools-core/src: test/java/org/drools and 1 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Mon Nov 26 08:22:36 EST 2007
Author: tirelli
Date: 2007-11-26 08:22:35 -0500 (Mon, 26 Nov 2007)
New Revision: 16828
Modified:
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CompositeObjectSinkAdapter.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/Cheese.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/CompositeObjectSinkAdapterTest.java
Log:
JBRULES-1348: fixing hash calculation for character attributes
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 2007-11-26 13:02:02 UTC (rev 16827)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CompositeObjectSinkAdapter.java 2007-11-26 13:22:35 UTC (rev 16828)
@@ -478,14 +478,14 @@
} else {
this.setHashCode( 0 );
}
- } else if ( vtype.isIntegerNumber() ) {
+ } else if ( vtype.isIntegerNumber() || vtype.isChar() ) {
this.type = LONG;
- if ( !isNull ) {
- this.lvalue = extractor.getLongValue( null, value );
- this.setHashCode( (int) (this.lvalue ^ (this.lvalue >>> 32)) );
- } else {
- this.setHashCode( 0 );
- }
+ if ( !isNull ) {
+ this.lvalue = extractor.getLongValue( null, value );
+ this.setHashCode( (int) (this.lvalue ^ (this.lvalue >>> 32)) );
+ } else {
+ this.setHashCode( 0 );
+ }
} else if ( vtype.isFloatNumber() ) {
this.type = DOUBLE;
if ( !isNull ) {
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/Cheese.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/Cheese.java 2007-11-26 13:02:02 UTC (rev 16827)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/Cheese.java 2007-11-26 13:22:35 UTC (rev 16828)
@@ -31,6 +31,8 @@
}
private String type;
+
+ private char charType;
private int price;
@@ -121,4 +123,12 @@
}
return -1;
}
+
+ public char getCharType() {
+ return charType;
+ }
+
+ public void setCharType(char charType) {
+ this.charType = charType;
+ }
}
\ No newline at end of file
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 2007-11-26 13:02:02 UTC (rev 16827)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/CompositeObjectSinkAdapterTest.java 2007-11-26 13:22:35 UTC (rev 16828)
@@ -8,8 +8,10 @@
import org.drools.RuleBaseFactory;
import org.drools.base.ClassFieldExtractorCache;
import org.drools.base.ValueType;
+import org.drools.base.evaluators.CharacterFactory;
import org.drools.base.evaluators.Operator;
import org.drools.base.evaluators.StringFactory;
+import org.drools.base.field.LongFieldImpl;
import org.drools.base.field.ObjectFieldImpl;
import org.drools.common.EmptyBetaConstraints;
import org.drools.common.InternalFactHandle;
@@ -227,6 +229,85 @@
}
+ public void testTripleAlphaCharacterConstraint() {
+ final CompositeObjectSinkAdapter ad = new CompositeObjectSinkAdapter();
+ FieldExtractor extractor = ClassFieldExtractorCache.getInstance().getExtractor( Cheese.class,
+ "charType",
+ this.getClass().getClassLoader() );
+
+ final LiteralConstraint lit = new LiteralConstraint( extractor,
+ CharacterFactory.getInstance().getEvaluator( Operator.EQUAL ),
+ new LongFieldImpl( 65 ) ); // chars are handled as integers
+ final AlphaNode al = new AlphaNode( buildContext.getNextId(),
+ lit,
+ new MockObjectSource( buildContext.getNextId() ),
+ buildContext );
+
+ ad.addObjectSink( al );
+
+ assertNull( ad.otherSinks );
+ assertNotNull( ad.hashedFieldIndexes );
+ assertEquals( 1,
+ ad.hashableSinks.size() );
+ assertEquals( al,
+ ad.getSinks()[0] );
+
+ final LiteralConstraint lit2 = new LiteralConstraint( extractor,
+ CharacterFactory.getInstance().getEvaluator( Operator.EQUAL ),
+ new LongFieldImpl( 66 ) );
+ final AlphaNode al2 = new AlphaNode( buildContext.getNextId(),
+ lit2,
+ new MockObjectSource( buildContext.getNextId() ),
+ buildContext );
+
+ ad.addObjectSink( al2 );
+
+ assertNull( ad.hashedSinkMap );
+ assertEquals( 2,
+ ad.hashableSinks.size() );
+
+ final LiteralConstraint lit3 = new LiteralConstraint( extractor,
+ CharacterFactory.getInstance().getEvaluator( Operator.EQUAL ),
+ new LongFieldImpl( 67 ) );
+ final AlphaNode al3 = new AlphaNode( buildContext.getNextId(),
+ lit3,
+ new MockObjectSource( buildContext.getNextId() ),
+ buildContext );
+ ad.addObjectSink( al3 );
+
+ //this should now be nicely hashed.
+ assertNotNull( ad.hashedSinkMap );
+ assertNull( ad.hashableSinks );
+
+ // test propagation
+ Cheese cheese = new Cheese();
+ cheese.setCharType( 'B' );
+ CompositeObjectSinkAdapter.HashKey hashKey = new CompositeObjectSinkAdapter.HashKey();
+
+ // should find this
+ hashKey.setValue( extractor.getIndex(),
+ cheese,
+ extractor );
+ ObjectSink sink = (ObjectSink) ad.hashedSinkMap.get( hashKey );
+ assertSame( al2, sink );
+
+ // should not find this one
+ cheese.setCharType( 'X' );
+ hashKey.setValue( extractor.getIndex(),
+ cheese,
+ extractor );
+ sink = (ObjectSink) ad.hashedSinkMap.get( hashKey );
+ assertNull( sink );
+
+ //now remove one, check the hashing is undone
+ ad.removeObjectSink( al2 );
+ assertNotNull( ad.hashableSinks );
+ assertEquals( 2,
+ ad.hashableSinks.size() );
+ assertNull( ad.hashedSinkMap );
+
+ }
+
public void testPropagationWithNullValue() {
final CompositeObjectSinkAdapter ad = new CompositeObjectSinkAdapter();
More information about the jboss-svn-commits
mailing list