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