From bdebc646625d99641af24e00ba8399671b4e7100 Mon Sep 17 00:00:00 2001 From: Jekel Date: Mon, 3 Sep 2018 20:26:42 +0300 Subject: [PATCH] Tuple loader distinct on all included loaders --- gino/loader.py | 7 +++++-- tests/test_loader.py | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/gino/loader.py b/gino/loader.py index 05e8dbd7..8fe1fd1e 100644 --- a/gino/loader.py +++ b/gino/loader.py @@ -163,8 +163,11 @@ def __init__(self, values): self.loaders = tuple(self.get(value) for value in values) def do_load(self, row, context): - return tuple(loader.do_load(row, context)[0] - for loader in self.loaders), True + loaders_result = [loader.do_load(row, context) for loader + in self.loaders] + distinct = all(distinct for loader, distinct in loaders_result + if loader is not None) + return tuple([loader for loader, _ in loaders_result]), distinct class CallableLoader(Loader): diff --git a/tests/test_loader.py b/tests/test_loader.py index 0a5104d8..f6951120 100644 --- a/tests/test_loader.py +++ b/tests/test_loader.py @@ -230,6 +230,24 @@ async def test_distinct_none(bind): assert not hasattr(u, 'team') +async def test_distinct_tuple_loader(user): + from gino.loader import ColumnLoader + + query = db.select([Company, + Team, + db.literal_column("'test'").label('test_column')], + use_labels=True) \ + .select_from(Company.outerjoin(Team)) + + companies = await query.gino.load(( + Company.distinct(Company.id).load(add_team=Team.distinct(Team.id)), + ColumnLoader(query.c.test_column) + )).all() + assert len(companies) == 1 + assert len(companies[0][0].teams) == 2 + assert companies[0][1] == 'test' + + async def test_tuple_loader_279(user): from gino.loader import TupleLoader query = db.select([User, Team])