From: Mike Bayer Date: Thu, 28 Sep 2006 05:26:26 +0000 (+0000) Subject: - more adjustments to the eager load table finder to work with existing mappings X-Git-Tag: rel_0_3_0~113 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7a6e6711996cfc08fdb38d766bac464d1a33e5a9;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - more adjustments to the eager load table finder to work with existing mappings against selects and query-created limit/offset subselects - added eagertest3 to orm/alltests.py --- diff --git a/lib/sqlalchemy/orm/properties.py b/lib/sqlalchemy/orm/properties.py index db34a9a2ab..6e9f9daff5 100644 --- a/lib/sqlalchemy/orm/properties.py +++ b/lib/sqlalchemy/orm/properties.py @@ -599,13 +599,22 @@ class EagerLoader(LazyLoader): if hasattr(statement, '_outerjoin'): towrap = statement._outerjoin - else: + elif isinstance(self.localparent.mapped_table, schema.Table): + # if the mapper is against a plain Table, look in the from_obj of the select statement + # to join against whats already there. for (fromclause, finder) in [(x, sql_util.TableFinder(x)) for x in statement.froms]: - if self.localparent.mapped_table in finder: + # dont join against an Alias'ed Select. we are really looking either for the + # table itself or a Join that contains the table. this logic still might need + # adjustments for scenarios not thought of yet. + if not isinstance(fromclause, sql.Alias) and self.localparent.mapped_table in finder: towrap = fromclause break else: - raise exceptions.InvalidRequestError("EagerLoader cannot locate a clause with which to outer join to, in query '%s'" % str(statement)) + raise exceptions.InvalidRequestError("EagerLoader cannot locate a clause with which to outer join to, in query '%s' %s" % (str(statement), self.localparent.mapped_table)) + else: + # if the mapper is against a select statement or something, we cant handle that at the + # same time as a custom FROM clause right now. + towrap = self.localparent.mapped_table if self.secondaryjoin is not None: statement._outerjoin = sql.outerjoin(towrap, self.eagersecondary, self.eagerprimary).outerjoin(self.eagertarget, self.eagersecondaryjoin) diff --git a/test/orm/alltests.py b/test/orm/alltests.py index 814b2d760b..7fcac805ab 100644 --- a/test/orm/alltests.py +++ b/test/orm/alltests.py @@ -7,6 +7,7 @@ def suite(): 'orm.lazytest1', 'orm.eagertest1', 'orm.eagertest2', + 'orm.eagertest3', 'orm.sessioncontext', 'orm.unitofwork',