From: Mike Bayer Date: Mon, 4 Jun 2007 15:20:42 +0000 (+0000) Subject: join() will check existing objects in the FROM clause and not re-join to one which... X-Git-Tag: rel_0_4_6~225 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7e4ca785747b15fb8e9eb913e716b42422fc57ea;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git join() will check existing objects in the FROM clause and not re-join to one which is already present --- diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py index a26bf8dcb6..f2e87b7dea 100644 --- a/lib/sqlalchemy/orm/query.py +++ b/lib/sqlalchemy/orm/query.py @@ -535,23 +535,28 @@ class Query(object): else: [keys,p] = self._locate_prop(prop, start=start) clause = self._from_obj[-1] + + currenttables = sql_util.TableFinder(self._from_obj, include_aliases=True) + mapper = start for key in keys: prop = mapper.props[key] if prop._is_self_referential(): raise exceptions.InvalidRequestError("Self-referential query on '%s' property must be constructed manually using an Alias object for the related table." % str(prop)) - if outerjoin: - 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: - 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)) + # dont re-join to a table already in our from objects + if prop.select_table not in currenttables: + if outerjoin: + 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/sql_util.py b/lib/sqlalchemy/sql_util.py index 9f8bf276ec..7a67402318 100644 --- a/lib/sqlalchemy/sql_util.py +++ b/lib/sqlalchemy/sql_util.py @@ -71,7 +71,7 @@ class TableFinder(TableCollection, sql.NoColumnVisitor): TableCollection.__init__(self) self.check_columns = check_columns self.include_aliases = include_aliases - if clause is not None: + for clause in util.to_list(clause): self.traverse(clause) def visit_alias(self, alias):