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/06/24 16:17:41 UTC

svn commit: r550234 - in /cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src: main/java/org/apache/cayenne/access/jdbc/ test/java/org/apache/cayenne/access/jdbc/

Author: aadamchik
Date: Sun Jun 24 07:17:40 2007
New Revision: 550234

URL: http://svn.apache.org/viewvc?view=rev&rev=550234
Log:
CAY-452 EJB QL Cayenne Query
changing join reuse logic - no longer reusing explicit joins, only the implicit ones coming from paths

Modified:
    cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLFromTranslator.java
    cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLTranslationContext.java
    cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/jdbc/EJBQLSelectTranslatorTest.java

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLFromTranslator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLFromTranslator.java?view=diff&rev=550234&r1=550233&r2=550234
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLFromTranslator.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLFromTranslator.java Sun Jun 24 07:17:40 2007
@@ -71,7 +71,7 @@
 
     public boolean visitInnerJoin(EJBQLJoin join, int finishedChildIndex) {
         if (finishedChildIndex < 0) {
-            appendJoin(join, "INNER JOIN", true);
+            appendJoin(join, "INNER JOIN");
         }
         return false;
     }
@@ -83,12 +83,12 @@
 
     public boolean visitOuterJoin(EJBQLJoin join, int finishedChildIndex) {
         if (finishedChildIndex < 0) {
-            appendJoin(join, "LEFT OUTER JOIN", false);
+            appendJoin(join, "LEFT OUTER JOIN");
         }
         return false;
     }
 
-    private void appendJoin(EJBQLJoin join, String semantics, boolean reusable) {
+    private void appendJoin(EJBQLJoin join, String semantics) {
 
         String rhsId = join.getRightHandSideId();
 
@@ -140,10 +140,6 @@
         }
 
         context.append(")");
-
-        if (reusable) {
-            context.registerReusableJoin(lhsId, joinRelationship.getName(), rhsId);
-        }
     }
 
     private String appendTable(String id) {

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLTranslationContext.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLTranslationContext.java?view=diff&rev=550234&r1=550233&r2=550234
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLTranslationContext.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLTranslationContext.java Sun Jun 24 07:17:40 2007
@@ -211,8 +211,10 @@
 
     /**
      * Registers a "reusable" join, returning a preexisting ID if the join is already
-     * registered. Reusable normally means an inner join that can be duplicated implicitly
-     * in the path expressions.
+     * 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) {

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/jdbc/EJBQLSelectTranslatorTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/jdbc/EJBQLSelectTranslatorTest.java?view=diff&rev=550234&r1=550233&r2=550234
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/jdbc/EJBQLSelectTranslatorTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/jdbc/EJBQLSelectTranslatorTest.java Sun Jun 24 07:17:40 2007
@@ -80,6 +80,25 @@
                 sql.indexOf("INNER JOIN PAINTING AS t2 ON (t0.ARTIST_ID = t2.ARTIST_ID)") > 0);
     }
 
+    public void testSelectImplicitColumnJoins() throws Exception {
+        SQLTemplate query = translateSelect("SELECT a.paintingArray.toGallery.galleryName "
+                + "FROM Artist a JOIN a.paintingArray b");
+        String sql = query.getDefaultTemplate();
+
+        assertTrue(sql, sql.startsWith("SELECT "));
+
+        // check that overlapping implicit and explicit joins did not result in duplicates
+        StringBuffer fromMarker = (StringBuffer) query.getParameters().get("marker0");
+        assertNotNull(fromMarker);
+        assertTrue(fromMarker.toString(), fromMarker.indexOf("INNER JOIN GALLERY") >= 0);
+        assertTrue(fromMarker.toString(), fromMarker.indexOf("INNER JOIN PAINTING") >= 0);
+
+        int i1 = sql.indexOf("INNER JOIN PAINTING");
+        assertTrue(sql, i1 >= 0);
+        int i2 = sql.indexOf("INNER JOIN PAINTING", i1 + 1);
+        assertTrue(sql, i2 < 0);
+    }
+
     public void testSelectDistinct() {
         SQLTemplate query = translateSelect("select distinct a from Artist a");
         String sql = query.getDefaultTemplate();