From 78313a1ae33f6937b9f1ab90270fb8c0b0fb91ff Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Thu, 11 Oct 2012 16:59:02 -0400 Subject: [PATCH] - add coverage for merge_result() [ticket:2588] - pre-determine keys for the keyed tuples --- lib/sqlalchemy/orm/loading.py | 3 +- lib/sqlalchemy/orm/query.py | 4 +- test/orm/test_loading.py | 94 +++++++++++++++++++++++++++++++++++ 3 files changed, 98 insertions(+), 3 deletions(-) create mode 100644 test/orm/test_loading.py diff --git a/lib/sqlalchemy/orm/loading.py b/lib/sqlalchemy/orm/loading.py index ab51e8639f..df1477210f 100644 --- a/lib/sqlalchemy/orm/loading.py +++ b/lib/sqlalchemy/orm/loading.py @@ -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: diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py index 46ee592989..ca38d726cf 100644 --- a/lib/sqlalchemy/orm/query.py +++ b/lib/sqlalchemy/orm/query.py @@ -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 index 0000000000..1d2df2c5b6 --- /dev/null +++ b/test/orm/test_loading.py @@ -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']) -- 2.47.3