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