[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