You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by an...@apache.org on 2010/01/21 23:25:55 UTC

svn commit: r901894 - in /cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src: main/java/org/apache/cayenne/exp/parser/ main/jjtree/org/apache/cayenne/ejbql/ test/java/org/apache/cayenne/exp/parser/ test/java/org/apache/cayenne/qu...

Author: andrey
Date: Thu Jan 21 22:25:54 2010
New Revision: 901894

URL: http://svn.apache.org/viewvc?rev=901894&view=rev
Log:
CAY-1369 EJBQL Fix likeIgnoreCase issues

Added:
    cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/IgnoreCaseNode.java
Modified:
    cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTLikeIgnoreCase.java
    cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTNotLikeIgnoreCase.java
    cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/SimpleNode.java
    cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/jjtree/org/apache/cayenne/ejbql/EJBQLParser.jjt
    cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/exp/parser/ASTLikeIgnoreCaseTest.java
    cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/query/EJBQLQueryTest.java

Modified: cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTLikeIgnoreCase.java
URL: http://svn.apache.org/viewvc/cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTLikeIgnoreCase.java?rev=901894&r1=901893&r2=901894&view=diff
==============================================================================
--- cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTLikeIgnoreCase.java (original)
+++ cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTLikeIgnoreCase.java Thu Jan 21 22:25:54 2010
@@ -19,8 +19,6 @@
 
 package org.apache.cayenne.exp.parser;
 
-import java.io.PrintWriter;
-
 import org.apache.cayenne.exp.Expression;
 import org.apache.cayenne.util.ConversionUtil;
 
@@ -28,7 +26,7 @@
  * "Case insensitive like" expression.
  * 
  */
-public class ASTLikeIgnoreCase extends PatternMatchNode {
+public class ASTLikeIgnoreCase extends IgnoreCaseNode {
     ASTLikeIgnoreCase(int id) {
         super(id, true);
     }
@@ -81,22 +79,4 @@
     protected String getEJBQLExpressionOperator(int index) {
         return "like";
     }
-    
-    @Override
-    protected void encodeChildAsEJBQL(PrintWriter pw, String rootId, int index) {
-        if (index > 0) {
-            pw.print(' ');
-            pw.print(getEJBQLExpressionOperator(index));
-            pw.print(' ');
-        }
-
-        if (children[index] == null) {
-            pw.print("null");
-        }
-        else {
-            pw.print("upper(");
-            ((SimpleNode) children[index]).encodeAsEJBQL(pw, rootId);
-            pw.print(")");
-        }
-    }
 }

Modified: cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTNotLikeIgnoreCase.java
URL: http://svn.apache.org/viewvc/cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTNotLikeIgnoreCase.java?rev=901894&r1=901893&r2=901894&view=diff
==============================================================================
--- cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTNotLikeIgnoreCase.java (original)
+++ cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTNotLikeIgnoreCase.java Thu Jan 21 22:25:54 2010
@@ -27,7 +27,7 @@
  * "Not like, ignore case" expression.
  * 
  */
-public class ASTNotLikeIgnoreCase extends PatternMatchNode {
+public class ASTNotLikeIgnoreCase extends IgnoreCaseNode {
     ASTNotLikeIgnoreCase(int id) {
         super(id, true);
     }
@@ -70,6 +70,11 @@
     protected String getExpressionOperator(int index) {
         return "not likeIgnoreCase";
     }
+    
+    @Override
+    protected String getEJBQLExpressionOperator(int index) {
+        return "not like";
+    }
 
     @Override
     public int getType() {

Added: cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/IgnoreCaseNode.java
URL: http://svn.apache.org/viewvc/cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/IgnoreCaseNode.java?rev=901894&view=auto
==============================================================================
--- cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/IgnoreCaseNode.java (added)
+++ cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/IgnoreCaseNode.java Thu Jan 21 22:25:54 2010
@@ -0,0 +1,48 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+package org.apache.cayenne.exp.parser;
+
+import java.io.PrintWriter;
+
+import org.apache.cayenne.exp.ExpressionException;
+
+/**
+ * Common node for likeIgnoreCase and notLikeIgnoreCase
+ */
+abstract class IgnoreCaseNode extends PatternMatchNode {
+    IgnoreCaseNode(int i, boolean ignoringCase) {
+        super(i, ignoringCase);
+    }
+    
+    @Override
+    protected void encodeChildrenAsEJBQL(PrintWriter pw, String rootId) {
+        //with like, first expression is always path, second is a literal, which must be uppercased
+        pw.print("upper(");
+        ((SimpleNode) children[0]).encodeAsEJBQL(pw, rootId);
+        pw.print(") ");
+        pw.print(getEJBQLExpressionOperator(0));
+        pw.print(" ");
+        
+        Object literal = ((ASTScalar) children[1]).getValue();
+        if (!(literal instanceof String)) {
+            throw new ExpressionException("Literal value should be a string");
+        }
+        SimpleNode.encodeScalarAsString(pw, ((String) literal).toUpperCase(), '\'');
+    }
+}

Modified: cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/SimpleNode.java
URL: http://svn.apache.org/viewvc/cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/SimpleNode.java?rev=901894&r1=901893&r2=901894&view=diff
==============================================================================
--- cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/SimpleNode.java (original)
+++ cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/SimpleNode.java Thu Jan 21 22:25:54 2010
@@ -353,9 +353,7 @@
         }
 
         if ((children != null) && (children.length > 0)) {
-            for (int i = 0; i < children.length; ++i) {
-                encodeChildAsEJBQL(pw, rootId, i);
-            }
+            encodeChildrenAsEJBQL(pw, rootId);
         }
 
         if (parent != null) {
@@ -366,18 +364,20 @@
     /**
      * Encodes child of this node with specified index to EJBQL
      */
-    protected void encodeChildAsEJBQL(PrintWriter pw, String rootId, int index) {
-        if (index > 0) {
-            pw.print(' ');
-            pw.print(getEJBQLExpressionOperator(index));
-            pw.print(' ');
-        }
-
-        if (children[index] == null) {
-            pw.print("null");
-        }
-        else {
-            ((SimpleNode) children[index]).encodeAsEJBQL(pw, rootId);
+    protected void encodeChildrenAsEJBQL(PrintWriter pw, String rootId) {
+        for (int i = 0; i < children.length; ++i) {
+            if (i > 0) {
+                pw.print(' ');
+                pw.print(getEJBQLExpressionOperator(i));
+                pw.print(' ');
+            }
+    
+            if (children[i] == null) {
+                pw.print("null");
+            }
+            else {
+                ((SimpleNode) children[i]).encodeAsEJBQL(pw, rootId);
+            }
         }
     }
 }

Modified: cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/jjtree/org/apache/cayenne/ejbql/EJBQLParser.jjt
URL: http://svn.apache.org/viewvc/cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/jjtree/org/apache/cayenne/ejbql/EJBQLParser.jjt?rev=901894&r1=901893&r2=901894&view=diff
==============================================================================
--- cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/jjtree/org/apache/cayenne/ejbql/EJBQLParser.jjt (original)
+++ cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/jjtree/org/apache/cayenne/ejbql/EJBQLParser.jjt Thu Jan 21 22:25:54 2010
@@ -1208,7 +1208,7 @@
 
 void pattern_value() #PatternValue : { }
 {
-	string_expression()
+	input_parameter() | string_literal()
 	[(<ESCAPE> escape_character())]
 }
 

Modified: cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/exp/parser/ASTLikeIgnoreCaseTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/exp/parser/ASTLikeIgnoreCaseTest.java?rev=901894&r1=901893&r2=901894&view=diff
==============================================================================
--- cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/exp/parser/ASTLikeIgnoreCaseTest.java (original)
+++ cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/exp/parser/ASTLikeIgnoreCaseTest.java Thu Jan 21 22:25:54 2010
@@ -26,6 +26,6 @@
 public class ASTLikeIgnoreCaseTest extends TestCase {
     public void testToEJBQL() {
         Expression like = ExpressionFactory.likeIgnoreCaseExp("a", "%b%");
-        assertEquals(like.toEJBQL("p"), "upper(p.a) like upper('%b%')");
+        assertEquals(like.toEJBQL("p"), "upper(p.a) like '%B%'");
     }
 }

Modified: cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/query/EJBQLQueryTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/query/EJBQLQueryTest.java?rev=901894&r1=901893&r2=901894&view=diff
==============================================================================
--- cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/query/EJBQLQueryTest.java (original)
+++ cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/query/EJBQLQueryTest.java Thu Jan 21 22:25:54 2010
@@ -297,19 +297,4 @@
     
         context.performQuery(query);
     }
-    
-    public void testLikeIgnoreCase() throws Exception {
-        deleteTestData();
-        
-        ObjectContext context = createDataContext();
-        
-        Artist a = context.newObject(Artist.class);
-        a.setArtistName("testLikeIgnoreCase");
-        context.commitChanges();
-        
-        EJBQLQuery query = new EJBQLQuery("select a from Artist a where upper(a.artistName) " +
-        		"like upper('%likeignore%')");
-    
-        assertEquals(context.performQuery(query).size(), 1);
-    }
 }