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/03 17:53:57 UTC

svn commit: r790951 - in /openjpa/branches/subquery: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/ openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/ openjpa-persistenc...

Author: faywang
Date: Fri Jul  3 15:53:56 2009
New Revision: 790951

URL: http://svn.apache.org/viewvc?rev=790951&view=rev
Log:
fix cross join and subquery

Modified:
    openjpa/branches/subquery/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/PCPath.java
    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/exps/Context.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/kernel/exps/PCPath.java
URL: http://svn.apache.org/viewvc/openjpa/branches/subquery/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/PCPath.java?rev=790951&r1=790950&r2=790951&view=diff
==============================================================================
--- openjpa/branches/subquery/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/PCPath.java (original)
+++ openjpa/branches/subquery/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/PCPath.java Fri Jul  3 15:53:56 2009
@@ -106,6 +106,7 @@
             _type = UNBOUND_VAR;
             action.op = Action.UNBOUND_VAR;
             action.data = var;
+            _schemaAlias = var.getName();
         } else {
             // bound variable; copy path
             _type = UNACCESSED_VAR;
@@ -511,7 +512,16 @@
                 if (rel == null)
                 	throw new IllegalArgumentException(_loc.get(
                 	    "invalid-unbound-var", var.getName()).toString());
-                pstate.joins = pstate.joins.setVariable(var.getName());
+                	    
+                if (sel.getParent() != null && action.var != null &&
+                    sel.ctx().getVariable(action.var) == null) {
+                    System.out.println("action var="+action.var);
+                    isCorrelatedPath = true;
+                    pstate.joins = pstate.joins.setCorrelatedVariable(var.getName());
+                } else 
+                
+                    pstate.joins = pstate.joins.setVariable(var.getName());
+
                 pstate.joins = pstate.joins.crossJoin(_candidate.getTable(),
                     rel.getTable());
             } else {

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=790951&r1=790950&r2=790951&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  3 15:53:56 2009
@@ -2781,9 +2781,14 @@
             // until we get past the local table
             String var = this.var;
             this.var = null;
+            Context ctx = context; 
+            context = null; 
 
             int alias1 = _sel.getTableIndex(localTable, this, true);
             this.append(var);
+            this.append(correlatedVar);
+            context = ctx; 
+            
             int alias2 = _sel.getTableIndex(foreignTable, this, true);
             Join j = new Join(localTable, alias1, foreignTable, alias2,
                 null, false);
@@ -2792,7 +2797,10 @@
             if (_joins == null)
                 _joins = new JoinSet();
             _joins.add(j);
+            setCorrelated(j);
             _outer = false;
+            lastContext =  context;
+            context = null;
             return this;
         }
 

Modified: openjpa/branches/subquery/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/Context.java
URL: http://svn.apache.org/viewvc/openjpa/branches/subquery/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/Context.java?rev=790951&r1=790950&r2=790951&view=diff
==============================================================================
--- openjpa/branches/subquery/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/Context.java (original)
+++ openjpa/branches/subquery/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/Context.java Fri Jul  3 15:53:56 2009
@@ -143,7 +143,9 @@
     }
 
     public ClassMetaData getSchema(String id) {
-        return schemas.get(id.toLowerCase());
+        if (id != null)
+            return schemas.get(id.toLowerCase());
+        return null;
     }
 
     /**

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=790951&r1=790950&r2=790951&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  3 15:53:56 2009
@@ -585,17 +585,15 @@
         execute(jpql, expectedSQL);
     }
 
-    // a correated JPQL generates non correlated SQL
     public void testSubquery13() {
         String jpql = "select o1.id, c.name from Order o1, Customer c"
             + " where o1.quantity = "
             + " any(select o2.quantity from in(c.orders) o2)";
 
-        String expectedSQL = "SELECT t0.id, t1.name "
-            + "FROM CR_ODR t0 JOIN CR_CUST t1 ON (1 = 1) WHERE (t0.quantity = ANY ("
-            + "SELECT t4.quantity "
-            + "FROM CR_ODR t0 JOIN CR_CUST t2 ON (1 = 1) "
-            + "INNER JOIN CR_ODR t3 ON t2.id = t3.CUSTOMER_ID, CR_ODR t4 WHERE (t3.id = t4.id) ))";
+        String expectedSQL = "SELECT t0.id, t1.name " + 
+        "FROM CR_ODR t0 JOIN CR_CUST t1 ON (1 = 1) WHERE (t0.quantity = ANY (" + 
+        "SELECT t3.quantity FROM  CR_ODR t2, CR_ODR t3 WHERE (t2.id = t3.id) AND (t1.id = t2.CUSTOMER_ID) ))"; 
+
         execute(jpql, expectedSQL);
     }