]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- eager query generation adjustment, [ticket:355]
authorMike Bayer <mike_mp@zzzcomputing.com>
Tue, 24 Oct 2006 14:08:11 +0000 (14:08 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Tue, 24 Oct 2006 14:08:11 +0000 (14:08 +0000)
CHANGES
lib/sqlalchemy/orm/strategies.py
test/orm/eagertest3.py

diff --git a/CHANGES b/CHANGES
index 3cd19c9d18c2a95c6dfcc4ae192017d0370a66cd..89113b22a4d33957da107f148e6d511794a210c3 100644 (file)
--- 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.
index ab1d23f9c9d13cee45f6ac581451915e3d9b8e69..6391f2ee8e4176b48bb995bd96199134598a7ccf 100644 (file)
@@ -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'):
index 4cb56d5d128b7f78e36ae71e0038841414ba7df6..10f8fce0a3dc6a5e93ef4073a43e7b403428cc99 100644 (file)
@@ -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()