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 00:09:53 UTC
svn commit: r790748 - 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/jpql/
openjpa-persistenc...
Author: faywang
Date: Thu Jul 2 22:09:52 2009
New Revision: 790748
URL: http://svn.apache.org/viewvc?rev=790748&view=rev
Log:
fix exists/not exists problem
Modified:
openjpa/branches/subquery/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/JDBCExpressionFactory.java
openjpa/branches/subquery/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/SubQ.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/jpql/JPQLExpressionBuilder.java
openjpa/branches/subquery/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestSubquery.java
Modified: openjpa/branches/subquery/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/JDBCExpressionFactory.java
URL: http://svn.apache.org/viewvc/openjpa/branches/subquery/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/JDBCExpressionFactory.java?rev=790748&r1=790747&r2=790748&view=diff
==============================================================================
--- openjpa/branches/subquery/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/JDBCExpressionFactory.java (original)
+++ openjpa/branches/subquery/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/JDBCExpressionFactory.java Thu Jul 2 22:09:52 2009
@@ -166,8 +166,9 @@
return new OrExpression((Exp) exp1, (Exp) exp2);
}
- public Expression not(Expression exp) {
- if (HasContainsExpressionVisitor.hasContains(exp))
+ public Expression not(Expression exp) {// fyw
+ if (!(exp instanceof IsNotEmptyExpression) &&
+ HasContainsExpressionVisitor.hasContains(exp))
return new NotContainsExpression((Exp) exp);
return new NotExpression((Exp) exp);
}
Modified: openjpa/branches/subquery/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/SubQ.java
URL: http://svn.apache.org/viewvc/openjpa/branches/subquery/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/SubQ.java?rev=790748&r1=790747&r2=790748&view=diff
==============================================================================
--- openjpa/branches/subquery/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/SubQ.java (original)
+++ openjpa/branches/subquery/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/SubQ.java Thu Jul 2 22:09:52 2009
@@ -45,7 +45,7 @@
private final ClassMapping _candidate;
private final boolean _subs;
- private final String _alias;
+ private final String _subqAlias;
private final SelectConstructor _cons = new SelectConstructor();
private Class _type = null;
@@ -60,7 +60,7 @@
public SubQ(ClassMapping candidate, boolean subs, String alias) {
_candidate = candidate;
_subs = subs;
- _alias = alias;
+ _subqAlias = alias;
_select = (((JDBCConfiguration) candidate.getMappingRepository().
getConfiguration()).getSQLFactoryInstance().newSelect());
_cons.setSubselect(_select);
@@ -102,7 +102,7 @@
}
public String getCandidateAlias() {
- return _alias;
+ return _subqAlias;
}
public void setQueryExpressions(QueryExpressions query) {
@@ -192,7 +192,7 @@
private void appendTo(Select sel, ExpContext ctx, ExpState state,
SQLBuffer sql, int index, boolean size) {
QueryExpressionsState substate = new QueryExpressionsState();
- Select sub = _cons.evaluate(ctx, sel, _alias, _exps, substate);
+ Select sub = _cons.evaluate(ctx, sel, _subqAlias, _exps, substate);
_cons.select(sub, ctx, _candidate, _subs, _exps, substate,
JDBCFetchConfiguration.EAGER_NONE);
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=790748&r1=790747&r2=790748&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 Thu Jul 2 22:09:52 2009
@@ -2023,22 +2023,9 @@
boolean create) {
Integer i = null;
SelectImpl sel = this;
-
- //currCtx is set from Action, it is reset to null after the PCPath initialization
- Context currCtx = pj == null ? null : ((PathJoinsImpl)pj).context;
-
- // lastCtx is set to currCtx after the SelectJoins.join. pj.lastCtx and pj.path string are
- // the last snapshot of pj. They will be used together for later table alias resolution in
- // the getColumnAlias().
- Context lastCtx = pj == null ? null : ((PathJoinsImpl)pj).lastContext;
- Context thisCtx = currCtx == null ? lastCtx : currCtx;
- String corrVar = pj == null ? null : pj.getCorrelatedVariable();
-
String alias = _schemaAlias;
- if ((pj != null && pj.path() != null && (corrVar == null || ctx() == thisCtx)) ||
- table.isAssociation()) {
+ if (isPathInThisContext(pj) || table.isAssociation())
alias = null;
- }
// find the context where this alias is defined
Context ctx = (alias != null) ?
@@ -2062,6 +2049,20 @@
return i;
}
+ private boolean isPathInThisContext(PathJoins pj) {
+ // currCtx is set from Action, it is reset to null after the PCPath initialization
+ Context currCtx = pj == null ? null : ((PathJoinsImpl)pj).context;
+
+ // lastCtx is set to currCtx after the SelectJoins.join. pj.lastCtx and pj.path string are
+ // the last snapshot of pj. They will be used together for later table alias resolution in
+ // the getColumnAlias().
+ Context lastCtx = pj == null ? null : ((PathJoinsImpl)pj).lastContext;
+ Context thisCtx = currCtx == null ? lastCtx : currCtx;
+ String corrVar = pj == null ? null : pj.getCorrelatedVariable();
+
+ return (pj != null && pj.path() != null &&
+ (corrVar == null || (thisCtx != null && ctx() == thisCtx)));
+ }
private Integer getAlias(Table table, Object key) {
Integer alias = null;
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=790748&r1=790747&r2=790748&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 Thu Jul 2 22:09:52 2009
@@ -601,11 +601,12 @@
setCandidate(candidate, alias);
- Subquery subquery =
- factory.newSubquery(candidate, true, alias);
-
Context subContext = ctx();
- subContext.setSubquery(subquery);
+ Subquery subquery = ctx().getSubquery();
+ if (subquery == null){
+ subquery = factory.newSubquery(candidate, true, alias);
+ subContext.setSubquery(subquery);
+ }
Path subpath = factory.newPath(subquery);
subpath.setMetaData(candidate);
subquery.setMetaData(candidate);
@@ -635,14 +636,6 @@
// OPENJPA-15 support subquery's from clause do not start with
// identification_variable_declaration()
if (inner && ctx().getParent() != null && ctx().schemaAlias == null) {
-// ClassMetaData candidate = getFieldType(path.last());
-// setCandidate(candidate, alias.text);
-//
-// ctx().subquery = factory.newSubquery(candidate, true, alias.text);
-// Path subpath = factory.newPath(ctx().subquery);
-// subpath.setMetaData(candidate);
-// exp = bindVariableForSubPath(path, alias.text, exp);
-// exp = and(exp, factory.equal(path, subpath));
return getSubquery(alias.text, path, exp);
}
@@ -704,18 +697,6 @@
// clause, since we might be in a subquery against a collection
if (isPath(left)) {
Path path = getPath(left);
-// FieldMetaData fmd = path.last();
-// ClassMetaData candidate = getFieldType(fmd);
-//
-// if (candidate == null && fmd.isElementCollection())
-// candidate = fmd.getDefiningMetaData();
-//
-// setCandidate(candidate, alias);
-// exp = bindVariableForSubPath(path, alias, exp);
-//
-// Path subpath = factory.newPath(ctx().subquery);
-// subpath.setMetaData(ctx().subquery.getMetaData());
-// return and(exp, factory.equal(path, subpath));
return getSubquery(alias, path, exp);
} else {
// we have an alias: bind it as a variable
Modified: openjpa/branches/subquery/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestSubquery.java
URL: http://svn.apache.org/viewvc/openjpa/branches/subquery/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestSubquery.java?rev=790748&r1=790747&r2=790748&view=diff
==============================================================================
--- openjpa/branches/subquery/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestSubquery.java (original)
+++ openjpa/branches/subquery/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestSubquery.java Thu Jul 2 22:09:52 2009
@@ -94,9 +94,8 @@
" (select count(o) from Order o)",
"select o from Order o where o.amount > " +
"(select count(o2) from Order o2)",
- // outstanding problem subqueries:
- // "select c from Customer c left join c.orders o where not exists"
- // + " (select o2 from c.orders o2 where o2 = o)",
+ "select c from Customer c left join c.orders o where not exists"
+ + " (select o2 from c.orders o2 where o2 = o)",
};
static String[] querys_jpa20 = new String[] {