]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- Fixed bug when using multiple query.join() with an aliased-bound
authorMike Bayer <mike_mp@zzzcomputing.com>
Mon, 3 Nov 2008 03:37:44 +0000 (03:37 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Mon, 3 Nov 2008 03:37:44 +0000 (03:37 +0000)
descriptor which would lose the left alias.

CHANGES
lib/sqlalchemy/orm/query.py
lib/sqlalchemy/orm/util.py
test/orm/query.py

diff --git a/CHANGES b/CHANGES
index f463ea55e3286feefde76d9829169d019433812d..b10dbc5c85979949207d7dd759a59ab83d48f13b 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -24,6 +24,9 @@ CHANGES
       when using declarative), which later would be inappropriately 
       aliased by Query, particularly with the various EXISTS
       based comparators.
+    
+    - Fixed bug when using multiple query.join() with an aliased-bound
+      descriptor which would lose the left alias.
       
     - Improved weakref identity map memory management to no longer
       require mutexing, resurrects garbage collected instance on a
index b358f431141881f7d0cef4364008bfe77ecf97c8..cad35972d34eabd05ac53c4b06b07aa4dcd2e0c3 100644 (file)
@@ -886,12 +886,14 @@ class Query(object):
                 if isinstance(onclause, sql.ClauseElement):
                     onclause = right_adapter.traverse(onclause)
 
-            if prop:
-                # MapperProperty based onclause
-                onclause = prop
-            else:
-                # ClauseElement based onclause
-                onclause = self._adapt_clause(onclause, False, True)
+            # TODO: is this a little hacky ?
+            if not isinstance(onclause, attributes.QueryableAttribute) or not isinstance(onclause.parententity, AliasedClass):
+                if prop:
+                    # MapperProperty based onclause
+                    onclause = prop
+                else:
+                    # ClauseElement based onclause
+                    onclause = self._adapt_clause(onclause, False, True)
                 
             clause = orm_join(clause, right_entity, onclause, isouter=outerjoin)
             if alias_criterion:
index fbc1acd5d17a535b3332f92dcd08a59d05b4d90d..689df8d867cfd592f2c307c3c0812ec32255b012 100644 (file)
@@ -349,7 +349,7 @@ class _ORMJoin(expression.Join):
                 adapt_from = left
             else:
                 adapt_from = None
-
+        
         right_mapper, right, right_is_aliased = _entity_info(right)
         if right_is_aliased:
             adapt_to = right
index ab20754df7eb840301401219e9701092a9dbceaa..76c926807e064c40fdda309d2c8cd78d98ac809c 100644 (file)
@@ -929,7 +929,17 @@ class JoinTest(QueryTest):
             sess.query(User).join([('orders', orderalias), ('items', itemalias)]).filter(orderalias.user_id==9).filter(itemalias.description=='item 4').all(),
             []
         )
-
+    
+    def test_multiple_with_aliases(self):
+        sess = create_session()
+        
+        ualias = aliased(User)
+        oalias1 = aliased(Order)
+        oalias2 = aliased(Order)
+        result = sess.query(ualias).join((oalias1, ualias.orders), (oalias2, ualias.orders)).\
+                filter(or_(oalias1.user_id==9, oalias2.user_id==7)).all()
+        self.assertEquals(result, [User(id=7,name=u'jack'), User(id=9,name=u'fred')])
+        
     def test_orderby_arg_bug(self):
         sess = create_session()
         # no arg error
@@ -1377,7 +1387,7 @@ class InstancesTest(QueryTest, AssertsCompiledSQL):
         ialias = aliased(Item)
         def go():
             l = q.options(contains_eager(User.orders, alias=oalias), contains_eager(User.orders, Order.items, alias=ialias)).\
-                outerjoin((oalias, User.orders), (ialias, Order.items)).order_by(User.id, oalias.id, ialias.id)
+                outerjoin((oalias, User.orders), (ialias, oalias.items)).order_by(User.id, oalias.id, ialias.id)
             assert fixtures.user_order_result == l.all()
         self.assert_sql_count(testing.db, go, 1)
         sess.clear()