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

Reply via email to