]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- fixed order_by calculation in Query to properly alias
authorMike Bayer <mike_mp@zzzcomputing.com>
Tue, 18 Mar 2008 00:21:11 +0000 (00:21 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Tue, 18 Mar 2008 00:21:11 +0000 (00:21 +0000)
mapper-config'ed order_by when using select_from()

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

diff --git a/CHANGES b/CHANGES
index b31a9dac24624351af4686f3b98c5f9d64fd8920..8cf8e495773528ebc40b8fbc9c1c7e9064031cf4 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -24,6 +24,9 @@ CHANGES
       had only been implemented for foreign-key nulling behavior
       in 0.4.2 and not actual cascading deletes [ticket:895]
 
+    - fixed order_by calculation in Query to properly alias
+      mapper-config'ed order_by when using select_from()
+
 - sql
     - 'name' is no longer a required constructor argument for
       Column().  It (and .key) may now be deferred until the column
index c684cf501b3a0c4de4157b7a3125bf49a6a52b57..3812639259c0e1600b785fffce8e9c492ed6be46 100644 (file)
@@ -1128,12 +1128,10 @@ class Query(object):
         if order_by is False:
             order_by = self.select_mapper.order_by
         if order_by is False:
-            order_by = []
-            if self.table.default_order_by() is not None:
+            order_by = from_obj.default_order_by()
+            if order_by is None:
                 order_by = self.table.default_order_by()
-            if from_obj.default_order_by() is not None:
-                order_by = from_obj.default_order_by()
-
+                
         if self._lockmode:
             try:
                 for_update = {'read':'read','update':True,'update_nowait':'nowait',None:False}[self._lockmode]
@@ -1211,15 +1209,16 @@ class Query(object):
 
             statement.append_order_by(*context.eager_order_by)
         else:
+            order_by = [expression._literal_as_text(o) for o in util.to_list(order_by) or []]
+            
             if adapter:
                 # TODO: make usage of the ClauseAdapter here to create row adapter, list
                 # of primary columns ?
                 context.primary_columns = [from_obj.corresponding_column(c) or c for c in context.primary_columns]
                 context.row_adapter = mapperutil.create_row_adapter(from_obj, self.table)
-
+                order_by = adapter.copy_and_process(order_by)
+                
             if self._distinct:
-                if order_by:
-                    order_by = [expression._literal_as_text(o) for o in util.to_list(order_by) or []]
 
                 if self._distinct and order_by:
                     cf = util.Set()
index e9d99d71b877a5fb216f7ba15142641d45c2d14d..3430a395f7638c42f6e2963d0fedb138829d1607 100644 (file)
@@ -1026,6 +1026,30 @@ class SelectFromTest(QueryTest):
             User(name='jack', addresses=[Address(id=1)])
         )
 
+    def test_join_mapper_order_by(self):
+        mapper(User, users, order_by=users.c.id)
+
+        sel = users.select(users.c.id.in_([7, 8]))
+        sess = create_session()
+
+        self.assertEquals(sess.query(User).select_from(sel).all(),
+            [
+                User(name='jack',id=7), User(name='ed',id=8)
+            ]
+        )
+
+    def test_join_no_order_by(self):
+        mapper(User, users)
+
+        sel = users.select(users.c.id.in_([7, 8]))
+        sess = create_session()
+
+        self.assertEquals(sess.query(User).select_from(sel).all(),
+            [
+                User(name='jack',id=7), User(name='ed',id=8)
+            ]
+        )
+
     def test_join(self):
         mapper(User, users, properties = {
             'addresses':relation(Address)
@@ -1052,6 +1076,7 @@ class SelectFromTest(QueryTest):
                 (User(name='ed',id=8), Address(user_id=8,email_address='ed@lala.com',id=4))
             ]
         )
+        
     
     def test_more_joins(self):
         mapper(User, users, properties={