summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sqlalchemy')
-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