]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- added "expr" to the column descriptions accessor, this is
authorMike Bayer <mike_mp@zzzcomputing.com>
Thu, 8 Jul 2010 22:17:23 +0000 (18:17 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Thu, 8 Jul 2010 22:17:23 +0000 (18:17 -0400)
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
test/orm/test_query.py

index 0afe622c14dec006ea67a35c1701148c0262f358..28ddc1f13b7d689eec28f397a2ea115e9d71162c 100644 (file)
@@ -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
index 2933d1bc4aaf779fd9ac60a7f99d93b8f69ea32e..ba8112db0c4daac8fb255f1b63ba2131e8df549d 100644 (file)
@@ -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
+                    },
                 ]
             )
         ]: