From: Mike Bayer Date: Mon, 12 Dec 2005 01:44:58 +0000 (+0000) Subject: added 'order_by' property to mapper constructor X-Git-Tag: rel_0_1_0~243 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8ed282c3c2eb087f8be662644a703caa7249a227;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git added 'order_by' property to mapper constructor 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 --- diff --git a/lib/sqlalchemy/mapping/mapper.py b/lib/sqlalchemy/mapping/mapper.py index 53c8a5b733..390bfbd48a 100644 --- a/lib/sqlalchemy/mapping/mapper.py +++ b/lib/sqlalchemy/mapping/mapper.py @@ -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 diff --git a/lib/sqlalchemy/mapping/properties.py b/lib/sqlalchemy/mapping/properties.py index 08897f2e61..f8e2b1b1f3 100644 --- a/lib/sqlalchemy/mapping/properties.py +++ b/lib/sqlalchemy/mapping/properties.py @@ -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 = [] diff --git a/test/mapper.py b/test/mapper.py index a63070ee45..2c31b47029 100644 --- a/test/mapper.py +++ b/test/mapper.py @@ -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])