From 6f05aa06bfde7a9aa1437fa542232bf05ff13df2 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Thu, 25 Apr 2013 13:54:40 -0400 Subject: everything passes with this!!!!!!! holy crap !!!!! and its the simplest of all --- lib/sqlalchemy/orm/util.py | 126 +++++++++++++++++++++++++-------------------- 1 file changed, 69 insertions(+), 57 deletions(-) (limited to 'lib/sqlalchemy/orm/util.py') diff --git a/lib/sqlalchemy/orm/util.py b/lib/sqlalchemy/orm/util.py index dd24d8bf4..9472f8698 100644 --- a/lib/sqlalchemy/orm/util.py +++ b/lib/sqlalchemy/orm/util.py @@ -874,70 +874,82 @@ class _ORMJoin(expression.Join): isouter=False, join_to_left=True): adapt_from = None - if hasattr(left, '_orm_mappers'): - left_mapper = left._orm_mappers[1] - else: - info = inspection.inspect(left) - left_mapper = getattr(info, 'mapper', None) - left_info = inspection.inspect(left) - left_selectable = left_info.selectable - info = inspection.inspect(right) - right_mapper = getattr(info, 'mapper', None) - right = info.selectable - right_is_aliased = getattr(info, 'is_aliased_class', False) + if hasattr(left, '_orm_infos'): + left_orm_info = left._orm_infos[1] + else: + #if isinstance(left, expression.Join): + # info = inspection.inspect(left.right) + #else: + # info = inspection.inspect(left) + left_orm_info = left_info - if right_is_aliased: - adapt_to = right + right_info = inspection.inspect(right) + + if getattr(right_info, 'is_aliased_class', False): + adapt_to = right_info.selectable else: adapt_to = None - if left_mapper or right_mapper: - self._orm_mappers = (left_mapper, right_mapper) - - if isinstance(onclause, basestring): - prop = left_mapper.get_property(onclause) - on_selectable = prop.parent.selectable - elif isinstance(onclause, attributes.QueryableAttribute): - on_selectable = onclause.comparator._source_selectable() - #if adapt_from is None: - # adapt_from = onclause.comparator._source_selectable() - prop = onclause.property - elif isinstance(onclause, MapperProperty): - prop = onclause - on_selectable = prop.parent.selectable +# import pdb +# pdb.set_trace() + self._orm_infos = (left_orm_info, right_info) + + if isinstance(onclause, basestring): + onclause = getattr(left_orm_info.entity, onclause) + + if isinstance(onclause, attributes.QueryableAttribute): + on_selectable = onclause.comparator._source_selectable() + prop = onclause.property + elif isinstance(onclause, MapperProperty): + prop = onclause + on_selectable = prop.parent.selectable + else: + prop = None + + if prop: + #import pdb + #pdb.set_trace() + if sql_util.clause_is_present(on_selectable, left_info.selectable): + adapt_from = on_selectable + else: + adapt_from = left_info.selectable +# import pdb +# pdb.set_trace() + #adapt_from = left_orm_info.selectable + #adapt_from = left_info.selectable +# adapt_from = None +# if adapt_from is None: +# _derived = [] +# for s in expression._from_objects(left_info.selectable): +# if s == on_selectable: +# adapt_from = s +# break +# elif s.is_derived_from(on_selectable): +# _derived.append(s) +# else: +# if _derived: +# adapt_from = _derived[0] + + #if adapt_from is None: +# adapt_from = left_info.selectable + + #adapt_from = None + pj, sj, source, dest, \ + secondary, target_adapter = prop._create_joins( + source_selectable=adapt_from, + dest_selectable=adapt_to, + source_polymorphic=True, + dest_polymorphic=True, + of_type=right_info.mapper) + + if sj is not None: + left = sql.join(left, secondary, pj, isouter) + onclause = sj else: - prop = None - - if prop: - import pdb - pdb.set_trace() - _derived = [] - for s in expression._from_objects(left_selectable): - if s == on_selectable: - adapt_from = s - break - elif s.is_derived_from(on_selectable): - _derived.append(s) - else: - if _derived: - adapt_from = _derived[0] - - pj, sj, source, dest, \ - secondary, target_adapter = prop._create_joins( - source_selectable=adapt_from, - dest_selectable=adapt_to, - source_polymorphic=True, - dest_polymorphic=True, - of_type=right_mapper) - - if sj is not None: - left = sql.join(left, secondary, pj, isouter) - onclause = sj - else: - onclause = pj - self._target_adapter = target_adapter + onclause = pj + self._target_adapter = target_adapter expression.Join.__init__(self, left, right, onclause, isouter) -- cgit v1.2.1