[jboss-svn-commits] JBL Code SVN: r13178 - in labs/jbossrules/trunk: drools-compiler/src/test/java/org/drools/integrationtests and 6 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Jul 6 14:35:40 EDT 2007


Author: tirelli
Date: 2007-07-06 14:35:40 -0400 (Fri, 06 Jul 2007)
New Revision: 13178

Added:
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_charComparisons.drl
Modified:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Primitives.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/CharacterFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseCharClassFieldExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseObjectClassFieldExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableRestriction.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/EvaluatorFactoryTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/CharClassFieldExtractorTest.java
Log:
JBRULES-261: fixing ClassCastException and improving automatic conversions when constraining char attributes

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Primitives.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Primitives.java	2007-07-06 18:19:51 UTC (rev 13177)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Primitives.java	2007-07-06 18:35:40 UTC (rev 13178)
@@ -28,6 +28,7 @@
 
     private float    floatPrimitive;
     private float    doublePrimitive;
+    private String   stringAttribute;
     private Object[] arrayAttribute;
     private int[]    primitiveArrayAttribute;
     private String[] stringArray;
@@ -126,4 +127,12 @@
         this.stringArray = stringArray;
     }
 
+    public String getStringAttribute() {
+        return stringAttribute;
+    }
+
+    public void setStringAttribute(String stringAttribute) {
+        this.stringAttribute = stringAttribute;
+    }
+
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java	2007-07-06 18:19:51 UTC (rev 13177)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java	2007-07-06 18:35:40 UTC (rev 13178)
@@ -3109,5 +3109,38 @@
 
     }
 
+    public void testCharComparisons() throws Exception {
 
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_charComparisons.drl" ) ) );
+        final Package pkg = builder.getPackage();
+
+        final RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+
+        final List results = new ArrayList();
+        workingMemory.setGlobal( "results",
+                                 results );
+
+        Primitives p1 = new Primitives();
+        p1.setCharPrimitive( 'a' );
+        p1.setStringAttribute( "b" );
+        Primitives p2 = new Primitives();
+        p2.setCharPrimitive( 'b' );
+        p2.setStringAttribute( "a" );
+        
+        workingMemory.insert( p1 );
+        workingMemory.insert( p2 );
+
+        workingMemory.fireAllRules();
+
+        assertEquals( 3, results.size() );
+        assertEquals( "1", results.get( 0 ));
+        assertEquals( "2", results.get( 1 ));
+        assertEquals( "3", results.get( 2 ));
+
+    }
+
+
 }
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_charComparisons.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_charComparisons.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_charComparisons.drl	2007-07-06 18:35:40 UTC (rev 13178)
@@ -0,0 +1,30 @@
+package org.drools;
+
+global java.util.List results;
+
+rule "test chars 1"
+	salience 100
+when
+    Primitives( charPrimitive == 'a' ) 
+then
+    results.add( "1" );
+end
+
+rule "test chars 2"
+	salience 90
+when
+    Primitives( $c1: charPrimitive == 'a' ) 
+    Primitives( charPrimitive != $c1 )
+then
+    results.add( "2" );
+end
+
+rule "test chars 3"
+	salience 80
+when
+    Primitives( $c1: stringAttribute == 'a' ) 
+    Primitives( charPrimitive == $c1 )
+then
+    results.add( "3" );
+end
+

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/CharacterFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/CharacterFactory.java	2007-07-06 18:19:51 UTC (rev 13177)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/CharacterFactory.java	2007-07-06 18:35:40 UTC (rev 13178)
@@ -19,7 +19,7 @@
 import org.drools.base.BaseEvaluator;
 import org.drools.base.ValueType;
 import org.drools.common.InternalWorkingMemory;
-import org.drools.rule.VariableRestriction.LongVariableContextEntry;
+import org.drools.rule.VariableRestriction.CharVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Evaluator;
 import org.drools.spi.Extractor;
@@ -97,7 +97,7 @@
                 return false;
             }
             
-            return context.declaration.getExtractor().getCharValue( workingMemory, left ) == ((LongVariableContextEntry) context).right;
+            return context.declaration.getExtractor().getCharValue( workingMemory, left ) == ((CharVariableContextEntry) context).right;
         }
 
         public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
@@ -108,7 +108,7 @@
                 return false;
             }
             
-            return ((LongVariableContextEntry) context).left == context.extractor.getCharValue( workingMemory, right );
+            return ((CharVariableContextEntry) context).left == context.extractor.getCharValue( workingMemory, right );
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
@@ -161,7 +161,7 @@
                 return true;
             }
             
-            return context.declaration.getExtractor().getCharValue( workingMemory, left ) != ((LongVariableContextEntry) context).right;
+            return context.declaration.getExtractor().getCharValue( workingMemory, left ) != ((CharVariableContextEntry) context).right;
         }
 
         public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
@@ -172,7 +172,7 @@
                 return true;
             }
             
-            return ((LongVariableContextEntry) context).left != context.extractor.getCharValue( workingMemory, right );
+            return ((CharVariableContextEntry) context).left != context.extractor.getCharValue( workingMemory, right );
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
@@ -219,7 +219,7 @@
             if( context.rightNull ) {
                 return false;
             }
-            return ((LongVariableContextEntry) context).right < context.declaration.getExtractor().getCharValue( workingMemory, left );
+            return ((CharVariableContextEntry) context).right < context.declaration.getExtractor().getCharValue( workingMemory, left );
         }
 
         public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
@@ -227,7 +227,7 @@
             if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
-            return context.extractor.getCharValue( workingMemory, right ) < ((LongVariableContextEntry) context).left;
+            return context.extractor.getCharValue( workingMemory, right ) < ((CharVariableContextEntry) context).left;
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
@@ -271,7 +271,7 @@
             if( context.rightNull ) {
                 return false;
             }
-            return ((LongVariableContextEntry) context).right <= context.declaration.getExtractor().getCharValue( workingMemory, left );
+            return ((CharVariableContextEntry) context).right <= context.declaration.getExtractor().getCharValue( workingMemory, left );
         }
 
         public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
@@ -279,7 +279,7 @@
             if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
-            return context.extractor.getCharValue( workingMemory, right ) <= ((LongVariableContextEntry) context).left;
+            return context.extractor.getCharValue( workingMemory, right ) <= ((CharVariableContextEntry) context).left;
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
@@ -323,7 +323,7 @@
             if( context.rightNull ) {
                 return false;
             }
-            return ((LongVariableContextEntry) context).right > context.declaration.getExtractor().getCharValue( workingMemory, left );
+            return ((CharVariableContextEntry) context).right > context.declaration.getExtractor().getCharValue( workingMemory, left );
         }
 
         public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
@@ -331,7 +331,7 @@
             if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
-            return context.extractor.getCharValue( workingMemory, right ) > ((LongVariableContextEntry) context).left;
+            return context.extractor.getCharValue( workingMemory, right ) > ((CharVariableContextEntry) context).left;
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
@@ -375,7 +375,7 @@
             if( context.rightNull ) {
                 return false;
             }
-            return ((LongVariableContextEntry) context).right >= context.declaration.getExtractor().getCharValue( workingMemory, left );
+            return ((CharVariableContextEntry) context).right >= context.declaration.getExtractor().getCharValue( workingMemory, left );
         }
 
         public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
@@ -383,7 +383,7 @@
             if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
-            return context.extractor.getCharValue( workingMemory, right ) >= ((LongVariableContextEntry) context).left;
+            return context.extractor.getCharValue( workingMemory, right ) >= ((CharVariableContextEntry) context).left;
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseCharClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseCharClassFieldExtractor.java	2007-07-06 18:19:51 UTC (rev 13177)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseCharClassFieldExtractor.java	2007-07-06 18:35:40 UTC (rev 13178)
@@ -33,7 +33,7 @@
     }
 
     public Object getValue(InternalWorkingMemory workingMemory, final Object object) {
-        return new Long( getCharValue( workingMemory, object ) );
+        return new Character( getCharValue( workingMemory, object ) );
     }
 
     public boolean getBooleanValue(InternalWorkingMemory workingMemory, final Object object) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseObjectClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseObjectClassFieldExtractor.java	2007-07-06 18:19:51 UTC (rev 13177)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseObjectClassFieldExtractor.java	2007-07-06 18:35:40 UTC (rev 13178)
@@ -56,6 +56,8 @@
         
         if ( value instanceof Character ) {
             return ((Character) value).charValue();
+        } else if( value instanceof String && ((String)value).length() == 1 ) {
+            return ((String)value).charAt( 0 );
         }
         throw new RuntimeDroolsException( "Conversion to char not supported from " + value.getClass().getName() );
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableRestriction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableRestriction.java	2007-07-06 18:19:51 UTC (rev 13177)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableRestriction.java	2007-07-06 18:35:40 UTC (rev 13178)
@@ -125,6 +125,9 @@
             } else if ( fieldExtractor.getValueType().isIntegerNumber() ) {
                 return new LongVariableContextEntry( fieldExtractor,
                                                      this.declaration );
+            } else if ( fieldExtractor.getValueType().isChar() ) {
+                return new CharVariableContextEntry( fieldExtractor,
+                                                     this.declaration );
             } else {
                 return new ObjectVariableContextEntry( fieldExtractor,
                                                        this.declaration );
@@ -256,6 +259,46 @@
         }
     }
 
+    public static class CharVariableContextEntry extends VariableContextEntry {
+
+        private static final long serialVersionUID = -5316792696755228175L;
+
+        public char               left;
+        public char               right;
+
+        public CharVariableContextEntry(final FieldExtractor extractor,
+                                        final Declaration declaration) {
+            super( extractor,
+                   declaration );
+        }
+
+        public void updateFromTuple(final InternalWorkingMemory workingMemory,
+                                    final ReteTuple tuple) {
+            this.reteTuple = tuple;
+            this.workingMemory = workingMemory;
+            this.leftNull = this.declaration.getExtractor().isNullValue( workingMemory, tuple.get( this.declaration ).getObject() );
+            
+            if (!leftNull) {
+                this.left = this.declaration.getExtractor().getCharValue( workingMemory, tuple.get( this.declaration ).getObject() );
+            } else {
+                this.left = 0;
+            }
+        }
+
+        public void updateFromFactHandle(final InternalWorkingMemory workingMemory,
+                                         final InternalFactHandle handle) {
+            this.object = handle.getObject();
+            this.workingMemory = workingMemory;
+            this.rightNull = this.extractor.isNullValue( workingMemory, handle.getObject() );
+            
+            if ( !rightNull ) { // avoid a NullPointerException
+                this.right = this.extractor.getCharValue( workingMemory, handle.getObject() );
+            } else {
+                this.right = 0;
+            }
+        }
+    }
+
     public static class DoubleVariableContextEntry extends VariableContextEntry {
 
         private static final long serialVersionUID = 400L;

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/EvaluatorFactoryTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/EvaluatorFactoryTest.java	2007-07-06 18:19:51 UTC (rev 13177)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/EvaluatorFactoryTest.java	2007-07-06 18:35:40 UTC (rev 13178)
@@ -33,6 +33,7 @@
 import org.drools.common.InternalWorkingMemory;
 import org.drools.rule.Declaration;
 import org.drools.rule.VariableRestriction.BooleanVariableContextEntry;
+import org.drools.rule.VariableRestriction.CharVariableContextEntry;
 import org.drools.rule.VariableRestriction.DoubleVariableContextEntry;
 import org.drools.rule.VariableRestriction.LongVariableContextEntry;
 import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
@@ -735,36 +736,38 @@
             return context;
             
         } else {
-            if ( valueType.isIntegerNumber() || valueType.isChar() ) {
+            if ( valueType.isIntegerNumber() ) {
                 final LongVariableContextEntry context = new LongVariableContextEntry( extractor,
                                                                                  declaration );
                 
-                if ( valueType.isChar() ) {
-                    if (row[2] == null) {
-                        context.leftNull = true;
-                    } else {
-                        context.left = ((Character) row[2]).charValue();
-                    }
-                    
-                    if (row[0] == null) {
-                        context.rightNull = true;
-                    } else {
-                        context.right = ((Character) row[0]).charValue();
-                    }
+                if (row[2] == null) {
+                    context.leftNull = true;
                 } else {
-                    if (row[2] == null) {
-                        context.leftNull = true;
-                    } else {
-                        context.left = ((Number) row[2]).longValue();
-                    }
-                    
-                    if (row[0] == null) {
-                        context.rightNull = true;
-                    } else {
-                        context.right = ((Number) row[0]).longValue();
-                    }
+                    context.left = ((Number) row[2]).longValue();
                 }
+                
+                if (row[0] == null) {
+                    context.rightNull = true;
+                } else {
+                    context.right = ((Number) row[0]).longValue();
+                }
                 return context;
+            } else if ( valueType.isChar() ) {
+                final CharVariableContextEntry context = new CharVariableContextEntry( extractor,
+                                                                                       declaration );
+                      
+                if (row[2] == null) {
+                    context.leftNull = true;
+                } else {
+                    context.left = ((Character) row[2]).charValue();
+                }
+                
+                if (row[0] == null) {
+                    context.rightNull = true;
+                } else {
+                    context.right = ((Character) row[0]).charValue();
+                }
+                return context;
             } else if ( valueType.isBoolean() ) {
                 final BooleanVariableContextEntry context = new BooleanVariableContextEntry( extractor,
                                                                                        declaration );

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/CharClassFieldExtractorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/CharClassFieldExtractorTest.java	2007-07-06 18:19:51 UTC (rev 13177)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/CharClassFieldExtractorTest.java	2007-07-06 18:35:40 UTC (rev 13178)
@@ -91,7 +91,7 @@
     public void testGetValue() {
         try {
             Assert.assertEquals( 'a',
-                                 ((Number) this.extractor.getValue( null, this.bean )).intValue() );
+                                 ((Character) this.extractor.getValue( null, this.bean )).charValue() );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }




More information about the jboss-svn-commits mailing list