summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2007-03-14 23:48:07 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2007-03-14 23:48:07 +0000
commita5bf257126f709b6d6cf55ce5b38e209f09d689c (patch)
treedc863f51855d623dcf713d9029c402165f4fc521 /lib/sqlalchemy
parent485fb57fc7fedc423bb4dc6f998e80b14382a42a (diff)
downloadsqlalchemy-a5bf257126f709b6d6cf55ce5b38e209f09d689c.tar.gz
- eager loading will not "aliasize" "order by" clauses that were placed
in the select statement by something other than the eager loader itself, to fix possibility of dupe columns as illustrated in [ticket:495]. however, this means you have to be more careful with the columns placed in the "order by" of Query.select(), that you have explicitly named them in your criterion (i.e. you cant rely on the eager loader adding them in for you) - query._join_to (which powers join, join_via, etc) properly takes secondary table into account when constructing joins
Diffstat (limited to 'lib/sqlalchemy')
-rw-r--r--lib/sqlalchemy/orm/properties.py13
-rw-r--r--lib/sqlalchemy/orm/query.py12
-rw-r--r--lib/sqlalchemy/orm/strategies.py2
3 files changed, 19 insertions, 8 deletions
diff --git a/lib/sqlalchemy/orm/properties.py b/lib/sqlalchemy/orm/properties.py
index c9a2dbe59..dbf58946f 100644
--- a/lib/sqlalchemy/orm/properties.py
+++ b/lib/sqlalchemy/orm/properties.py
@@ -400,9 +400,9 @@ class PropertyLoader(StrategizedProperty):
def _is_self_referential(self):
return self.parent.mapped_table is self.target or self.parent.select_table is self.target
- def get_join(self, parent):
+ def get_join(self, parent, primary=True, secondary=True):
try:
- return self._parent_join_cache[parent]
+ return self._parent_join_cache[(parent, primary, secondary)]
except KeyError:
parent_equivalents = parent._get_inherited_column_equivalents()
primaryjoin = self.polymorphic_primaryjoin.copy_container()
@@ -418,10 +418,15 @@ class PropertyLoader(StrategizedProperty):
sql_util.ClauseAdapter(parent.select_table, exclude=self.foreign_keys, equivalents=parent_equivalents).traverse(primaryjoin)
if secondaryjoin is not None:
- j = primaryjoin & secondaryjoin
+ if secondary and not primary:
+ j = secondaryjoin
+ elif primary and secondary:
+ j = primaryjoin & secondaryjoin
+ elif primary and not secondary:
+ j = primaryjoin
else:
j = primaryjoin
- self._parent_join_cache[parent] = j
+ self._parent_join_cache[(parent, primary, secondary)] = j
return j
def register_dependencies(self, uowcommit):
diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py
index a0b520f33..fa96798fe 100644
--- a/lib/sqlalchemy/orm/query.py
+++ b/lib/sqlalchemy/orm/query.py
@@ -408,9 +408,17 @@ class Query(object):
for key in keys:
prop = mapper.props[key]
if outerjoin:
- clause = clause.outerjoin(prop.select_table, prop.get_join(mapper))
+ if prop.secondary:
+ clause = clause.outerjoin(prop.secondary, prop.get_join(mapper, primary=True, secondary=False))
+ clause = clause.outerjoin(prop.select_table, prop.get_join(mapper, primary=False))
+ else:
+ clause = clause.outerjoin(prop.select_table, prop.get_join(mapper))
else:
- clause = clause.join(prop.select_table, prop.get_join(mapper))
+ if prop.secondary:
+ clause = clause.join(prop.secondary, prop.get_join(mapper, primary=True, secondary=False))
+ clause = clause.join(prop.select_table, prop.get_join(mapper, primary=False))
+ else:
+ clause = clause.join(prop.select_table, prop.get_join(mapper))
mapper = prop.mapper
return (clause, mapper)
diff --git a/lib/sqlalchemy/orm/strategies.py b/lib/sqlalchemy/orm/strategies.py
index e6496a401..ad3c6432e 100644
--- a/lib/sqlalchemy/orm/strategies.py
+++ b/lib/sqlalchemy/orm/strategies.py
@@ -472,8 +472,6 @@ class EagerLoader(AbstractRelationLoader):
if clauses.eager_order_by:
statement.order_by(*util.to_list(clauses.eager_order_by))
- elif getattr(statement, 'order_by_clause', None):
- clauses._aliasize_orderby(statement.order_by_clause, False)
statement.append_from(statement._outerjoin)
for value in self.select_mapper.props.values():