From 5de45b954b11d2261398eeb25cc084615a446d29 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Tue, 8 Jan 2013 10:21:53 -0500 Subject: [PATCH] - add test_loading from 0.8 - adapt 0.8's system of pre-calcing labels from query entities --- lib/sqlalchemy/orm/query.py | 3 +- test/orm/test_loading.py | 91 +++++++++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 test/orm/test_loading.py diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py index 552dfa41b7..1be9777f44 100644 --- a/lib/sqlalchemy/orm/query.py +++ b/lib/sqlalchemy/orm/query.py @@ -2415,6 +2415,7 @@ class Query(object): mapped_entities = [i for i, e in enumerate(self._entities) if isinstance(e, _MapperEntity)] result = [] + keys = [ent._label_name for ent in self._entities] for row in iterator: newrow = list(row) for i in mapped_entities: @@ -2422,7 +2423,7 @@ class Query(object): attributes.instance_state(newrow[i]), attributes.instance_dict(newrow[i]), load=load, _recursive={}) - result.append(util.NamedTuple(newrow, row._labels)) + result.append(util.NamedTuple(newrow, keys)) return iter(result) finally: diff --git a/test/orm/test_loading.py b/test/orm/test_loading.py new file mode 100644 index 0000000000..77afa17a0c --- /dev/null +++ b/test/orm/test_loading.py @@ -0,0 +1,91 @@ +from test.orm import _fixtures +from sqlalchemy.orm import Session, mapper +from test.lib.testing import eq_ +from sqlalchemy.util import NamedTuple + +# 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): + User = cls.classes.User + mapper(User, cls.tables.users) + + 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 = q.merge_result( + 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 = q.merge_result( + 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 = q.merge_result( + 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: NamedTuple(x, ['User', 'id']) + collection = [kt(u1, 1), kt(u2, 2), kt(u3, 7), kt(u4, 8)] + it = q.merge_result( + 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']) -- 2.47.2