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();