You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by fa...@apache.org on 2009/07/10 04:50:54 UTC
svn commit: r792790 - in /openjpa/branches/subquery:
openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/
openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/
openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/
Author: fancy
Date: Fri Jul 10 02:50:53 2009
New Revision: 792790
URL: http://svn.apache.org/viewvc?rev=792790&view=rev
Log:
fix moveJoinsToParent to allow recursively move joins to grandparent
Modified:
openjpa/branches/subquery/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java
openjpa/branches/subquery/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java
openjpa/branches/subquery/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Product.java
openjpa/branches/subquery/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestJPQLSubquery.java
Modified: openjpa/branches/subquery/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java
URL: http://svn.apache.org/viewvc/openjpa/branches/subquery/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java?rev=792790&r1=792789&r2=792790&view=diff
==============================================================================
--- openjpa/branches/subquery/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java (original)
+++ openjpa/branches/subquery/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java Fri Jul 10 02:50:53 2009
@@ -2916,18 +2916,12 @@
public void moveJoinsToParent() {
if (_joins == null)
return;
- if (_sel._parent._joins == null)
- _sel._parent._joins = new SelectJoins(_sel._parent);
- SelectJoins p = _sel._parent._joins;
- if (p.joins() == null)
- p.setJoins(new JoinSet());
-
Join j = null;
List<Join> removed = new ArrayList<Join>(5);
for (Iterator itr = _joins.iterator(); itr.hasNext();) {
j = (Join) itr.next();
if (j.isNotMyJoin()) {
- p.joins().add(j);
+ addJoinsToParent(_sel._parent, j);
removed.add(j);
}
}
@@ -2936,6 +2930,32 @@
}
}
+ private void addJoinsToParent(SelectImpl parent, Join join) {
+ Object aliases[] = parent._aliases.values().toArray();
+ boolean found1 = false;
+ boolean found2 = false;
+
+ for (int i = 0; i < aliases.length; i++) {
+ int alias = ((Integer)aliases[i]).intValue();
+ if (alias == join.getIndex1())
+ found1 = true;
+ if (alias == join.getIndex2())
+ found2 = true;
+ }
+
+ if (found1 && found2) {
+ // this is my join, add join
+ if (parent._joins == null)
+ parent._joins = new SelectJoins(parent);
+ SelectJoins p = parent._joins;
+ if (p.joins() == null)
+ p.setJoins(new JoinSet());
+ p.joins().add(join);
+ }
+ else if (parent._parent != null)
+ addJoinsToParent(parent._parent, join);
+ }
+
public SelectJoins clone(SelectImpl sel) {
SelectJoins sj = new SelectJoins(sel);
sj.var = var;
Modified: openjpa/branches/subquery/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java
URL: http://svn.apache.org/viewvc/openjpa/branches/subquery/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java?rev=792790&r1=792789&r2=792790&view=diff
==============================================================================
--- openjpa/branches/subquery/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java (original)
+++ openjpa/branches/subquery/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java Fri Jul 10 02:50:53 2009
@@ -1430,7 +1430,6 @@
subContext.setSubquery(subq);
}
subq.setMetaData(candidate);
- subq.setAlias(alias);
// evaluate from clause for resolving variables defined in subquery
JPQLNode from = node.getChild(1);
Modified: openjpa/branches/subquery/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Product.java
URL: http://svn.apache.org/viewvc/openjpa/branches/subquery/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Product.java?rev=792790&r1=792789&r2=792790&view=diff
==============================================================================
--- openjpa/branches/subquery/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Product.java (original)
+++ openjpa/branches/subquery/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Product.java Fri Jul 10 02:50:53 2009
@@ -20,6 +20,7 @@
import javax.persistence.*;
@Entity
+@Table(name="CR_PRD")
public class Product {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
Modified: openjpa/branches/subquery/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestJPQLSubquery.java
URL: http://svn.apache.org/viewvc/openjpa/branches/subquery/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestJPQLSubquery.java?rev=792790&r1=792789&r2=792790&view=diff
==============================================================================
--- openjpa/branches/subquery/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestJPQLSubquery.java (original)
+++ openjpa/branches/subquery/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestJPQLSubquery.java Fri Jul 10 02:50:53 2009
@@ -862,7 +862,7 @@
+ " a.product = o And "
+ " exists (select r.id from Request r where r.account = a and r.status = 1))";
- String expectedSQL = "SELECT t1.pid, t1.version, t1.productType FROM Product t1 WHERE (NOT (EXISTS ("
+ String expectedSQL = "SELECT t1.pid, t1.version, t1.productType FROM CR_PRD t1 WHERE (NOT (EXISTS ("
+ "SELECT t0.id FROM CR_ACCT t0 WHERE (t0.PRODUCT_PID = t1.pid AND EXISTS ("
+ "SELECT t2.id FROM Request t2 WHERE (t2.ACCOUNT_ID = t0.id AND t2.status = ?) )) )))";