summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2010-11-05 01:02:48 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2010-11-05 01:02:48 -0400
commit30bc42403754110df1fdec3037c7700cc4f26b70 (patch)
tree4ecb7e23c4d019003253cdd15be1115f23af21bc /lib/sqlalchemy
parent855dbda8258ef62444286924431a5a8171b91e89 (diff)
downloadsqlalchemy-30bc42403754110df1fdec3037c7700cc4f26b70.tar.gz
- "innerjoin" flag doesn't take effect along the chain
of joinedload() joins if a previous join in that chain is an outer join, thus allowing primary rows without a referenced child row to be correctly returned in results. [ticket:1954]
Diffstat (limited to 'lib/sqlalchemy')
-rw-r--r--lib/sqlalchemy/orm/strategies.py21
1 files changed, 14 insertions, 7 deletions
diff --git a/lib/sqlalchemy/orm/strategies.py b/lib/sqlalchemy/orm/strategies.py
index 60454eabc..27ad3d902 100644
--- a/lib/sqlalchemy/orm/strategies.py
+++ b/lib/sqlalchemy/orm/strategies.py
@@ -938,6 +938,7 @@ class EagerLoader(AbstractRelationshipLoader):
def setup_query(self, context, entity, path, adapter, \
column_collection=None, parentmapper=None,
+ allow_innerjoin=True,
**kwargs):
"""Add a left outer join to the statement thats being constructed."""
@@ -988,10 +989,18 @@ class EagerLoader(AbstractRelationshipLoader):
if self.parent_property.direction != interfaces.MANYTOONE:
context.multi_row_eager_loaders = True
+ innerjoin = allow_innerjoin and context.attributes.get(
+ ("eager_join_type", path),
+ self.parent_property.innerjoin)
+ if not innerjoin:
+ # if this is an outer join, all eager joins from
+ # here must also be outer joins
+ allow_innerjoin = False
+
context.create_eager_joins.append(
(self._create_eager_join, context,
entity, path, adapter,
- parentmapper, clauses)
+ parentmapper, clauses, innerjoin)
)
add_to_collection = context.secondary_columns
@@ -1006,10 +1015,12 @@ class EagerLoader(AbstractRelationshipLoader):
path + (self.mapper,),
clauses,
parentmapper=self.mapper,
- column_collection=add_to_collection)
+ column_collection=add_to_collection,
+ allow_innerjoin=allow_innerjoin)
def _create_eager_join(self, context, entity,
- path, adapter, parentmapper, clauses):
+ path, adapter, parentmapper,
+ clauses, innerjoin):
if parentmapper is None:
localparent = entity.mapper
@@ -1064,10 +1075,6 @@ class EagerLoader(AbstractRelationshipLoader):
else:
onclause = self.parent_property
- innerjoin = context.attributes.get(
- ("eager_join_type", path),
- self.parent_property.innerjoin)
-
context.eager_joins[entity_key] = eagerjoin = \
mapperutil.join(
towrap,