]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- dynamic_loader() / lazy="dynamic" now accepts and uses
authorMike Bayer <mike_mp@zzzcomputing.com>
Sun, 9 Mar 2008 22:51:55 +0000 (22:51 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sun, 9 Mar 2008 22:51:55 +0000 (22:51 +0000)
the order_by parameter in the same way in which it works
with relation().

CHANGES
lib/sqlalchemy/orm/__init__.py
lib/sqlalchemy/orm/dynamic.py
lib/sqlalchemy/orm/strategies.py
test/orm/dynamic.py

diff --git a/CHANGES b/CHANGES
index b176db4ac927c9584e41546ada935210f39d2fb8..32355b56eeee3f695f9c837f30f76f4efa7afb52 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -226,7 +226,11 @@ CHANGES
 
     - The proper error message is raised when trying to access
       expired instance attributes with no session present
-
+    
+    - dynamic_loader() / lazy="dynamic" now accepts and uses
+      the order_by parameter in the same way in which it works
+      with relation().
+      
     - Added expire_all() method to Session.  Calls expire() for
       all persistent instances.  This is handy in conjunction
       with...
index eb92988ff7820fa2ccf462b945d8c294ad7b0f97..46c81952f870908945b46142bc445c04c6b09474 100644 (file)
@@ -274,7 +274,7 @@ def relation(argument, secondary=None, **kwargs):
 
 def dynamic_loader(argument, secondary=None, primaryjoin=None, secondaryjoin=None, entity_name=None,
     foreign_keys=None, backref=None, post_update=False, cascade=None, remote_side=None, enable_typechecks=True,
-    passive_deletes=False):
+    passive_deletes=False, order_by=None):
     """construct a dynamically-loading mapper property.
 
     This property is similar to relation(), except read operations
@@ -292,7 +292,7 @@ def dynamic_loader(argument, secondary=None, primaryjoin=None, secondaryjoin=Non
     return PropertyLoader(argument, secondary=secondary, primaryjoin=primaryjoin,
             secondaryjoin=secondaryjoin, entity_name=entity_name, foreign_keys=foreign_keys, backref=backref,
             post_update=post_update, cascade=cascade, remote_side=remote_side, enable_typechecks=enable_typechecks,
-            passive_deletes=passive_deletes,
+            passive_deletes=passive_deletes, order_by=order_by,
             strategy_class=DynaLoader)
 
 #def _relation_loader(mapper, secondary=None, primaryjoin=None, secondaryjoin=None, lazy=True, **kwargs):
index 98702ecb04dd05346e1ca2f0bf5b3dd963206668..0d72beddb6356339470c62fe84f5c054fbec6863 100644 (file)
@@ -7,9 +7,10 @@ from sqlalchemy.orm.query import Query
 from sqlalchemy.orm.mapper import has_identity, object_mapper
 
 class DynamicAttributeImpl(attributes.AttributeImpl):
-    def __init__(self, class_, key, typecallable, target_mapper, **kwargs):
+    def __init__(self, class_, key, typecallable, target_mapper, order_by, **kwargs):
         super(DynamicAttributeImpl, self).__init__(class_, key, typecallable, **kwargs)
         self.target_mapper = target_mapper
+        self.order_by=order_by
 
     def get(self, state, passive=False):
         if passive:
@@ -130,7 +131,10 @@ class AppenderQuery(Query):
                 except exceptions.InvalidRequestError:
                     raise exceptions.UnboundExecutionError("Parent instance %s is not bound to a Session, and no contextual session is established; lazy load operation of attribute '%s' cannot proceed" % (mapperutil.instance_str(instance), self.attr.key))
 
-        return sess.query(self.attr.target_mapper).with_parent(instance, self.attr.key)
+        q = sess.query(self.attr.target_mapper).with_parent(instance, self.attr.key)
+        if self.attr.order_by:
+            q = q.order_by(self.attr.order_by)
+        return q
 
     def assign(self, collection):
         instance = self.instance
index 81a5895f4985b7a1ca67a088b42b39345fb76807..a7ab3d00561e7f31f65265c2040bbd0a449e3853 100644 (file)
@@ -240,7 +240,7 @@ class AbstractRelationLoader(LoaderStrategy):
 class DynaLoader(AbstractRelationLoader):
     def init_class_attribute(self):
         self.is_class_level = True
-        self._register_attribute(self.parent.class_, dynamic=True, target_mapper=self.parent_property.mapper)
+        self._register_attribute(self.parent.class_, dynamic=True, target_mapper=self.parent_property.mapper, order_by=self.parent_property.order_by)
 
     def create_row_processor(self, selectcontext, mapper, row):
         return (None, None, None)
index c85d841073510b928712130bbaa6f0033cccddf3..ae8ef4e5ea3fffcc880a7296ee1559db2e2ab9d3 100644 (file)
@@ -31,6 +31,14 @@ class DynamicTest(FixtureTest):
         sess = create_session()
         u = sess.query(User).get(8)
         self.assertEquals(list(u.addresses.order_by(desc(Address.email_address))), [Address(email_address=u'ed@wood.com'), Address(email_address=u'ed@lala.com'), Address(email_address=u'ed@bettyboop.com')])
+
+    def test_configured_order_by(self):
+        mapper(User, users, properties={
+            'addresses':dynamic_loader(mapper(Address, addresses), order_by=desc(Address.email_address))
+        })
+        sess = create_session()
+        u = sess.query(User).get(8)
+        self.assertEquals(list(u.addresses), [Address(email_address=u'ed@wood.com'), Address(email_address=u'ed@lala.com'), Address(email_address=u'ed@bettyboop.com')])
         
     def test_count(self):
         mapper(User, users, properties={