You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by pc...@apache.org on 2007/06/22 19:08:29 UTC
svn commit: r549882 -
/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java
Author: pcl
Date: Fri Jun 22 10:08:28 2007
New Revision: 549882
URL: http://svn.apache.org/viewvc?view=rev&rev=549882
Log:
OPENJPA-51. Committing Catalina's patch. It passes against Derby in my environment as well.
Modified:
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java?view=diff&rev=549882&r1=549881&r2=549882
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java Fri Jun 22 10:08:28 2007
@@ -26,6 +26,7 @@
import java.sql.Types;
import java.util.AbstractList;
import java.util.ArrayList;
+import java.util.BitSet;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
@@ -158,6 +159,13 @@
// from select if this select selects from a tmp table created by another
private SelectImpl _from = null;
private SelectImpl _outer = null;
+
+ // bitSet indicating if an alias is removed from parent select
+ // bit 0 : correspond to alias 0
+ // bit 1 : correspond to alias 1, etc.
+ // if the bit is set, the corresponding alias has been removed from parent
+ // and recorded under subselect.
+ private BitSet _removedAliasFromParent = new BitSet(16);
/**
* Helper method to return the proper table alias for the given alias index.
@@ -1488,8 +1496,13 @@
private void removeParentJoins(PathJoins pj) {
if (_parent == null)
return;
- if (_parent._joins != null && !_parent._joins.isEmpty())
- pj.joins().removeAll(_parent._joins.joins());
+ if (_parent._joins != null && !_parent._joins.isEmpty()) {
+ boolean removed = false;
+ if (!_removedAliasFromParent.isEmpty())
+ removed = _parent._joins.joins().removeAll(pj.joins());
+ if (!removed)
+ pj.joins().removeAll(_parent._joins.joins());
+ }
if (!pj.isEmpty())
_parent.removeParentJoins(pj);
}
@@ -1898,9 +1911,15 @@
}
}
if (!fromParent && _parent != null) {
- alias = _parent.findAlias(table, key, false, this);
- if (alias != null)
+ boolean removeAliasFromParent = key.toString().contains(":");
+ alias = _parent.findAlias(table, key, removeAliasFromParent, this);
+ if (alias != null) {
+ if (removeAliasFromParent) {
+ recordTableAlias(table, key, alias);
+ _removedAliasFromParent.set(alias.intValue());
+ }
return alias;
+ }
}
if (_subsels != null) {
SelectImpl sub;
@@ -1914,9 +1933,11 @@
if (sub._tables != null)
sub._tables.remove(alias);
} else {
- alias = sub.findAlias(table, key, true, null);
- if (!fromParent && alias != null)
- recordTableAlias(table, key, alias);
+ if (key instanceof String) {
+ alias = sub.findAlias(table, key, true, null);
+ if (!fromParent && alias != null)
+ recordTableAlias(table, key, alias);
+ }
}
}
}