You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by to...@apache.org on 2006/11/05 22:47:39 UTC

svn commit: r471539 - in /incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src: main/java/org/apache/cayenne/exp/ main/java/org/apache/cayenne/exp/parser/ test/java/org/apache/cayenne/exp/ test/java/org/apache/cayenne/query/

Author: torehalset
Date: Sun Nov  5 13:47:38 2006
New Revision: 471539

URL: http://svn.apache.org/viewvc?view=rev&rev=471539
Log:
CAY-700: where in () with empty collection
implemented for ExpressionFactory.inExp & co and for 
Query.queryWithParameters

Modified:
    incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/exp/ExpressionFactory.java
    incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/exp/parser/ASTIn.java
    incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/exp/parser/ASTNotIn.java
    incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/exp/ExpressionFactoryTst.java
    incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/query/SelectQueryTst.java

Modified: incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/exp/ExpressionFactory.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/exp/ExpressionFactory.java?view=diff&rev=471539&r1=471538&r2=471539
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/exp/ExpressionFactory.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/exp/ExpressionFactory.java Sun Nov  5 13:47:38 2006
@@ -364,65 +364,97 @@
     }
 
     /**
-     * A convenience shortcut for building IN expression.
+     * A convenience shortcut for building IN expression. Return ASTFalse for empty
+     * collection.
      */
     public static Expression inExp(String pathSpec, Object[] values) {
+        if (values.length == 0) {
+            return new ASTFalse();
+        }
         return new ASTIn(new ASTObjPath(pathSpec), new ASTList(values));
     }
 
     /**
-     * A convenience shortcut for building IN DB expression.
+     * A convenience shortcut for building IN DB expression. Return ASTFalse for empty
+     * collection.
      */
     public static Expression inDbExp(String pathSpec, Object[] values) {
+        if (values.length == 0) {
+            return new ASTFalse();
+        }
         return new ASTIn(new ASTDbPath(pathSpec), new ASTList(values));
     }
 
     /**
-     * A convenience shortcut for building IN expression.
+     * A convenience shortcut for building IN expression. Return ASTFalse for empty
+     * collection.
      */
     public static Expression inExp(String pathSpec, Collection values) {
+        if (values.isEmpty()) {
+            return new ASTFalse();
+        }
         return new ASTIn(new ASTObjPath(pathSpec), new ASTList(values));
     }
 
     /**
-     * A convenience shortcut for building IN DB expression.
+     * A convenience shortcut for building IN DB expression. Return ASTFalse for empty
+     * collection.
      */
     public static Expression inDbExp(String pathSpec, Collection values) {
+        if (values.isEmpty()) {
+            return new ASTFalse();
+        }
         return new ASTIn(new ASTDbPath(pathSpec), new ASTList(values));
     }
 
     /**
-     * A convenience shortcut for building NOT_IN expression.
+     * A convenience shortcut for building NOT_IN expression. Return ASTTrue for empty
+     * collection.
      */
     public static Expression notInExp(String pathSpec, Collection values) {
+        if (values.isEmpty()) {
+            return new ASTTrue();
+        }
         return new ASTNotIn(new ASTObjPath(pathSpec), new ASTList(values));
     }
     
     /**
-     * A convenience shortcut for building NOT_IN expression.
+     * A convenience shortcut for building NOT_IN expression. Return ASTTrue for empty
+     * collection.
      * 
      * @since 3.0
      */
     public static Expression notInDbExp(String pathSpec, Collection values) {
+        if (values.isEmpty()) {
+            return new ASTTrue();
+        }
         return new ASTNotIn(new ASTDbPath(pathSpec), new ASTList(values));
     }
 
 
     /**
-     * A convenience shortcut for building NOT_IN expression.
+     * A convenience shortcut for building NOT_IN expression. Return ASTTrue for empty
+     * collection.
      * 
      * @since 1.0.6
      */
     public static Expression notInExp(String pathSpec, Object[] values) {
+        if (values.length == 0) {
+            return new ASTTrue();
+        }
         return new ASTNotIn(new ASTObjPath(pathSpec), new ASTList(values));
     }
     
     /**
-     * A convenience shortcut for building NOT_IN expression.
+     * A convenience shortcut for building NOT_IN expression. Return ASTTrue for empty
+     * collection.
      * 
      * @since 3.0
      */
     public static Expression notInDbExp(String pathSpec, Object[] values) {
+        if (values.length == 0) {
+            return new ASTTrue();
+        }
         return new ASTNotIn(new ASTDbPath(pathSpec), new ASTList(values));
     }
 

Modified: incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/exp/parser/ASTIn.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/exp/parser/ASTIn.java?view=diff&rev=471539&r1=471538&r2=471539
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/exp/parser/ASTIn.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/exp/parser/ASTIn.java Sun Nov  5 13:47:38 2006
@@ -20,6 +20,7 @@
 package org.apache.cayenne.exp.parser;
 
 import org.apache.cayenne.exp.Expression;
+import org.apache.commons.collections.Transformer;
 
 /**
  * "In" expression.
@@ -85,4 +86,23 @@
     public int getType() {
         return Expression.IN;
     }
+
+    protected Object transformExpression(Transformer transformer) {
+        Object transformed = super.transformExpression(transformer);
+        
+        // transform empty ASTIn to ASTFalse
+        if (transformed instanceof ASTIn) {
+            ASTIn exp = (ASTIn) transformed;
+            if (exp.jjtGetNumChildren() == 2) {
+                ASTList list = (ASTList) exp.jjtGetChild(1);
+                Object[] objects = (Object[]) list.evaluate(null);
+                if (objects.length == 0) {
+                    transformed = new ASTFalse();
+                }
+            }
+        }
+
+        return transformed;
+    }
+
 }

Modified: incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/exp/parser/ASTNotIn.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/exp/parser/ASTNotIn.java?view=diff&rev=471539&r1=471538&r2=471539
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/exp/parser/ASTNotIn.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/exp/parser/ASTNotIn.java Sun Nov  5 13:47:38 2006
@@ -21,6 +21,7 @@
 package org.apache.cayenne.exp.parser;
 
 import org.apache.cayenne.exp.Expression;
+import org.apache.commons.collections.Transformer;
 
 /**
  * "Not In" expression.
@@ -82,4 +83,23 @@
     public int getType() {
         return Expression.NOT_IN;
     }
+    
+    protected Object transformExpression(Transformer transformer) {
+        Object transformed = super.transformExpression(transformer);
+        
+        // transform empty ASTNotIn to ASTTrue
+        if (transformed instanceof ASTNotIn) {
+            ASTNotIn exp = (ASTNotIn) transformed;
+            if (exp.jjtGetNumChildren() == 2) {
+                ASTList list = (ASTList) exp.jjtGetChild(1);
+                Object[] objects = (Object[]) list.evaluate(null);
+                if (objects.length == 0) {
+                    transformed = new ASTTrue();
+                }
+            }
+        }
+
+        return transformed;
+    }
+
 }

Modified: incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/exp/ExpressionFactoryTst.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/exp/ExpressionFactoryTst.java?view=diff&rev=471539&r1=471538&r2=471539
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/exp/ExpressionFactoryTst.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/exp/ExpressionFactoryTst.java Sun Nov  5 13:47:38 2006
@@ -152,10 +152,18 @@
 
     public void testInExp2() throws Exception {
         List v = new ArrayList();
+        v.add("a");
+        v.add("b");
         Expression exp = ExpressionFactory.inExp("abc", v);
         assertEquals(Expression.IN, exp.getType());
     }
 
+    public void testInExp3() throws Exception {
+        List v = new ArrayList();
+        Expression exp = ExpressionFactory.inExp("abc", v);
+        assertEquals(Expression.FALSE, exp.getType());
+    }
+    
     public void testLikeExp() throws Exception {
         String v = "abc";
         Expression exp = ExpressionFactory.likeExp("abc", v);

Modified: incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/query/SelectQueryTst.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/query/SelectQueryTst.java?view=diff&rev=471539&r1=471538&r2=471539
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/query/SelectQueryTst.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/query/SelectQueryTst.java Sun Nov  5 13:47:38 2006
@@ -218,6 +218,56 @@
         assertEquals(2, objects.size());
     }
 
+    public void testSelectParameterizedEmptyIn() throws Exception {
+        query.setRoot(Artist.class);
+        Expression qual = Expression.fromString("artistName in $list");
+        query.setQualifier(qual);
+        query = query.queryWithParameters(Collections.singletonMap(
+                "list",
+                new Object[] {}));
+        performQuery();
+
+        // check query results
+        List objects = opObserver.rowsForQuery(query);
+        assertEquals(0, objects.size());
+    }
+    
+    public void testSelectParameterizedEmptyNotIn() throws Exception {
+        query.setRoot(Artist.class);
+        Expression qual = Expression.fromString("artistName not in $list");
+        query.setQualifier(qual);
+        query = query.queryWithParameters(Collections.singletonMap(
+                "list",
+                new Object[] {}));
+        performQuery();
+
+        // check query results
+        List objects = opObserver.rowsForQuery(query);
+        assertEquals(20, objects.size());
+    }
+    
+    public void testSelectEmptyIn() throws Exception {
+        query.setRoot(Artist.class);
+        Expression qual = ExpressionFactory.inExp("artistName", new Object[]{});
+        query.setQualifier(qual);
+        performQuery();
+
+        // check query results
+        List objects = opObserver.rowsForQuery(query);
+        assertEquals(0, objects.size());
+    }
+    
+    public void testSelectEmptyNotIn() throws Exception {
+        query.setRoot(Artist.class);
+        Expression qual = ExpressionFactory.notInExp("artistName", new Object[]{});
+        query.setQualifier(qual);
+        performQuery();
+
+        // check query results
+        List objects = opObserver.rowsForQuery(query);
+        assertEquals(20, objects.size());
+    }
+    
     public void testSelectCustAttributes() throws Exception {
         query.setRoot(Artist.class);
         query.addCustomDbAttribute("ARTIST_NAME");