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/29 16:17:40 UTC

svn commit: r904517 - /cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLConditionTranslator.java

Author: oltka
Date: Fri Jan 29 15:17:39 2010
New Revision: 904517

URL: http://svn.apache.org/viewvc?rev=904517&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

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=904517&r1=904516&r2=904517&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 Fri Jan 29 15:17:39 2010
@@ -166,7 +166,7 @@
 
         String subqueryId = context.createIdAlias(id);
         ClassDescriptor targetDescriptor = context.getEntityDescriptor(subqueryId);
-       
+
         if (expression.isNegated()) {
             context.append(" NOT");
         }
@@ -182,7 +182,7 @@
         ObjRelationship relationship = (ObjRelationship) correlatedEntityDescriptor
                 .getEntity()
                 .getRelationship(path.getRelativePath());
-        
+
         if (relationship.getDbRelationshipPath().contains(".")) {
             // if the DbRelationshipPath contains '.', the relationship is flattened
             subqueryRootAlias = processFlattenedRelationShip(
@@ -274,7 +274,7 @@
         ObjRelationship relationship = (ObjRelationship) correlatedEntityDescriptor
                 .getEntity()
                 .getRelationship(path.getRelativePath());
-        
+
         if (relationship.getDbRelationshipPath().contains(".")) {
             // if the DbRelationshipPath contains '.', the relationship is flattened
             subqueryRootAlias = processFlattenedRelationShip(
@@ -316,12 +316,12 @@
     private String processFlattenedRelationShip(
             String subqueryRootAlias,
             ObjRelationship relationship) {
-        List<DbRelationship> dbRelationships = relationship
-                .getDbRelationships();
+        List<DbRelationship> dbRelationships = relationship.getDbRelationships();
         // reverse order to get the nearest to the correlated of the direct relation
         for (int i = dbRelationships.size() - 1; i > 0; i--) {
             DbRelationship dbRelationship = dbRelationships.get(i);
-            String subqueryTargetTableName = ((DbEntity)dbRelationship.getTargetEntity()).getFullyQualifiedName();
+            String subqueryTargetTableName = ((DbEntity) dbRelationship.getTargetEntity())
+                    .getFullyQualifiedName();
             String subqueryTargetAlias;
             if (i == dbRelationships.size() - 1) {
                 subqueryTargetAlias = subqueryRootAlias;
@@ -333,18 +333,17 @@
                         subqueryTargetTableName,
                         subqueryTargetTableName);
             }
-           
 
             context.append(" JOIN ");
 
-            String subquerySourceTableName = ((DbEntity)dbRelationship
-                    .getSourceEntity())
+            String subquerySourceTableName = ((DbEntity) dbRelationship.getSourceEntity())
                     .getFullyQualifiedName();
             String subquerySourceAlias = context.getTableAlias(
                     subquerySourceTableName,
                     subquerySourceTableName);
 
-            context.append(subquerySourceTableName).append(' ').append(subquerySourceAlias);
+            context.append(subquerySourceTableName).append(' ').append(
+                    subquerySourceAlias);
 
             context.append(" ON (");
 
@@ -390,15 +389,18 @@
         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;
-                            }
+
+                    // We rewrite expression "parameter = :x" where x=null
+                    // as "parameter IS NULL"
+                    // BUT in such as ":x = parameter" (where x=null) we don't do anything
+                    // as a result it can be unsupported in some DB
+                    if (expression.getChild(1) instanceof EJBQLNamedInputParameter) {
+                        EJBQLNamedInputParameter par = (EJBQLNamedInputParameter) expression
+                                .getChild(1);
+                        if (context.namedParameters.containsKey(par.getText())
+                                && context.namedParameters.get(par.getText()) == null) {
+                            context.append(" IS NULL");
+                            return false;
                         }
                     }
                 }
@@ -573,7 +575,7 @@
 
         return true;
     }
-    
+
     /**
      * Visits conditional node, suppling brackets if needed
      */
@@ -583,18 +585,19 @@
         }
 
         afterChild(e, afterText, childIndex);
-        
+
         if (childIndex == e.getChildrenCount() - 1 && needBracket(e)) {
             context.append(")");
         }
     }
-    
+
     /**
      * Checks whether expression needs to be rounded by brackets
      */
     boolean needBracket(AggregateConditionNode e) {
-        return (e.jjtGetParent() instanceof AggregateConditionNode) &&
-            e.getPriority() > ((AggregateConditionNode) e.jjtGetParent()).getPriority();
+        return (e.jjtGetParent() instanceof AggregateConditionNode)
+                && e.getPriority() > ((AggregateConditionNode) e.jjtGetParent())
+                        .getPriority();
     }
 
     protected void afterChild(EJBQLExpression e, String text, int childIndex) {
@@ -835,7 +838,9 @@
 
                 Property property = descriptor.getProperty(pathChunk);
                 if (property instanceof AttributeProperty) {
-                    String atrType = ((AttributeProperty) property).getAttribute().getType();
+                    String atrType = ((AttributeProperty) property)
+                            .getAttribute()
+                            .getType();
 
                     type = TypesMapping.getSqlNameByType(TypesMapping
                             .getSqlTypeByJava(atrType));