You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by ol...@apache.org on 2010/01/14 10:52:24 UTC

svn commit: r899136 - in /cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src: main/java/org/apache/cayenne/access/jdbc/ test/java/org/apache/cayenne/access/jdbc/ test/java/org/apache/cayenne/query/

Author: oltka
Date: Thu Jan 14 09:52:24 2010
New Revision: 899136

URL: http://svn.apache.org/viewvc?rev=899136&view=rev
Log:
CAY-1365 "= NULL" being used instead of "IS NULL" on an EJBQL expression..

Modified:
    cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLConditionTranslator.java
    cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/jdbc/EJBQLSelectTranslatorTest.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/access/jdbc/EJBQLConditionTranslator.java
URL: http://svn.apache.org/viewvc/cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLConditionTranslator.java?rev=899136&r1=899135&r2=899136&view=diff
==============================================================================
--- cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLConditionTranslator.java (original)
+++ cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLConditionTranslator.java Thu Jan 14 09:52:24 2010
@@ -300,6 +300,19 @@
     public boolean visitEquals(EJBQLExpression expression, int finishedChildIndex) {
         switch (finishedChildIndex) {
             case 0:
+                if (expression.getChildrenCount() == 2) {
+                    for (int j = 0; j < expression.getChildrenCount(); j++) {
+                        if (expression.getChild(j) instanceof EJBQLNamedInputParameter) {
+                            EJBQLNamedInputParameter par = (EJBQLNamedInputParameter) expression
+                                    .getChild(j);
+                            if (context.namedParameters.containsKey(par.getText())
+                                    && context.namedParameters.get(par.getText()) == null) {
+                                context.append(" IS NULL");
+                                return false;
+                            }
+                        }
+                    }
+                }
                 context.append(" =");
                 break;
             case 1:
@@ -693,6 +706,7 @@
             EJBQLEquals parent = ((EJBQLNamedInputParameter) expression).getParent();
 
             context.pushMarker("@processParameter", true);
+
             EJBQLPathAnaliserTranslator translator = new EJBQLPathAnaliserTranslator(
                     context);
             parent.visit(translator);
@@ -706,7 +720,7 @@
                     throw new EJBQLException("Unmapped id variable: " + id);
                 }
                 String pathChunk = translator.lastPathComponent;
-                
+
                 Property property = descriptor.getProperty(pathChunk);
                 if (property instanceof AttributeProperty) {
                     String atrType = ((AttributeProperty) property).getAttribute().getType();

Modified: cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/jdbc/EJBQLSelectTranslatorTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/jdbc/EJBQLSelectTranslatorTest.java?rev=899136&r1=899135&r2=899136&view=diff
==============================================================================
--- cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/jdbc/EJBQLSelectTranslatorTest.java (original)
+++ cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/jdbc/EJBQLSelectTranslatorTest.java Thu Jan 14 09:52:24 2010
@@ -175,7 +175,7 @@
         assertTrue(sql, sql.startsWith("SELECT"));
         assertTrue(sql, sql.endsWith("WHERE t0.ESTIMATED_PRICE > #bind($id0 'DECIMAL')"));
     }
-
+    
     public void testSelectFromWhereGreaterOrEqual() {
         SQLTemplate query = translateSelect("select p from Painting p where p.estimatedPrice >= 2");
         String sql = query.getDefaultTemplate();
@@ -283,4 +283,39 @@
 
         return i;
     }
+    
+    // if parameter value is null (in this test x := null) we will generate "IS NULL"
+    public void testEqualsNullParameter() {
+        String ejbql = "select p from Painting p WHERE p.toArtist=:x";
+        EJBQLParser parser = EJBQLParserFactory.getParser();
+        EJBQLCompiledExpression select = parser.compile(ejbql, getDomain()
+                .getEntityResolver());
+        EJBQLQuery query = new EJBQLQuery(ejbql);
+        query.setParameter("x", null);
+
+        EJBQLTranslationContext tr = new EJBQLTranslationContext(getDomain()
+                .getEntityResolver(), query, select, new JdbcEJBQLTranslatorFactory());
+        select.getExpression().visit(new EJBQLSelectTranslator(tr));
+        String sql = tr.getQuery().getDefaultTemplate();
+        assertTrue(sql, sql
+                .endsWith("t0.ARTIST_ID IS NULL"));
+    }
+    
+    // if parameter value is null and more than one parameter in query
+    public void testEqualsNullAndNotNullParameter() {
+        String ejbql = "select p from Painting p WHERE p.toArtist=:x OR p.toArtist.artistName=:b";
+        EJBQLParser parser = EJBQLParserFactory.getParser();
+        EJBQLCompiledExpression select = parser.compile(ejbql, getDomain()
+                .getEntityResolver());
+        EJBQLQuery query = new EJBQLQuery(ejbql);
+        query.setParameter("x", null);
+        query.setParameter("b", "Y");
+
+        EJBQLTranslationContext tr = new EJBQLTranslationContext(getDomain()
+                .getEntityResolver(), query, select, new JdbcEJBQLTranslatorFactory());
+        select.getExpression().visit(new EJBQLSelectTranslator(tr));
+        String sql = tr.getQuery().getDefaultTemplate();
+        assertTrue(sql, sql
+                .endsWith("t0.ARTIST_ID IS NULL OR t1.ARTIST_NAME = #bind($id0)"));
+    }
 }

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=899136&r1=899135&r2=899136&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 14 09:52:24 2010
@@ -273,6 +273,13 @@
         createDataContext().performQuery(query);
     }
     
+    public void testNullAndNotNullParameter() {
+        EJBQLQuery query = new EJBQLQuery("select p from Painting p WHERE p.toArtist=:x OR p.toArtist.artistName=:b");
+        query.setParameter("x", null);
+        query.setParameter("b", "Y");
+        createDataContext().performQuery(query);
+    }
+    
     public void testJoinToJoined() {
         ObjectContext context = createDataContext();