diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2008-05-08 00:19:06 +0000 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2008-05-08 00:19:06 +0000 |
| commit | a5290b0d0f34bcfca38f096e4f9a7f852b973c83 (patch) | |
| tree | 8bba2ac9623f80a3481d9d8c8776e08a91728e76 /lib/sqlalchemy/orm | |
| parent | 30f55a50165e56d79dfc5f720616d4d9cc400b33 (diff) | |
| download | sqlalchemy-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.py | 25 |
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 |
