summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/orm/query.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2013-06-02 20:23:03 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2013-06-02 20:23:03 -0400
commit2b0b802b4973e84871d1f266cc2e8aac6c125d17 (patch)
treea58a7b70b5f6da7d76db92f386d50c365f8cc7df /lib/sqlalchemy/orm/query.py
parent35a674aab4a832e76232e7be4b16b7a635a19824 (diff)
downloadsqlalchemy-2b0b802b4973e84871d1f266cc2e8aac6c125d17.tar.gz
working through tests....
Diffstat (limited to 'lib/sqlalchemy/orm/query.py')
-rw-r--r--lib/sqlalchemy/orm/query.py26
1 files changed, 21 insertions, 5 deletions
diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py
index 66d208a74..80fee4a09 100644
--- a/lib/sqlalchemy/orm/query.py
+++ b/lib/sqlalchemy/orm/query.py
@@ -1797,6 +1797,15 @@ class Query(object):
right_entity, onclause,
outerjoin, create_aliases, prop)
+ def _tables_overlap(self, left, right):
+ """Return True if parent/child tables have some overlap."""
+
+ return bool(
+ set(sql_util.find_tables(left)).intersection(
+ sql_util.find_tables(right)
+ )
+ )
+
def _join_left_to_right(self, left, right,
onclause, outerjoin, create_aliases, prop):
"""append a JOIN to the query's from clause."""
@@ -1816,10 +1825,16 @@ class Query(object):
"are the same entity" %
(left, right))
+ # TODO: get the l_info, r_info passed into
+ # the methods so inspect() doesnt need to be called again
+ l_info = inspect(left)
+ r_info = inspect(right)
+ overlap = self._tables_overlap(l_info.selectable, r_info.selectable)
+
right, onclause = self._prepare_right_side(
right, onclause,
create_aliases,
- prop)
+ prop, overlap)
# if joining on a MapperProperty path,
# track the path to prevent redundant joins
@@ -1833,7 +1848,7 @@ class Query(object):
self._join_to_left(left, right, onclause, outerjoin)
- def _prepare_right_side(self, right, onclause, create_aliases, prop):
+ def _prepare_right_side(self, right, onclause, create_aliases, prop, overlap):
info = inspect(right)
right_mapper, right_selectable, right_is_aliased = \
@@ -1875,9 +1890,10 @@ class Query(object):
not right_is_aliased and \
(
right_mapper.with_polymorphic
- #isinstance(
- # right_mapper.mapped_table,
- # expression.Join)
+ or
+ overlap # test for overlap:
+ # orm/inheritance/relationships.py
+ # SelfReferentialM2MTest
)
if not need_adapter and (create_aliases or aliased_entity):