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();