]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
added 'order_by' property to mapper constructor
authorMike Bayer <mike_mp@zzzcomputing.com>
Mon, 12 Dec 2005 01:44:58 +0000 (01:44 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Mon, 12 Dec 2005 01:44:58 +0000 (01:44 +0000)
added 'no_sort' property to mapper _compile method to disable all ordering
mapper _compile will not use its internal order_by if the given statement has an orderby
lazyloader order_by used standalone when loading via mapper

lib/sqlalchemy/mapping/mapper.py
lib/sqlalchemy/mapping/properties.py
test/mapper.py

index 53c8a5b7337876bb1f3126f5eb4af341b083d9d3..390bfbd48aa00d0d44d147f40aef2cd275940243 100644 (file)
@@ -40,6 +40,7 @@ class Mapper(object):
                 inherits = None, 
                 inherit_condition = None, 
                 extension = None,
+                order_by = False,
                 **kwargs):
 
         self.copyargs = {
@@ -51,7 +52,8 @@ class Mapper(object):
             'is_primary':False,
             'inherits':inherits,
             'inherit_condition':inherit_condition,
-            'extension':extension
+            'extension':extension,
+            'order_by':order_by
         }
         
         if extension is None:
@@ -61,6 +63,7 @@ class Mapper(object):
         self.hashkey = hashkey
         self.class_ = class_
         self.is_primary = is_primary
+        self.order_by = order_by
         
         if not issubclass(class_, object):
             raise "Class '%s' is not a new-style class" % class_.__name__
@@ -455,6 +458,15 @@ class Mapper(object):
         )
         
     def _compile(self, whereclause = None, **kwargs):
+        no_sort = kwargs.pop('no_sort', False) or (self.order_by is None)
+        if not no_sort:
+            if self.order_by:
+                order_by = self.order_by
+            else:
+                order_by = self.table.rowid_column
+        else:
+            order_by = None
+            
         if self._should_nest(**kwargs):
             s2 = sql.select(self.table.primary_key, whereclause, use_labels=True, **kwargs)
             if not kwargs.get('distinct', False):
@@ -466,11 +478,12 @@ class Mapper(object):
             statement = sql.select([self.table], sql.and_(*crit), use_labels=True)
             if kwargs.has_key('order_by'):
                 statement.order_by(*kwargs['order_by'])
-            statement.order_by(self.table.rowid_column)
+            else:
+                statement.order_by(order_by)
         else:
             statement = sql.select([self.table], whereclause, use_labels=True, **kwargs)
-            if not kwargs.get('distinct', False):
-                statement.order_by(self.table.rowid_column)
+            if not kwargs.get('distinct', False) and order_by is not None and kwargs.get('order_by', None) is None:
+                statement.order_by(order_by)
         # plugin point
         
         # give all the attached properties a chance to modify the query
index 08897f2e61b1bb059aca0e20bc1d23eafffd947e..f8e2b1b1f30234750086f2f5c88e5da68f3d7f56 100644 (file)
@@ -502,7 +502,7 @@ class LazyLoader(PropertyLoader):
                 elif self.secondary is not None:
                     order_by = [self.secondary.rowid_column]
                 else:
-                    order_by = []
+                    order_by = None
                 result = self.mapper.select(self.lazywhere, order_by=order_by, params=params)
             else:
                 result = []
index a63070ee45847e7d492d8518a0f48195e6139dbc..2c31b4702942a0fb98c4cf5504a20e24bc94c424 100644 (file)
@@ -91,6 +91,15 @@ class MapperTest(MapperSuperTest):
         l = m.select(users.c.user_name.endswith('ed'))
         self.assert_result(l, User, *user_result[1:3])
 
+    def testorderby(self):
+        # TODO: make a unit test out of these various combinations
+#        m = mapper(User, users, order_by=desc(users.c.user_name))
+#        m = mapper(User, users, order_by=None)
+        m = mapper(User, users)
+        
+#        l = m.select(order_by=[desc(users.c.user_name), asc(users.c.user_id)])
+        l = m.select()
+        
     def testmultitable(self):
         usersaddresses = sql.join(users, addresses, users.c.user_id == addresses.c.user_id)
         m = mapper(User, usersaddresses, primarytable = users, primary_key=[users.c.user_id])