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/12 16:49:42 UTC

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

Author: aadamchik
Date: Tue Jun 12 07:49:41 2007
New Revision: 546514

URL: http://svn.apache.org/viewvc?view=rev&rev=546514
Log:
EJBQL joins processing
fixing incorrect left-hand-side alias

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/EJBQLPathTranslator.java
    cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/EJBQLJoin.java
    cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLJoinsTest.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=546514&r1=546513&r2=546514
==============================================================================
--- 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 Tue Jun 12 07:49:41 2007
@@ -32,8 +32,6 @@
 public class EJBQLFromTranslator extends EJBQLBaseVisitor {
 
     private EJBQLTranslationContext context;
-    private String lastTableAlias;
-    private String lastId;
 
     public EJBQLFromTranslator(EJBQLTranslationContext context) {
         super(true);
@@ -42,12 +40,7 @@
 
     public boolean visitFromItem(EJBQLFromItem expression, int finishedChildIndex) {
         if (finishedChildIndex < 0) {
-            if (lastTableAlias != null) {
-                context.append(',');
-            }
-
-            lastId = expression.getId();
-            lastTableAlias = appendTable(lastId);
+            appendTable(expression.getId());
         }
 
         return true;
@@ -77,34 +70,31 @@
         return true;
     }
 
-    void setLastTableAlias(String alias) {
-        this.lastTableAlias = alias;
-    }
-
     private void appendJoin(EJBQLJoin join, String semantics, boolean reusable) {
 
-        String id = join.getId();
+        String rhsId = join.getRightHandSideId();
 
-        if (lastTableAlias == null) {
-            throw new EJBQLException("No source table for join: " + id);
+        ObjRelationship joinRelationship = context
+                .getCompiledExpression()
+                .getIncomingRelationship(rhsId);
+        if (joinRelationship == null) {
+            throw new EJBQLException("No join configured for id " + rhsId);
         }
 
-        String sourceAlias = lastTableAlias;
+        // TODO: andrus, 4/8/2007 - support for flattened relationships
+        DbRelationship incomingDB = (DbRelationship) joinRelationship
+                .getDbRelationships()
+                .get(0);
+
+        String lhsId = join.getLeftHandSideId();
+        String sourceAlias = context.getAlias(lhsId, incomingDB
+                .getSourceEntity()
+                .getName());
 
         context.append(" ").append(semantics);
-        String targetAlias = appendTable(id);
+        String targetAlias = appendTable(rhsId);
         context.append(" ON (");
 
-        ObjRelationship incoming = context
-                .getCompiledExpression()
-                .getIncomingRelationship(id);
-        if (incoming == null) {
-            throw new EJBQLException("No join configured for id " + id);
-        }
-
-        // TODO: andrus, 4/8/2007 - support for flattened relationships
-        DbRelationship incomingDB = (DbRelationship) incoming.getDbRelationships().get(0);
-
         Iterator it = incomingDB.getJoins().iterator();
         if (it.hasNext()) {
             DbJoin dbJoin = (DbJoin) it.next();
@@ -134,11 +124,8 @@
         context.append(")");
 
         if (reusable) {
-            context.registerReusableJoin(lastId, incoming.getName(), id);
+            context.registerReusableJoin(lhsId, joinRelationship.getName(), rhsId);
         }
-
-        this.lastTableAlias = targetAlias;
-        this.lastId = id;
     }
 
     private String appendTable(String id) {

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLPathTranslator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLPathTranslator.java?view=diff&rev=546514&r1=546513&r2=546514
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLPathTranslator.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLPathTranslator.java Tue Jun 12 07:49:41 2007
@@ -35,7 +35,6 @@
 
     private EJBQLTranslationContext context;
     private ObjEntity currentEntity;
-    private ObjRelationship currentIncoming;
     private String lastPathComponent;
     private String lastAlias;
     private String idPath;
@@ -122,11 +121,8 @@
                 joinAppender = new EJBQLFromTranslator(context);
             }
 
-            ObjEntity sourceEntity = (ObjEntity) currentIncoming.getSourceEntity();
-
             context.switchToMarker(EJBQLTranslationContext.FROM_TAIL_MARKER);
-            joinAppender.setLastTableAlias(context.getAlias(idPath, sourceEntity
-                    .getDbEntityName()));
+
             joinAppender.visitInnerJoin(join, -1);
             context.switchToMainBuffer();
 
@@ -146,7 +142,6 @@
                     + "'");
         }
 
-        this.currentIncoming = relationship;
         this.currentEntity = (ObjEntity) relationship.getTargetEntity();
     }
 

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/EJBQLJoin.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/EJBQLJoin.java?view=diff&rev=546514&r1=546513&r2=546514
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/EJBQLJoin.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/EJBQLJoin.java Tue Jun 12 07:49:41 2007
@@ -24,7 +24,18 @@
         super(id);
     }
 
-    public String getId() {
+    public String getLeftHandSideId() {
+        int len = getChildrenCount();
+        if (len < 1) {
+            return null;
+        }
+
+        EJBQLPath path = (EJBQLPath) getChild(0);
+        EJBQLIdentifier lhsId = (EJBQLIdentifier) path.getChild(0);
+        return lhsId.getText();
+    }
+
+    public String getRightHandSideId() {
         int len = getChildrenCount();
         if (len < 2) {
             return null;

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLJoinsTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLJoinsTest.java?view=diff&rev=546514&r1=546513&r2=546514
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLJoinsTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLJoinsTest.java Tue Jun 12 07:49:41 2007
@@ -53,10 +53,10 @@
         // while (it.hasNext()) {
         // Artist a = (Artist) it.next();
         // names.add(a.getArtistName());
-        //         }
+        // }
         //        
-        //         assertTrue(names.contains("AA1"));
-        //         assertTrue(names.contains("BB2"));
+        // assertTrue(names.contains("AA1"));
+        // assertTrue(names.contains("BB2"));
     }
 
     public void testInnerJoins() throws Exception {
@@ -74,7 +74,7 @@
     public void testOuterJoins() throws Exception {
         createTestData("testInnerJoins");
 
-         String ejbql = "SELECT a "
+        String ejbql = "SELECT a "
                 + "FROM Artist a LEFT JOIN a.paintingArray p "
                 + "WHERE a.artistName = 'AA1'";
 
@@ -107,46 +107,46 @@
     }
 
     public void testImplicitJoins() throws Exception {
-         createTestData("testChainedJoins");
-         String ejbql = "SELECT a "
-         + "FROM Artist a "
-         + "WHERE a.paintingArray.toGallery.galleryName = 'gallery2'";
-         
-         EJBQLQuery query = new EJBQLQuery(ejbql);
-         
-         System.out.println(""
-                 + query.getExpression(getDomain().getEntityResolver()).getExpression());
-                
-         List artists = createDataContext().performQuery(query);
-         assertEquals(1, artists.size());
-                 assertEquals(33002, DataObjectUtils.intPKForObject((Artist) artists.get(0)));
+        createTestData("testChainedJoins");
+        String ejbql = "SELECT a "
+                + "FROM Artist a "
+                + "WHERE a.paintingArray.toGallery.galleryName = 'gallery2'";
+
+        EJBQLQuery query = new EJBQLQuery(ejbql);
+
+        System.out.println(""
+                + query.getExpression(getDomain().getEntityResolver()).getExpression());
+
+        List artists = createDataContext().performQuery(query);
+        assertEquals(1, artists.size());
+        assertEquals(33002, DataObjectUtils.intPKForObject((Artist) artists.get(0)));
     }
 
     public void testPartialImplicitJoins1() throws Exception {
         createTestData("testChainedJoins");
-         String ejbql = "SELECT a "
-         + "FROM Artist a JOIN a.paintingArray b "
-         + "WHERE a.paintingArray.toGallery.galleryName = 'gallery2'";
-        
-         List artists = createDataContext().performQuery(new EJBQLQuery(ejbql));
-         assertEquals(1, artists.size());
-         assertEquals(33002, DataObjectUtils.intPKForObject((Artist) artists.get(0)));
+        String ejbql = "SELECT a "
+                + "FROM Artist a JOIN a.paintingArray b "
+                + "WHERE a.paintingArray.toGallery.galleryName = 'gallery2'";
+
+        List artists = createDataContext().performQuery(new EJBQLQuery(ejbql));
+        assertEquals(1, artists.size());
+        assertEquals(33002, DataObjectUtils.intPKForObject((Artist) artists.get(0)));
     }
-    
+
     public void testPartialImplicitJoins2() throws Exception {
         createTestData("testChainedJoins");
-         String ejbql = "SELECT a "
-         + "FROM Artist a JOIN a.paintingArray b "
-         + "WHERE a.paintingArray.paintingTitle = 'CC2'";
-        
-         List artists = createDataContext().performQuery(new EJBQLQuery(ejbql));
-         assertEquals(1, artists.size());
-         assertEquals(33002, DataObjectUtils.intPKForObject((Artist) artists.get(0)));
+        String ejbql = "SELECT a "
+                + "FROM Artist a JOIN a.paintingArray b "
+                + "WHERE a.paintingArray.paintingTitle = 'CC2'";
+
+        List artists = createDataContext().performQuery(new EJBQLQuery(ejbql));
+        assertEquals(1, artists.size());
+        assertEquals(33002, DataObjectUtils.intPKForObject((Artist) artists.get(0)));
     }
 
     public void testMultipleJoinsToTheSameTable() throws Exception {
         createTestData("testMultipleJoinsToTheSameTable");
-         String ejbql = "SELECT a "
+        String ejbql = "SELECT a "
                 + "FROM Artist a JOIN a.paintingArray b JOIN a.paintingArray c "
                 + "WHERE b.paintingTitle = 'P1' AND c.paintingTitle = 'P2'";
 

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=546514&r1=546513&r2=546514
==============================================================================
--- 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 Tue Jun 12 07:49:41 2007
@@ -48,6 +48,22 @@
         assertTrue(sql, sql.endsWith(" FROM ARTIST AS t0${marker0}"));
     }
 
+    public void testSelectMultipleJoinsToTheSameTable() throws Exception {
+        SQLTemplate query = translateSelect("SELECT a "
+                + "FROM Artist a JOIN a.paintingArray b JOIN a.paintingArray c "
+                + "WHERE b.paintingTitle = 'P1' AND c.paintingTitle = 'P2'");
+        String sql = query.getDefaultTemplate();
+
+        assertTrue(sql, sql.startsWith("SELECT "));
+        assertTrue(
+                sql,
+                sql.indexOf("INNER JOIN PAINTING AS t1 ON (t0.ARTIST_ID = t1.ARTIST_ID)") > 0);
+        assertTrue(
+                sql,
+                sql.indexOf("INNER JOIN PAINTING AS t2 ON (t0.ARTIST_ID = t2.ARTIST_ID)") > 0);
+
+    }
+
     public void testSelectDistinct() {
         SQLTemplate query = translateSelect("select distinct a from Artist a");
         String sql = query.getDefaultTemplate();