You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2007/12/27 14:37:02 UTC

svn commit: r607069 - in /cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne: access/jdbc/ ejbql/ ejbql/parser/

Author: aadamchik
Date: Thu Dec 27 05:37:01 2007
New Revision: 607069

URL: http://svn.apache.org/viewvc?rev=607069&view=rev
Log:
CAY-948 Implement flattened attributes in Cayenne
(preliminary refactoring of EJBQL translator)

Modified:
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLConditionTranslator.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLJoinAppender.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLTranslationContext.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/EJBQLCompiledExpression.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/CompiledExpression.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLConditionTranslator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLConditionTranslator.java?rev=607069&r1=607068&r2=607069&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLConditionTranslator.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLConditionTranslator.java Thu Dec 27 05:37:01 2007
@@ -42,7 +42,6 @@
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbJoin;
 import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.map.ObjRelationship;
 import org.apache.cayenne.reflect.ClassDescriptor;
 
 /**
@@ -166,11 +165,9 @@
         context.append(subqueryTableName).append(' ').append(subqueryRootAlias);
         context.append(" WHERE");
 
-        ObjRelationship relationship = context.getIncomingRelationship(id);
-
         // TODO: andrus, 8/11/2007 flattened?
-        DbRelationship correlatedJoinRelationship = relationship
-                .getDbRelationships()
+        DbRelationship correlatedJoinRelationship = context
+                .getIncomingRelationships(id)
                 .get(0);
         Iterator<DbJoin> it = correlatedJoinRelationship.getJoins().iterator();
         while (it.hasNext()) {
@@ -246,10 +243,9 @@
         context.append(subqueryTableName).append(' ').append(subqueryRootAlias);
         context.append(" WHERE");
 
-        ObjRelationship relationship = context.getIncomingRelationship(id);
         // TODO: andrus, 8/11/2007 flattened?
-        DbRelationship correlatedJoinRelationship = relationship
-                .getDbRelationships()
+        DbRelationship correlatedJoinRelationship = context
+                .getIncomingRelationships(id)
                 .get(0);
 
         for (DbJoin join : correlatedJoinRelationship.getJoins()) {

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLJoinAppender.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLJoinAppender.java?rev=607069&r1=607068&r2=607069&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLJoinAppender.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLJoinAppender.java Thu Dec 27 05:37:01 2007
@@ -20,12 +20,12 @@
 
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 
 import org.apache.cayenne.ejbql.EJBQLException;
 import org.apache.cayenne.map.DbJoin;
 import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.map.ObjRelationship;
 import org.apache.cayenne.reflect.ClassDescriptor;
 
 /**
@@ -58,8 +58,7 @@
             String sourceIdPath,
             String relationship,
             String targetId) {
-        
-        
+
         if (reusableJoins == null) {
             reusableJoins = new HashMap<String, String>();
         }
@@ -86,13 +85,13 @@
 
     protected void appendJoin(String marker, String lhsId, String rhsId, String semantics) {
 
-        ObjRelationship joinRelationship = context.getIncomingRelationship(rhsId);
-        if (joinRelationship == null) {
+        List<DbRelationship> joinRelationships = context.getIncomingRelationships(rhsId);
+        if (joinRelationships.isEmpty()) {
             throw new EJBQLException("No join configured for id " + rhsId);
         }
 
         // TODO: andrus, 4/8/2007 - support for flattened relationships
-        DbRelationship incomingDB = joinRelationship.getDbRelationships().get(0);
+        DbRelationship incomingDB = joinRelationships.get(0);
 
         String sourceAlias = context.getTableAlias(lhsId, incomingDB
                 .getSourceEntity()

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLTranslationContext.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLTranslationContext.java?rev=607069&r1=607068&r2=607069&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLTranslationContext.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLTranslationContext.java Thu Dec 27 05:37:01 2007
@@ -19,10 +19,12 @@
 package org.apache.cayenne.access.jdbc;
 
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import org.apache.cayenne.ejbql.EJBQLCompiledExpression;
 import org.apache.cayenne.ejbql.EJBQLException;
+import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.map.ObjRelationship;
 import org.apache.cayenne.query.SQLResultSetMapping;
 import org.apache.cayenne.query.SQLTemplate;
@@ -96,8 +98,8 @@
         return compiledExpression.getEntityDescriptor(resolveId(id));
     }
 
-    ObjRelationship getIncomingRelationship(String id) {
-        return compiledExpression.getIncomingRelationship(resolveId(id));
+    List<DbRelationship> getIncomingRelationships(String id) {
+        return compiledExpression.getIncomingRelationships(resolveId(id));
     }
 
     /**

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/EJBQLCompiledExpression.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/EJBQLCompiledExpression.java?rev=607069&r1=607068&r2=607069&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/EJBQLCompiledExpression.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/EJBQLCompiledExpression.java Thu Dec 27 05:37:01 2007
@@ -18,7 +18,9 @@
  ****************************************************************/
 package org.apache.cayenne.ejbql;
 
-import org.apache.cayenne.map.ObjRelationship;
+import java.util.List;
+
+import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.query.SQLResultSetMapping;
 import org.apache.cayenne.reflect.ClassDescriptor;
 
@@ -47,10 +49,10 @@
     ClassDescriptor getEntityDescriptor(String identifier);
 
     /**
-     * Returns a relationship that joins identifier with a parent entity. Returns null if
-     * the identifier corresponds to one of the query roots.
+     * Returns a collection of relationships that joins identifier with a parent entity.
+     * Returns null if the identifier corresponds to one of the query roots.
      */
-    ObjRelationship getIncomingRelationship(String identifier);
+    List<DbRelationship> getIncomingRelationships(String identifier);
 
     /**
      * Returns EJB QL source of the compiled expression if available.

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/CompiledExpression.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/CompiledExpression.java?rev=607069&r1=607068&r2=607069&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/CompiledExpression.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/CompiledExpression.java Thu Dec 27 05:37:01 2007
@@ -18,10 +18,13 @@
  ****************************************************************/
 package org.apache.cayenne.ejbql.parser;
 
+import java.util.Collections;
+import java.util.List;
 import java.util.Map;
 
 import org.apache.cayenne.ejbql.EJBQLCompiledExpression;
 import org.apache.cayenne.ejbql.EJBQLExpression;
+import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.map.ObjRelationship;
 import org.apache.cayenne.query.SQLResultSetMapping;
 import org.apache.cayenne.reflect.ClassDescriptor;
@@ -36,8 +39,8 @@
 
     private String source;
     private String rootId;
-    private Map descriptorsById;
-    private Map incomingById;
+    private Map<String, ClassDescriptor> descriptorsById;
+    private Map<String, ObjRelationship> incomingById;
     private EJBQLExpression expression;
     private SQLResultSetMapping resultSetMapping;
 
@@ -46,10 +49,9 @@
             return null;
         }
 
-        return (ClassDescriptor) descriptorsById
-                .get(Compiler.normalizeIdPath(idVariable));
+        return descriptorsById.get(Compiler.normalizeIdPath(idVariable));
     }
-    
+
     public SQLResultSetMapping getResultSetMapping() {
         return resultSetMapping;
     }
@@ -58,8 +60,13 @@
         return rootId != null ? getEntityDescriptor(rootId) : null;
     }
 
-    public ObjRelationship getIncomingRelationship(String identifier) {
-        return (ObjRelationship) incomingById.get(identifier);
+    public List<DbRelationship> getIncomingRelationships(String identifier) {
+        ObjRelationship relationship = incomingById.get(identifier);
+        if (relationship == null) {
+            return Collections.emptyList();
+        }
+
+        return relationship.getDbRelationships();
     }
 
     public EJBQLExpression getExpression() {
@@ -74,11 +81,11 @@
         this.expression = expression;
     }
 
-    void setDescriptorsById(Map descriptorsById) {
+    void setDescriptorsById(Map<String, ClassDescriptor> descriptorsById) {
         this.descriptorsById = descriptorsById;
     }
 
-    void setIncomingById(Map incomingById) {
+    void setIncomingById(Map<String, ObjRelationship> incomingById) {
         this.incomingById = incomingById;
     }
 
@@ -89,7 +96,7 @@
     void setRootId(String rootId) {
         this.rootId = rootId;
     }
-    
+
     void setResultSetMapping(SQLResultSetMapping resultSetMapping) {
         this.resultSetMapping = resultSetMapping;
     }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java?rev=607069&r1=607068&r2=607069&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java Thu Dec 27 05:37:01 2007
@@ -21,7 +21,6 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.apache.cayenne.ejbql.EJBQLBaseVisitor;
@@ -50,9 +49,9 @@
 
     private String rootId;
     private EntityResolver resolver;
-    private Map descriptorsById;
-    private Map incomingById;
-    private Collection paths;
+    private Map<String, ClassDescriptor> descriptorsById;
+    private Map<String, ObjRelationship> incomingById;
+    private Collection<EJBQLPath> paths;
     private EJBQLExpressionVisitor fromItemVisitor;
     private EJBQLExpressionVisitor joinVisitor;
     private EJBQLExpressionVisitor pathVisitor;
@@ -61,8 +60,8 @@
 
     Compiler(EntityResolver resolver) {
         this.resolver = resolver;
-        this.descriptorsById = new HashMap();
-        this.incomingById = new HashMap();
+        this.descriptorsById = new HashMap<String, ClassDescriptor>();
+        this.incomingById = new HashMap<String, ObjRelationship>();
 
         this.rootDescriptorVisitor = new SelectExpressionVisitor();
         this.fromItemVisitor = new FromItemVisitor();
@@ -75,17 +74,15 @@
 
         // postprocess paths, now that all id vars are resolved
         if (paths != null) {
-            Iterator it = paths.iterator();
-            while (it.hasNext()) {
-                EJBQLPath path = (EJBQLPath) it.next();
+            for (EJBQLPath path : paths) {
                 String id = normalizeIdPath(path.getId());
 
-                ClassDescriptor descriptor = (ClassDescriptor) descriptorsById.get(id);
+                ClassDescriptor descriptor = descriptorsById.get(id);
                 if (descriptor == null) {
                     throw new EJBQLException("Unmapped id variable: " + id);
                 }
 
-                StringBuffer buffer = new StringBuffer(id);
+                StringBuilder buffer = new StringBuilder(id);
 
                 for (int i = 1; i < path.getChildrenCount(); i++) {
 
@@ -118,9 +115,9 @@
         return compiled;
     }
 
-    private void addPath(EJBQLExpression path) {
+    private void addPath(EJBQLPath path) {
         if (paths == null) {
-            paths = new ArrayList();
+            paths = new ArrayList<EJBQLPath>();
         }
 
         paths.add(path);
@@ -215,9 +212,7 @@
                 // per JPA spec, 4.4.2, "Identification variables are case insensitive."
                 String id = normalizeIdPath(expression.getId());
 
-                ClassDescriptor old = (ClassDescriptor) descriptorsById.put(
-                        id,
-                        descriptor);
+                ClassDescriptor old = descriptorsById.put(id, descriptor);
                 if (old != null && old != descriptor) {
                     throw new EJBQLException(
                             "Duplicate identification variable definition: "
@@ -253,7 +248,7 @@
         public boolean visitPath(EJBQLExpression expression, int finishedChildIndex) {
             if (finishedChildIndex + 1 < expression.getChildrenCount()) {
                 this.id = ((EJBQLPath) expression).getId();
-                this.descriptor = (ClassDescriptor) descriptorsById.get(id);
+                this.descriptor = descriptorsById.get(id);
 
                 if (descriptor == null) {
                     throw new EJBQLException("Unmapped id variable: " + id);
@@ -283,9 +278,7 @@
                 String aliasId = expression.getText();
 
                 // map id variable to class descriptor
-                ClassDescriptor old = (ClassDescriptor) descriptorsById.put(
-                        aliasId,
-                        descriptor);
+                ClassDescriptor old = descriptorsById.put(aliasId, descriptor);
                 if (old != null && old != descriptor) {
                     throw new EJBQLException(
                             "Duplicate identification variable definition: "
@@ -308,7 +301,7 @@
     class PathVisitor extends EJBQLBaseVisitor {
 
         public boolean visitPath(EJBQLExpression expression, int finishedChildIndex) {
-            addPath(expression);
+            addPath((EJBQLPath) expression);
             return false;
         }
     }
@@ -326,7 +319,7 @@
         }
 
         public boolean visitPath(EJBQLExpression expression, int finishedChildIndex) {
-            addPath(expression);
+            addPath((EJBQLPath) expression);
             addResultSetColumn();
             return false;
         }