summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/orm
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2008-05-08 00:19:06 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2008-05-08 00:19:06 +0000
commita5290b0d0f34bcfca38f096e4f9a7f852b973c83 (patch)
tree8bba2ac9623f80a3481d9d8c8776e08a91728e76 /lib/sqlalchemy/orm
parent30f55a50165e56d79dfc5f720616d4d9cc400b33 (diff)
downloadsqlalchemy-a5290b0d0f34bcfca38f096e4f9a7f852b973c83.tar.gz
- backported 0.5's contains_eager() behavior such that rendering of eager clauses are disabled. workaround here is compatible with 0.5 but not compatible with the little-known "decorator" argument to contains_eager() (which was also removed in 0.5). Doesn't remove any existing 0.4 functionality.
Diffstat (limited to 'lib/sqlalchemy/orm')
-rw-r--r--lib/sqlalchemy/orm/strategies.py25
1 files changed, 23 insertions, 2 deletions
diff --git a/lib/sqlalchemy/orm/strategies.py b/lib/sqlalchemy/orm/strategies.py
index e758ac08b..65a8b019b 100644
--- a/lib/sqlalchemy/orm/strategies.py
+++ b/lib/sqlalchemy/orm/strategies.py
@@ -502,6 +502,28 @@ class EagerLoader(AbstractRelationLoader):
if self.mapper.base_mapper in path:
return
+ if ("eager_row_processor", path) in context.attributes:
+ # if user defined eager_row_processor, that's contains_eager().
+ # don't render LEFT OUTER JOIN, generate an AliasedClauses from
+ # the decorator (this is a hack here, cleaned up in 0.5)
+ cl = context.attributes[("eager_row_processor", path)]
+ if cl:
+ row = cl(None)
+ class ActsLikeAliasedClauses(object):
+ def aliased_column(self, col):
+ return row.map[col]
+ clauses = ActsLikeAliasedClauses()
+ else:
+ clauses = None
+ else:
+ clauses = self.__create_eager_join(context, path, parentclauses, parentmapper, **kwargs)
+ if not clauses:
+ return
+
+ for value in self.mapper._iterate_polymorphic_properties():
+ context.exec_with_path(self.mapper, value.key, value.setup, context, parentclauses=clauses, parentmapper=self.mapper)
+
+ def __create_eager_join(self, context, path, parentclauses, parentmapper, **kwargs):
if parentmapper is None:
localparent = context.mapper
else:
@@ -546,8 +568,7 @@ class EagerLoader(AbstractRelationLoader):
if clauses.order_by:
context.eager_order_by += util.to_list(clauses.order_by)
- for value in self.mapper._iterate_polymorphic_properties():
- context.exec_with_path(self.mapper, value.key, value.setup, context, parentclauses=clauses, parentmapper=self.mapper)
+ return clauses
def _create_row_decorator(self, selectcontext, row, path):
"""Create a *row decorating* function that will apply eager