From a457176e8435d3bbf4395881dfdd815794e81b47 Mon Sep 17 00:00:00 2001 From: Matt Westcott Date: Fri, 10 Nov 2017 19:49:11 +0000 Subject: [PATCH] Iterate over the full resultset of execute_sql(result_type=MULTI) when filtering by __in with a subquery This ensures that it will work equivalently for lists (as returned when connection.features.can_use_chunked_reads is False) as for iterators, and means we don't need to worry about missing results if we ever receive a chunked resultset. --- wagtail/wagtailsearch/backends/elasticsearch.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/wagtail/wagtailsearch/backends/elasticsearch.py b/wagtail/wagtailsearch/backends/elasticsearch.py index 5938e4af4..8499d4971 100644 --- a/wagtail/wagtailsearch/backends/elasticsearch.py +++ b/wagtail/wagtailsearch/backends/elasticsearch.py @@ -280,10 +280,8 @@ class ElasticsearchSearchQuery(BaseSearchQuery): if lookup == 'in': if isinstance(value, Query): db_alias = self.queryset._db or DEFAULT_DB_ALIAS - value = next(value.get_compiler(db_alias) - .execute_sql(result_type=MULTI)) - - value = [r[0] for r in value] + resultset = value.get_compiler(db_alias).execute_sql(result_type=MULTI) + value = [row[0] for chunk in resultset for row in chunk] elif not isinstance(value, list): value = list(value)