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 = ?) )) )))";