]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- add coverage for merge_result() [ticket:2588]
authorMike Bayer <mike_mp@zzzcomputing.com>
Thu, 11 Oct 2012 20:59:02 +0000 (16:59 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Thu, 11 Oct 2012 20:59:02 +0000 (16:59 -0400)
- pre-determine keys for the keyed tuples

lib/sqlalchemy/orm/loading.py
lib/sqlalchemy/orm/query.py
test/orm/test_loading.py [new file with mode: 0644]

index ab51e8639f245ebbb472621e4c702d009362a70d..df1477210f6aafabce291fe6b810dc2fa12c7916 100644 (file)
@@ -123,6 +123,7 @@ def merge_result(query, iterator, load=True):
             mapped_entities = [i for i, e in enumerate(query._entities)
                                     if isinstance(e, querylib._MapperEntity)]
             result = []
+            keys = [ent._label_name for ent in query._entities]
             for row in iterator:
                 newrow = list(row)
                 for i in mapped_entities:
@@ -130,7 +131,7 @@ def merge_result(query, iterator, load=True):
                             attributes.instance_state(newrow[i]),
                             attributes.instance_dict(newrow[i]),
                             load=load, _recursive={})
-                result.append(util.NamedTuple(newrow, row._labels))
+                result.append(util.KeyedTuple(newrow, keys))
 
         return iter(result)
     finally:
index 46ee592989818772abc0ef6f3c78bb55600051ba..ca38d726cffc61f4f39f39bb0f082c1991e2b328 100644 (file)
@@ -1816,12 +1816,12 @@ class Query(object):
         # track the path to prevent redundant joins
         if not create_aliases and prop:
             self._update_joinpoint({
-                '_joinpoint_entity':right,
+                '_joinpoint_entity': right,
                 'prev':((left, right, prop.key), self._joinpoint)
             })
         else:
             self._joinpoint = {
-                '_joinpoint_entity':right
+                '_joinpoint_entity': right
             }
 
         self._join_to_left(left, right,
diff --git a/test/orm/test_loading.py b/test/orm/test_loading.py
new file mode 100644 (file)
index 0000000..1d2df2c
--- /dev/null
@@ -0,0 +1,94 @@
+from . import _fixtures
+from sqlalchemy.orm import loading, Session
+from sqlalchemy.testing.assertions import eq_
+from sqlalchemy.util import KeyedTuple
+
+# class InstancesTest(_fixtures.FixtureTest):
+# class GetFromIdentityTest(_fixtures.FixtureTest):
+# class LoadOnIdentTest(_fixtures.FixtureTest):
+# class InstanceProcessorTest(_fixture.FixtureTest):
+
+class MergeResultTest(_fixtures.FixtureTest):
+    run_setup_mappers = 'once'
+    run_inserts = 'once'
+    run_deletes = None
+
+    @classmethod
+    def setup_mappers(cls):
+        cls._setup_stock_mapping()
+
+    def _fixture(self):
+        User = self.classes.User
+
+        s = Session()
+        u1, u2, u3, u4 = User(id=1, name='u1'), User(id=2, name='u2'), \
+                            User(id=7, name='u3'), User(id=8, name='u4')
+        s.query(User).filter(User.id.in_([7, 8])).all()
+        s.close()
+        return s, [u1, u2, u3, u4]
+
+    def test_single_entity(self):
+        s, (u1, u2, u3, u4) = self._fixture()
+        User = self.classes.User
+
+        q = s.query(User)
+        collection = [u1, u2, u3, u4]
+        it = loading.merge_result(
+            q,
+            collection
+        )
+        eq_(
+            [x.id for x in it],
+            [1, 2, 7, 8]
+        )
+
+    def test_single_column(self):
+        User = self.classes.User
+
+        s = Session()
+
+        q = s.query(User.id)
+        collection = [(1, ), (2, ), (7, ), (8, )]
+        it = loading.merge_result(
+            q,
+            collection
+        )
+        eq_(
+            list(it),
+            [(1, ), (2, ), (7, ), (8, )]
+        )
+
+    def test_entity_col_mix_plain_tuple(self):
+        s, (u1, u2, u3, u4) = self._fixture()
+        User = self.classes.User
+
+        q = s.query(User, User.id)
+        collection = [(u1, 1), (u2, 2), (u3, 7), (u4, 8)]
+        it = loading.merge_result(
+            q,
+            collection
+        )
+        it = list(it)
+        eq_(
+            [(x.id, y) for x, y in it],
+            [(1, 1), (2, 2), (7, 7), (8, 8)]
+        )
+        eq_(it[0].keys(), ['User', 'id'])
+
+    def test_entity_col_mix_keyed_tuple(self):
+        s, (u1, u2, u3, u4) = self._fixture()
+        User = self.classes.User
+
+        q = s.query(User, User.id)
+        kt = lambda *x: KeyedTuple(x, ['User', 'id'])
+        collection = [kt(u1, 1), kt(u2, 2), kt(u3, 7), kt(u4, 8)]
+        it = loading.merge_result(
+            q,
+            collection
+        )
+        it = list(it)
+        eq_(
+            [(x.id, y) for x, y in it],
+            [(1, 1), (2, 2), (7, 7), (8, 8)]
+        )
+        eq_(it[0].keys(), ['User', 'id'])