You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2013/08/03 17:50:01 UTC

svn commit: r1510017 - in /cayenne/main/trunk/framework/cayenne-core-unpublished/src: main/java/org/apache/cayenne/exp/parser/Evaluator.java test/java/org/apache/cayenne/exp/parser/EvaluatorTest.java

Author: aadamchik
Date: Sat Aug  3 15:50:01 2013
New Revision: 1510017

URL: http://svn.apache.org/r1510017
Log:
CAY-1860  In-memory matching of DataObjects against ObjectId or int

optimizing null handling

Modified:
    cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/exp/parser/Evaluator.java
    cayenne/main/trunk/framework/cayenne-core-unpublished/src/test/java/org/apache/cayenne/exp/parser/EvaluatorTest.java

Modified: cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/exp/parser/Evaluator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/exp/parser/Evaluator.java?rev=1510017&r1=1510016&r2=1510017&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/exp/parser/Evaluator.java (original)
+++ cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/exp/parser/Evaluator.java Sat Aug  3 15:50:01 2013
@@ -43,20 +43,21 @@ abstract class Evaluator {
     private static final Evaluator BIG_DECIMAL_EVALUATOR;
     private static final Evaluator COMPAREABLE_EVALUATOR;
 
-    static class NullEvaluator extends Evaluator {
-        Evaluator delegate;
+    /**
+     * A decorator of an evaluator that presumes non-null 'lhs' argument and
+     * allows for null 'rhs'.
+     */
+    static class NonNullLhsEvaluator extends Evaluator {
+        final Evaluator delegate;
 
-        NullEvaluator(Evaluator delegate) {
+        NonNullLhsEvaluator(Evaluator delegate) {
             this.delegate = delegate;
         }
 
         @Override
         int compare(Object lhs, Object rhs) {
-            if (lhs == null && rhs == null) {
-                return 0;
-            } else if (lhs == null) {
-                return -1;
-            } else if (rhs == null) {
+
+            if (rhs == null) {
                 return 1;
             } else {
                 return delegate.compare(lhs, rhs);
@@ -65,11 +66,7 @@ abstract class Evaluator {
 
         @Override
         boolean eq(Object lhs, Object rhs) {
-            if (lhs == null) {
-                return rhs == null;
-            }
-
-            return (rhs != null) ? delegate.eq(lhs, rhs) : false;
+            return rhs == null ? false : delegate.eq(lhs, rhs);
         }
     }
 
@@ -88,7 +85,7 @@ abstract class Evaluator {
             }
         };
 
-        DEFAULT_EVALUATOR = new NullEvaluator(new Evaluator() {
+        DEFAULT_EVALUATOR = new NonNullLhsEvaluator(new Evaluator() {
             @Override
             boolean eq(Object lhs, Object rhs) {
                 return lhs.equals(rhs);
@@ -100,7 +97,7 @@ abstract class Evaluator {
             }
         });
 
-        PERSISTENT_EVALUATOR = new NullEvaluator(new Evaluator() {
+        PERSISTENT_EVALUATOR = new NonNullLhsEvaluator(new Evaluator() {
 
             @Override
             int compare(Object lhs, Object rhs) {
@@ -145,7 +142,7 @@ abstract class Evaluator {
             }
         });
 
-        BIG_DECIMAL_EVALUATOR = new NullEvaluator(new Evaluator() {
+        BIG_DECIMAL_EVALUATOR = new NonNullLhsEvaluator(new Evaluator() {
 
             @Override
             int compare(Object lhs, Object rhs) {
@@ -162,7 +159,7 @@ abstract class Evaluator {
             }
         });
 
-        COMPAREABLE_EVALUATOR = new NullEvaluator(new Evaluator() {
+        COMPAREABLE_EVALUATOR = new NonNullLhsEvaluator(new Evaluator() {
 
             @SuppressWarnings({ "unchecked", "rawtypes" })
             @Override

Modified: cayenne/main/trunk/framework/cayenne-core-unpublished/src/test/java/org/apache/cayenne/exp/parser/EvaluatorTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-core-unpublished/src/test/java/org/apache/cayenne/exp/parser/EvaluatorTest.java?rev=1510017&r1=1510016&r2=1510017&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-core-unpublished/src/test/java/org/apache/cayenne/exp/parser/EvaluatorTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-core-unpublished/src/test/java/org/apache/cayenne/exp/parser/EvaluatorTest.java Sat Aug  3 15:50:01 2013
@@ -47,6 +47,16 @@ public class EvaluatorTest extends TestC
         assertFalse(e.eq(o, null));
     }
 
+    public void testEvaluator_Number() {
+
+        Evaluator e = Evaluator.evaluator(1);
+        assertNotNull(e);
+        assertTrue(e.eq(1, 1));
+        assertFalse(e.eq(1, null));
+        assertFalse(e.eq(1, 5));
+        assertFalse(e.eq(1, 1.1));
+    }
+
     public void testEvaluator_BigDecimal() {
         Object lhs = new BigDecimal("1.10");
         Evaluator e = Evaluator.evaluator(lhs);