From: Mike Bayer Date: Tue, 18 Mar 2008 00:21:11 +0000 (+0000) Subject: - fixed order_by calculation in Query to properly alias X-Git-Tag: rel_0_4_5~83 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ad4e42567605e31b820766329f460a38603e05d1;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - fixed order_by calculation in Query to properly alias mapper-config'ed order_by when using select_from() --- diff --git a/CHANGES b/CHANGES index b31a9dac24..8cf8e49577 100644 --- 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 diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py index c684cf501b..3812639259 100644 --- a/lib/sqlalchemy/orm/query.py +++ b/lib/sqlalchemy/orm/query.py @@ -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() diff --git a/test/orm/query.py b/test/orm/query.py index e9d99d71b8..3430a395f7 100644 --- a/test/orm/query.py +++ b/test/orm/query.py @@ -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={