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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Nov 20 06:34:53 EST 2006


Author: tirelli
Date: 2006-11-20 06:34:39 -0500 (Mon, 20 Nov 2006)
New Revision: 7718

Modified:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/FieldFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BigDecimalFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/StringFactory.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/EvaluatorFactoryTest.java
Log:
JBRULES-565: fixed problem with evaluators and improved unit test coverage

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/FieldFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/FieldFactory.java	2006-11-20 11:05:49 UTC (rev 7717)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/FieldFactory.java	2006-11-20 11:34:39 UTC (rev 7718)
@@ -96,6 +96,66 @@
         return field;
     }
 
+    public static FieldValue getFieldValue(final Object value,
+                                           ValueType valueType) {
+        FieldValue field = null;
+        if ( value == null ) {
+            valueType = ValueType.NULL_TYPE;
+        }
+
+        if ( valueType == ValueType.NULL_TYPE ) {
+            field = new ObjectFieldImpl( null );
+        } else if ( valueType == ValueType.PCHAR_TYPE ) {
+            field = new LongFieldImpl( ((Character)value).charValue() );
+        } else if ( valueType == ValueType.PBYTE_TYPE ) {
+            field = new LongFieldImpl( ((Number)value).byteValue() );
+        } else if ( valueType == ValueType.PSHORT_TYPE ) {
+            field = new LongFieldImpl( ((Number)value).shortValue() );
+        } else if ( valueType == ValueType.PINTEGER_TYPE ) {
+            field = new LongFieldImpl( ((Number)value).intValue() );
+        } else if ( valueType == ValueType.PLONG_TYPE ) {
+            field = new LongFieldImpl( ((Number)value).longValue() );
+        } else if ( valueType == ValueType.PFLOAT_TYPE ) {
+            field = new DoubleFieldImpl( ((Number)value).floatValue() );
+        } else if ( valueType == ValueType.PDOUBLE_TYPE ) {
+            field = new DoubleFieldImpl( ((Number)value).doubleValue() );
+        } else if ( valueType == ValueType.PBOOLEAN_TYPE ) {
+            field = new BooleanFieldImpl( ((Boolean)value).booleanValue() );
+        } else if ( valueType == ValueType.CHAR_TYPE ) {
+            field = new ObjectFieldImpl( value );
+        } else if ( valueType == ValueType.BYTE_TYPE ) {
+            field = new ObjectFieldImpl( value );
+        } else if ( valueType == ValueType.SHORT_TYPE ) {
+            field = new ObjectFieldImpl( value );
+        } else if ( valueType == ValueType.INTEGER_TYPE ) {
+            field = new ObjectFieldImpl( value );
+        } else if ( valueType == ValueType.LONG_TYPE ) {
+            field = new ObjectFieldImpl( value );
+        } else if ( valueType == ValueType.FLOAT_TYPE ) {
+            field = new ObjectFieldImpl( value );
+        } else if ( valueType == ValueType.DOUBLE_TYPE ) {
+            field = new ObjectFieldImpl( value );
+        } else if ( valueType == ValueType.BOOLEAN_TYPE ) {
+            field = new ObjectFieldImpl( value );
+        } else if ( valueType == ValueType.STRING_TYPE ) {
+            field = new ObjectFieldImpl( value );
+        } else if ( valueType == ValueType.DATE_TYPE ) {
+            //MN: I think its fine like this, seems to work !
+            field = new ObjectFieldImpl( value );
+        } else if ( valueType == ValueType.ARRAY_TYPE ) {
+            //MN: I think its fine like this.
+            field = new ObjectFieldImpl( value );
+        } else if ( valueType == ValueType.OBJECT_TYPE ) {
+            field = new ObjectFieldImpl( value );
+        } else if ( valueType == ValueType.BIG_DECIMAL_TYPE ) {
+            field = new ObjectFieldImpl( value );
+        } else if ( valueType == ValueType.BIG_INTEGER_TYPE ) {
+            field = new ObjectFieldImpl( value );
+        }
+
+        return field;
+    }
+
     public static FieldValue getFieldValue(final Object value) {
         return new ObjectFieldImpl( value );
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BigDecimalFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BigDecimalFactory.java	2006-11-20 11:05:49 UTC (rev 7717)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BigDecimalFactory.java	2006-11-20 11:34:39 UTC (rev 7718)
@@ -282,8 +282,8 @@
         public boolean evaluate(final Extractor extractor,
                                 final Object object1,
                                 final FieldValue object2) {
-            final BigDecimal comp = (BigDecimal) object2.getValue();
-            return comp.compareTo( ( BigDecimal ) extractor.getValue( object1 ) ) > 0;
+            final BigDecimal comp = (BigDecimal) extractor.getValue( object1 );
+            return comp.compareTo( ( BigDecimal ) object2.getValue() ) > 0;
         }
 
         public boolean evaluateCachedRight(final VariableContextEntry context,

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/StringFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/StringFactory.java	2006-11-20 11:05:49 UTC (rev 7717)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/StringFactory.java	2006-11-20 11:34:39 UTC (rev 7718)
@@ -149,7 +149,7 @@
             if ( value == null ) {
                 return ((ObjectVariableContextEntry) context).right != null;
             }
-            return value.equals( ((ObjectVariableContextEntry) context).right );
+            return !value.equals( ((ObjectVariableContextEntry) context).right );
         }
 
         public boolean evaluateCachedLeft(final VariableContextEntry context,
@@ -232,7 +232,7 @@
         }
 
         public String toString() {
-            return "String !=";
+            return "String matches";
         }
     }
 

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	2006-11-20 11:05:49 UTC (rev 7717)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/EvaluatorFactoryTest.java	2006-11-20 11:34:39 UTC (rev 7718)
@@ -27,8 +27,16 @@
 import junit.framework.TestCase;
 
 import org.drools.base.evaluators.Operator;
+import org.drools.rule.Declaration;
+import org.drools.rule.VariableRestriction.BooleanVariableContextEntry;
+import org.drools.rule.VariableRestriction.DoubleVariableContextEntry;
+import org.drools.rule.VariableRestriction.LongVariableContextEntry;
+import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
+import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Evaluator;
 import org.drools.spi.Extractor;
+import org.drools.spi.FieldExtractor;
+import org.drools.spi.FieldValue;
 
 /**
  * Some test coverage goodness for the evaluators.
@@ -81,7 +89,7 @@
 
         final Object[][] data = {{new Integer( 42 ), "==", new Integer( 42 ), Boolean.TRUE}, {new Integer( 42 ), "<", new Integer( 43 ), Boolean.TRUE}, {new Integer( 42 ), ">=", new Integer( 41 ), Boolean.TRUE},
                 {new Integer( 42 ), "!=", new Integer( 41 ), Boolean.TRUE}, {new Integer( 42 ), ">", new Integer( 41 ), Boolean.TRUE}, {new Integer( 42 ), "<=", new Integer( 42 ), Boolean.TRUE},
-                {new Integer( 42 ), ">", new Integer( 100 ), Boolean.FALSE} };
+                {new Integer( 42 ), ">", new Integer( 100 ), Boolean.FALSE}};
 
         runEvaluatorTest( data,
                           ValueType.PINTEGER_TYPE );
@@ -184,8 +192,7 @@
         final Object[][] data = {{df.parse( "10-Jul-1974" ), "==", df.parse( "10-Jul-1974" ), Boolean.TRUE}, {df.parse( "10-Jul-1974" ), "<", df.parse( "11-Jul-1974" ), Boolean.TRUE},
                 {df.parse( "10-Jul-1974" ), ">=", df.parse( "10-Jul-1974" ), Boolean.TRUE}, {df.parse( "10-Jul-1974" ), "!=", df.parse( "11-Jul-1974" ), Boolean.TRUE}, {df.parse( "10-Jul-2000" ), ">", df.parse( "10-Jul-1974" ), Boolean.TRUE},
                 {df.parse( "10-Jul-1974" ), ">=", df.parse( "10-Jul-1974" ), Boolean.TRUE}, {df.parse( "11-Jul-1974" ), ">=", df.parse( "10-Jul-1974" ), Boolean.TRUE}, {df.parse( "10-Jul-1974" ), ">=", df.parse( "11-Jul-1974" ), Boolean.FALSE},
-                {df.parse( "10-Jul-2000" ), "<", df.parse( "10-Jul-1974" ), Boolean.FALSE}, {df.parse( "10-Jul-1974" ), "<", df.parse("11-Jul-1974"), Boolean.TRUE},
-                {df.parse( "10-Jul-1974" ), "==", null, Boolean.FALSE},
+                {df.parse( "10-Jul-2000" ), "<", df.parse( "10-Jul-1974" ), Boolean.FALSE}, {df.parse( "10-Jul-1974" ), "<", df.parse( "11-Jul-1974" ), Boolean.TRUE}, {df.parse( "10-Jul-1974" ), "==", null, Boolean.FALSE},
                 {df.parse( "10-Jul-1974" ), "!=", null, Boolean.TRUE}, {null, "==", null, Boolean.TRUE}, {null, "==", df.parse( "10-Jul-1974" ), Boolean.FALSE}, {null, "!=", null, Boolean.FALSE}, {null, "!=", df.parse( "10-Jul-1974" ), Boolean.TRUE}};
         runEvaluatorTest( data,
                           ValueType.DATE_TYPE );
@@ -210,42 +217,190 @@
         for ( int i = 0; i < data.length; i++ ) {
             final Object[] row = data[i];
             final Evaluator evaluator = valueType.getEvaluator( Operator.determineOperator( (String) row[1] ) );
-            final boolean result = evaluator.evaluate( extractor,
-                                                       row[0],
-                                                       extractor,
-                                                       row[2] );
-            final String message = "The evaluator type: [" + valueType + "] incorrectly returned " + result + " for [" + row[0] + " " + row[1] + " " + row[2] + "]. It was asserted to return " + row[3];
+            checkEvaluatorMethodWithFieldValue( valueType,
+                                                extractor,
+                                                row,
+                                                evaluator );
+            checkEvaluatorMethodCachedRight( valueType,
+                                             extractor,
+                                             row,
+                                             evaluator );
+            checkEvaluatorMethodCachedLeft( valueType,
+                                            extractor,
+                                            row,
+                                            evaluator );
+            checkEvaluatorMethodWith2Extractors( valueType,
+                                                 extractor,
+                                                 row,
+                                                 evaluator );
 
-            if ( row[3] == Boolean.TRUE ) {
-                assertTrue( message,
-                            result );
-            } else {
-                assertFalse( message,
-                             result );
-            }
-
             assertEquals( valueType,
                           evaluator.getValueType() );
 
         }
     }
-    
-    private static class MockExtractor implements Extractor {
 
+    /**
+     * @param valueType
+     * @param extractor
+     * @param row
+     * @param evaluator
+     */
+    private void checkEvaluatorMethodWithFieldValue(final ValueType valueType,
+                                                    Extractor extractor,
+                                                    final Object[] row,
+                                                    final Evaluator evaluator) {
+        FieldValue value = FieldFactory.getFieldValue( row[2],
+                                                       valueType );
+        final boolean result = evaluator.evaluate( extractor,
+                                                   row[0],
+                                                   value );
+        final String message = "The evaluator type: [" + valueType + "] with FieldValue incorrectly returned " + result + " for [" + row[0] + " " + row[1] + " " + row[2] + "]. It was asserted to return " + row[3];
+
+        if ( row[3] == Boolean.TRUE ) {
+            assertTrue( message,
+                        result );
+        } else {
+            assertFalse( message,
+                         result );
+        }
+    }
+
+    /**
+     * @param valueType
+     * @param extractor
+     * @param row
+     * @param evaluator
+     */
+    private void checkEvaluatorMethodCachedRight(final ValueType valueType,
+                                                 Extractor extractor,
+                                                 final Object[] row,
+                                                 final Evaluator evaluator) {
+        VariableContextEntry context = this.getContextEntry( (FieldExtractor) extractor,
+                                                             valueType,
+                                                             row );
+        final boolean result = evaluator.evaluateCachedRight( context,
+                                                              row[2] );
+        final String message = "The evaluator type: [" + valueType + "] with CachedRight incorrectly returned " + result + " for [" + row[0] + " " + row[1] + " " + row[2] + "]. It was asserted to return " + row[3];
+
+        if ( row[3] == Boolean.TRUE ) {
+            assertTrue( message,
+                        result );
+        } else {
+            assertFalse( message,
+                         result );
+        }
+    }
+
+    /**
+     * @param valueType
+     * @param extractor
+     * @param row
+     * @param evaluator
+     */
+    private void checkEvaluatorMethodCachedLeft(final ValueType valueType,
+                                                Extractor extractor,
+                                                final Object[] row,
+                                                final Evaluator evaluator) {
+        VariableContextEntry context = this.getContextEntry( (FieldExtractor) extractor,
+                                                             valueType,
+                                                             row );
+        final boolean result = evaluator.evaluateCachedLeft( context,
+                                                             row[0] );
+        final String message = "The evaluator type: [" + valueType + "] with CachedLeft incorrectly returned " + result + " for [" + row[0] + " " + row[1] + " " + row[2] + "]. It was asserted to return " + row[3];
+
+        if ( row[3] == Boolean.TRUE ) {
+            assertTrue( message,
+                        result );
+        } else {
+            assertFalse( message,
+                         result );
+        }
+    }
+
+    /**
+     * @param valueType
+     * @param extractor
+     * @param row
+     * @param evaluator
+     */
+    private void checkEvaluatorMethodWith2Extractors(final ValueType valueType,
+                                                     Extractor extractor,
+                                                     final Object[] row,
+                                                     final Evaluator evaluator) {
+        final boolean result = evaluator.evaluate( extractor,
+                                                   row[0],
+                                                   extractor,
+                                                   row[2] );
+        final String message = "The evaluator type: [" + valueType + "] with 2 extractors incorrectly returned " + result + " for [" + row[0] + " " + row[1] + " " + row[2] + "]. It was asserted to return " + row[3];
+
+        if ( row[3] == Boolean.TRUE ) {
+            assertTrue( message,
+                        result );
+        } else {
+            assertFalse( message,
+                         result );
+        }
+    }
+
+    private VariableContextEntry getContextEntry(FieldExtractor extractor,
+                                                 ValueType valueType,
+                                                 Object[] row) {
+        Declaration declaration = new Declaration( "test",
+                                                   extractor,
+                                                   null );
+        if ( valueType.isIntegerNumber() ) {
+            LongVariableContextEntry context = new LongVariableContextEntry( extractor,
+                                                                             declaration );
+            if ( row[2] instanceof Character ) {
+                context.left = ((Character) row[2]).charValue();
+                context.right = ((Character) row[0]).charValue();
+            } else {
+                context.left = ((Number) row[2]).longValue();
+                context.right = ((Number) row[0]).longValue();
+            }
+            return context;
+        } else if ( valueType.isBoolean() ) {
+            BooleanVariableContextEntry context = new BooleanVariableContextEntry( extractor,
+                                                                                   declaration );
+            context.left = ((Boolean) row[2]).booleanValue();
+            context.right = ((Boolean) row[0]).booleanValue();
+            return context;
+        } else if ( valueType.isFloatNumber() ) {
+            DoubleVariableContextEntry context = new DoubleVariableContextEntry( extractor,
+                                                                                 declaration );
+            context.left = ((Number) row[2]).doubleValue();
+            context.right = ((Number) row[0]).doubleValue();
+            return context;
+        } else {
+            ObjectVariableContextEntry context = new ObjectVariableContextEntry( extractor,
+                                                                                 declaration );
+            context.left = row[2];
+            context.right = row[0];
+            return context;
+        }
+    }
+
+    private static class MockExtractor
+        implements
+        FieldExtractor {
+
+        private static final long serialVersionUID = 2759666130893301563L;
+
         public boolean getBooleanValue(Object object) {
-            return ((Boolean)object).booleanValue();
+            return ((Boolean) object).booleanValue();
         }
 
         public byte getByteValue(Object object) {
-            return ((Number)object).byteValue();
+            return ((Number) object).byteValue();
         }
 
         public char getCharValue(Object object) {
-            return ((Character)object).charValue();
+            return ((Character) object).charValue();
         }
 
         public double getDoubleValue(Object object) {
-            return ((Number)object).doubleValue();
+            return ((Number) object).doubleValue();
         }
 
         public Class getExtractToClass() {
@@ -253,7 +408,7 @@
         }
 
         public float getFloatValue(Object object) {
-            return ((Number)object).floatValue();
+            return ((Number) object).floatValue();
         }
 
         public int getHashCode(Object object) {
@@ -261,11 +416,11 @@
         }
 
         public int getIntValue(Object object) {
-            return ((Number)object).intValue();
+            return ((Number) object).intValue();
         }
 
         public long getLongValue(Object object) {
-            return ((Number)object).longValue();
+            return ((Number) object).longValue();
         }
 
         public Method getNativeReadMethod() {
@@ -273,7 +428,7 @@
         }
 
         public short getShortValue(Object object) {
-            return ((Number)object).shortValue();
+            return ((Number) object).shortValue();
         }
 
         public Object getValue(Object object) {
@@ -284,7 +439,11 @@
             // TODO Auto-generated method stub
             return null;
         }
-        
+
+        public int getIndex() {
+            return 0;
+        }
+
     }
 
     //    public void testRegexFoo() {




More information about the jboss-svn-commits mailing list