From 5f68031d15206373cda072d40a6fed37eaa8db14 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Thu, 8 Jul 2010 18:17:23 -0400 Subject: [PATCH] - added "expr" to the column descriptions accessor, this is an expression that matches on identity the original expression passed to the query. In particular you can pass it into order_by() and similar. --- lib/sqlalchemy/orm/query.py | 14 ++++++++++---- test/orm/test_query.py | 26 ++++++++++++++++---------- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py index 0afe622c14..28ddc1f13b 100644 --- a/lib/sqlalchemy/orm/query.py +++ b/lib/sqlalchemy/orm/query.py @@ -1589,16 +1589,19 @@ class Query(object): 'name':'User', 'type':User, 'aliased':False, + 'expr':User, }, { 'name':'id', 'type':Integer(), - 'aliased':False + 'aliased':False, + 'expr':User.id, }, { 'name':'user2', 'type':User, - 'aliased':True + 'aliased':True, + 'expr':user_alias } ] @@ -1608,6 +1611,7 @@ class Query(object): 'name':ent._label_name, 'type':ent.type, 'aliased':getattr(ent, 'is_aliased_class', False), + 'expr':ent.expr } for ent in self._entities ] @@ -2404,8 +2408,8 @@ class _MapperEntity(_QueryEntity): query._entities.append(self) self.entities = [entity] - self.entity_zero = entity - + self.entity_zero = self.expr = entity + def setup_entity(self, entity, mapper, adapter, from_obj, is_aliased_class, with_polymorphic): self.mapper = mapper @@ -2553,6 +2557,8 @@ class _ColumnEntity(_QueryEntity): """Column/expression based entity.""" def __init__(self, query, column): + self.expr = column + if isinstance(column, basestring): column = sql.literal_column(column) self._label_name = column.name diff --git a/test/orm/test_query.py b/test/orm/test_query.py index 2933d1bc4a..ba8112db0c 100644 --- a/test/orm/test_query.py +++ b/test/orm/test_query.py @@ -80,38 +80,44 @@ class RowTupleTest(QueryTest): user_alias = aliased(User) address_alias = aliased(Address, name='aalias') fn = func.count(User.id) - + name_label = User.name.label('uname') for q, asserted in [ ( sess.query(User), - [{'name':'User', 'type':User, 'aliased':False}] + [{'name':'User', 'type':User, 'aliased':False, 'expr':User}] ), ( sess.query(User.id, User), [ - {'name':'id', 'type':users.c.id.type, 'aliased':False}, - {'name':'User', 'type':User, 'aliased':False} + {'name':'id', 'type':users.c.id.type, 'aliased':False, + 'expr':User.id}, + {'name':'User', 'type':User, 'aliased':False, 'expr':User} ] ), ( sess.query(User.id, user_alias), [ - {'name':'id', 'type':users.c.id.type, 'aliased':False}, - {'name':None, 'type':User, 'aliased':True} + {'name':'id', 'type':users.c.id.type, 'aliased':False, + 'expr':User.id}, + {'name':None, 'type':User, 'aliased':True, + 'expr':user_alias} ] ), ( sess.query(address_alias), [ - {'name':'aalias', 'type':Address, 'aliased':True} + {'name':'aalias', 'type':Address, 'aliased':True, + 'expr':address_alias} ] ), ( - sess.query(User.name.label('uname'), fn), + sess.query(name_label, fn), [ {'name':'uname', 'type':users.c.name.type, - 'aliased':False}, - {'name':None, 'type':fn.type, 'aliased':False}, + 'aliased':False,'expr':name_label}, + {'name':None, 'type':fn.type, 'aliased':False, + 'expr':fn + }, ] ) ]: -- 2.47.2