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 13:16:06 UTC

svn commit: r607047 - in /cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc: EJBQLIdentifierColumnsTranslator.java EJBQLJoinAppender.java EJBQLPathTranslator.java EJBQLTranslationContext.java

Author: aadamchik
Date: Thu Dec 27 04:16:05 2007
New Revision: 607047

URL: http://svn.apache.org/viewvc?rev=607047&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/EJBQLIdentifierColumnsTranslator.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/EJBQLPathTranslator.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLTranslationContext.java

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLIdentifierColumnsTranslator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLIdentifierColumnsTranslator.java?rev=607047&r1=607046&r2=607047&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLIdentifierColumnsTranslator.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLIdentifierColumnsTranslator.java Thu Dec 27 04:16:05 2007
@@ -52,6 +52,7 @@
         this.context = context;
     }
 
+    @Override
     public boolean visitIdentifier(EJBQLExpression expression) {
 
         final String idVar = expression.getText();
@@ -64,6 +65,11 @@
             public boolean visitAttribute(AttributeProperty property) {
                 ObjAttribute oa = property.getAttribute();
                 Iterator<?> dbPathIterator = oa.getDbPathIterator();
+
+                EJBQLJoinAppender joinAppender = null;
+                String marker = null;
+                String lhsId = idVar;
+
                 while (dbPathIterator.hasNext()) {
                     Object pathPart = dbPathIterator.next();
 
@@ -73,13 +79,22 @@
                     }
 
                     else if (pathPart instanceof DbRelationship) {
-                        // DbRelationship rel = (DbRelationship) pathPart;
-                        // dbRelationshipAdded(rel);
+
+                        if (marker == null) {
+                            marker = EJBQLJoinAppender.makeJoinTailMarker(idVar);
+                            joinAppender = context
+                                    .getTranslatorFactory()
+                                    .getJoinAppender(context);
+                        }
+
+                        DbRelationship dr = (DbRelationship) pathPart;
+
+                        String rhsId = lhsId + ".db:" + dr.getName();
+                        joinAppender.appendOuterJoin(marker, lhsId, rhsId);
+                        lhsId = rhsId;
                     }
                     else if (pathPart instanceof DbAttribute) {
-                        DbAttribute dbAttr = (DbAttribute) pathPart;
-
-                        appendColumn(idVar, dbAttr, oa.getType());
+                        appendColumn(idVar, (DbAttribute) pathPart, oa.getType());
                     }
                 }
                 return true;

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=607047&r1=607046&r2=607047&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 04:16:05 2007
@@ -18,7 +18,9 @@
  ****************************************************************/
 package org.apache.cayenne.access.jdbc;
 
+import java.util.HashMap;
 import java.util.Iterator;
+import java.util.Map;
 
 import org.apache.cayenne.ejbql.EJBQLException;
 import org.apache.cayenne.map.DbJoin;
@@ -35,11 +37,45 @@
 public class EJBQLJoinAppender {
 
     protected EJBQLTranslationContext context;
+    private Map<String, String> reusableJoins;
+
+    static String makeJoinTailMarker(String id) {
+        return "FROM_TAIL" + id;
+    }
 
     public EJBQLJoinAppender(EJBQLTranslationContext context) {
         this.context = context;
     }
 
+    /**
+     * Registers a "reusable" join, returning a preexisting ID if the join is already
+     * registered. Reusable joins are the implicit inner joins that are added as a result
+     * of processing of path expressions in SELECT or WHERE clauses. Note that if an
+     * implicit INNER join overlaps with an explicit INNER join, both joins are added to
+     * the query.
+     */
+    public String registerReusableJoin(
+            String sourceIdPath,
+            String relationship,
+            String targetId) {
+        
+        
+        if (reusableJoins == null) {
+            reusableJoins = new HashMap<String, String>();
+        }
+
+        String key = sourceIdPath + ":" + relationship;
+
+        String oldId = reusableJoins.put(key, targetId);
+        if (oldId != null) {
+            // revert back to old id
+            reusableJoins.put(key, oldId);
+            return oldId;
+        }
+
+        return null;
+    }
+
     public void appendInnerJoin(String marker, String lhsId, String rhsId) {
         appendJoin(marker, lhsId, rhsId, "INNER JOIN");
     }
@@ -127,7 +163,4 @@
         }
     }
 
-    static String makeJoinTailMarker(String id) {
-        return "FROM_TAIL" + id;
-    }
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLPathTranslator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLPathTranslator.java?rev=607047&r1=607046&r2=607047&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLPathTranslator.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLPathTranslator.java Thu Dec 27 04:16:05 2007
@@ -103,9 +103,15 @@
     }
 
     private void resolveJoin(boolean inner) {
+        
+        EJBQLJoinAppender joinAppender = context.getTranslatorFactory().getJoinAppender(
+                context);
 
         String newPath = idPath + '.' + lastPathComponent;
-        String oldPath = context.registerReusableJoin(idPath, lastPathComponent, newPath);
+        String oldPath = joinAppender.registerReusableJoin(
+                idPath,
+                lastPathComponent,
+                newPath);
 
         this.fullPath = fullPath + '.' + lastPathComponent;
 
@@ -115,10 +121,6 @@
                     .getDbEntityName());
         }
         else {
-
-            EJBQLJoinAppender joinAppender = context
-                    .getTranslatorFactory()
-                    .getJoinAppender(context);
 
             // register join
             if (inner) {

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=607047&r1=607046&r2=607047&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 04:16:05 2007
@@ -42,7 +42,6 @@
     private StringBuilder currentBuffer;
     private EJBQLCompiledExpression compiledExpression;
     private Map<String, Object> attributes;
-    private Map<String, String> reusableJoins;
     private Map<Object, Object> parameters;
     private Map<String, String> idAliases;
     private int columnAliasPosition;
@@ -276,30 +275,6 @@
 
     Object getBoundParameter(String name) {
         return boundParameters != null ? boundParameters.get(name) : null;
-    }
-
-    /**
-     * Registers a "reusable" join, returning a preexisting ID if the join is already
-     * registered. Reusable joins are the implicit inner joins that are added as a result
-     * of processing of path expressions in SELECT or WHERE clauses. Note that if an
-     * implicit INNER join overlaps with an explicit INNER join, both joins are added to
-     * the query.
-     */
-    String registerReusableJoin(String sourceIdPath, String relationship, String targetId) {
-        if (reusableJoins == null) {
-            reusableJoins = new HashMap<String, String>();
-        }
-
-        String key = sourceIdPath + ":" + relationship;
-
-        String oldId = reusableJoins.put(key, targetId);
-        if (oldId != null) {
-            // revert back to old id
-            reusableJoins.put(key, oldId);
-            return oldId;
-        }
-
-        return null;
     }
 
     /**