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