A question:
+ // 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 int _removedAliasFromParent = 0;
Why not use a BitSet? They're not that much more inefficient (esp considering that these are pathways that only occur when going to the database), and they don't have an upper bound of 32 like you'll see with an int. Also, where's the test case for this change? -Patrick On 5/2/07, [EMAIL PROTECTED] <[EMAIL PROTECTED]> wrote:
Author: wisneskid Date: Wed May 2 14:35:55 2007 New Revision: 534623 URL: http://svn.apache.org/viewvc?view=rev&rev=534623 Log: Fix for issue OPENJPA-51. It should also resolve issue OPENJPA-173. Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java?view=diff&rev=534623&r1=534622&r2=534623 ============================================================================== --- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java (original) +++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java Wed May 2 14:35:55 2007 @@ -158,6 +158,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 int _removedAliasFromParent = 0; /** * Helper method to return the proper table alias for the given alias index. @@ -1487,8 +1494,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 > 0) + removed = _parent._joins.joins().removeAll(pj.joins()); + if (!removed) + pj.joins().removeAll(_parent._joins.joins()); + } if (!pj.isEmpty()) _parent.removeParentJoins(pj); } @@ -1897,9 +1909,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 |= (1 << alias.intValue()); + } return alias; + } } if (_subsels != null) { SelectImpl sub; @@ -1913,9 +1931,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 (fromSub == null) { + alias = sub.findAlias(table, key, true, null); + if (!fromParent && alias != null) + recordTableAlias(table, key, alias); + } } } }
-- Patrick Linskey 202 669 5907