From 87cda86f340050aa580f06cfc7c42c4a79723cf1 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Tue, 24 Oct 2006 14:08:11 +0000 Subject: [PATCH] - eager query generation adjustment, [ticket:355] --- CHANGES | 3 ++ lib/sqlalchemy/orm/strategies.py | 6 ++-- test/orm/eagertest3.py | 53 ++++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index 3cd19c9d18..89113b22a4 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +0.3.1 +- adjustments to reworked eager query generation + 0.3.0 - General: - logging is now implemented via standard python "logging" module. diff --git a/lib/sqlalchemy/orm/strategies.py b/lib/sqlalchemy/orm/strategies.py index ab1d23f9c9..6391f2ee8e 100644 --- a/lib/sqlalchemy/orm/strategies.py +++ b/lib/sqlalchemy/orm/strategies.py @@ -400,11 +400,11 @@ class EagerLoader(AbstractRelationLoader): else: localparent = parentmapper - if self in context.recursion_stack: + if self.mapper in context.recursion_stack: return else: - context.recursion_stack.add(self) - + context.recursion_stack.add(self.parent) + statement = context.statement if hasattr(statement, '_outerjoin'): diff --git a/test/orm/eagertest3.py b/test/orm/eagertest3.py index 4cb56d5d12..10f8fce0a3 100644 --- a/test/orm/eagertest3.py +++ b/test/orm/eagertest3.py @@ -145,6 +145,59 @@ class EagerTest(AssertMixin): print result assert result == [u'3 Some Category'] +class EagerTest2(AssertMixin): + def setUpAll(self): + global metadata, middle, left, right + metadata = BoundMetaData(testbase.db) + middle = Table('middle', metadata, + Column('id', Integer, primary_key = True), + Column('data', String(50)), + ) + + left = Table('left', metadata, + Column('id', Integer, ForeignKey(middle.c.id), primary_key=True), + Column('tag', String(50), primary_key=True), + ) + + right = Table('right', metadata, + Column('id', Integer, ForeignKey(middle.c.id), primary_key=True), + Column('tag', String(50), primary_key=True), + ) + metadata.create_all() + def tearDownAll(self): + metadata.drop_all() + def tearDown(self): + for t in metadata.table_iterator(reverse=True): + t.delete().execute() + def testeagerterminate(self): + """test that eager query generation does not include the same mapper's table twice. + + or, that bi-directional eager loads dont include each other in eager query generation.""" + class Middle(object): + def __init__(self, data): self.data = data + class Left(object): + def __init__(self, data): self.tag = data + class Right(object): + def __init__(self, data): self.tag = data + + # set up bi-directional eager loads + mapper(Left, left) + mapper(Right, right) + mapper(Middle, middle, properties = { + 'left': relation(Left, lazy=False, backref=backref('middle',lazy=False)), + 'right': relation(Right, lazy=False, backref=backref('middle', lazy=False)), + } + ) + session = create_session(bind_to=testbase.db) + p = Middle('test1') + p.left.append(Left('tag1')) + p.right.append(Right('tag2')) + session.save(p) + session.flush() + session.clear() + obj = session.query(Left).get_by(tag='tag1') + print obj.middle.right[0] + if __name__ == "__main__": testbase.main() -- 2.47.2