From ede23e028a848f13b88416ce8addb305154e7c48 Mon Sep 17 00:00:00 2001 From: Nirmal Chidambaram Date: Sun, 19 Jan 2020 12:05:13 -0600 Subject: [PATCH 1/3] Short circuited to MatchNone for non-participating slice In case of numSlices = numShards , use a MatchNone query instead of boolean with a MatchNone - MUST clause --- .../search/DefaultSearchContext.java | 8 +++++++- .../search/DefaultSearchContextTests.java | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/server/src/main/java/org/elasticsearch/search/DefaultSearchContext.java b/server/src/main/java/org/elasticsearch/search/DefaultSearchContext.java index c7f0f885d793b..c188af907d0a6 100644 --- a/server/src/main/java/org/elasticsearch/search/DefaultSearchContext.java +++ b/server/src/main/java/org/elasticsearch/search/DefaultSearchContext.java @@ -23,6 +23,7 @@ import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.Collector; import org.apache.lucene.search.FieldDoc; +import org.apache.lucene.search.MatchNoDocsQuery; import org.apache.lucene.search.Query; import org.elasticsearch.action.search.SearchShardTask; import org.elasticsearch.action.search.SearchType; @@ -274,7 +275,12 @@ && new NestedHelper(mapperService()).mightMatchNestedDocs(query) } if (sliceBuilder != null) { - filters.add(sliceBuilder.toFilter(clusterService, request, queryShardContext)); + Query slicedQuery = sliceBuilder.toFilter(clusterService, request, queryShardContext); + if ( slicedQuery instanceof MatchNoDocsQuery){ + return slicedQuery; + }else { + filters.add(slicedQuery); + } } if (filters.isEmpty()) { diff --git a/server/src/test/java/org/elasticsearch/search/DefaultSearchContextTests.java b/server/src/test/java/org/elasticsearch/search/DefaultSearchContextTests.java index 5dd4d1c24bd8f..7494b5ce7222f 100644 --- a/server/src/test/java/org/elasticsearch/search/DefaultSearchContextTests.java +++ b/server/src/test/java/org/elasticsearch/search/DefaultSearchContextTests.java @@ -22,6 +22,8 @@ import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.RandomIndexWriter; import org.apache.lucene.search.IndexSearcher; +import org.apache.lucene.search.MatchNoDocsQuery; +import org.apache.lucene.search.Query; import org.apache.lucene.search.QueryCachingPolicy; import org.apache.lucene.search.Sort; import org.apache.lucene.store.Directory; @@ -39,6 +41,7 @@ import org.elasticsearch.index.cache.IndexCache; import org.elasticsearch.index.cache.query.QueryCache; import org.elasticsearch.index.engine.Engine; +import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.MapperService; import org.elasticsearch.index.query.AbstractQueryBuilder; import org.elasticsearch.index.query.ParsedQuery; @@ -57,6 +60,7 @@ import java.util.UUID; import static org.hamcrest.Matchers.equalTo; +import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyObject; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; @@ -178,6 +182,20 @@ public void testPreProcess() throws Exception { ParsedQuery parsedQuery = ParsedQuery.parsedMatchAllQuery(); context3.sliceBuilder(null).parsedQuery(parsedQuery).preProcess(false); assertEquals(context3.query(), context3.buildFilteredQuery(parsedQuery.query())); + + when(queryShardContext.getIndexSettings()).thenReturn(indexSettings); + when(indexService.newQueryShardContext(anyInt(),anyObject(),anyObject(),anyString())).thenReturn(queryShardContext); + when(queryShardContext.fieldMapper(anyString())).thenReturn(mock(MappedFieldType.class)); + when(shardSearchRequest.indexRoutings()).thenReturn(new String[0]); + + DefaultSearchContext context4 = new DefaultSearchContext(3L, shardSearchRequest, target, searcher, null, + indexService, indexShard, bigArrays, null, timeout, null); + context4.sliceBuilder(new SliceBuilder(1,2)).parsedQuery(parsedQuery).preProcess(false); + Query query1 = context4.query(); + context4.sliceBuilder(new SliceBuilder(0,2)).parsedQuery(parsedQuery).preProcess(false); + Query query2 = context4.query(); + assertTrue(query1 instanceof MatchNoDocsQuery || query2 instanceof MatchNoDocsQuery); + } } } From d3c838cc6dda37cb3828bb9d7b36ecc48eb87eb8 Mon Sep 17 00:00:00 2001 From: Nirmal Chidambaram Date: Tue, 21 Jan 2020 08:09:19 -0600 Subject: [PATCH 2/3] code review changes --- .../java/org/elasticsearch/search/DefaultSearchContext.java | 4 ++-- .../org/elasticsearch/search/DefaultSearchContextTests.java | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/search/DefaultSearchContext.java b/server/src/main/java/org/elasticsearch/search/DefaultSearchContext.java index c188af907d0a6..5ea5ed3f23e35 100644 --- a/server/src/main/java/org/elasticsearch/search/DefaultSearchContext.java +++ b/server/src/main/java/org/elasticsearch/search/DefaultSearchContext.java @@ -276,9 +276,9 @@ && new NestedHelper(mapperService()).mightMatchNestedDocs(query) if (sliceBuilder != null) { Query slicedQuery = sliceBuilder.toFilter(clusterService, request, queryShardContext); - if ( slicedQuery instanceof MatchNoDocsQuery){ + if (slicedQuery instanceof MatchNoDocsQuery) { return slicedQuery; - }else { + } else { filters.add(slicedQuery); } } diff --git a/server/src/test/java/org/elasticsearch/search/DefaultSearchContextTests.java b/server/src/test/java/org/elasticsearch/search/DefaultSearchContextTests.java index 7494b5ce7222f..bcb4a4e7d2bde 100644 --- a/server/src/test/java/org/elasticsearch/search/DefaultSearchContextTests.java +++ b/server/src/test/java/org/elasticsearch/search/DefaultSearchContextTests.java @@ -184,11 +184,10 @@ public void testPreProcess() throws Exception { assertEquals(context3.query(), context3.buildFilteredQuery(parsedQuery.query())); when(queryShardContext.getIndexSettings()).thenReturn(indexSettings); - when(indexService.newQueryShardContext(anyInt(),anyObject(),anyObject(),anyString())).thenReturn(queryShardContext); when(queryShardContext.fieldMapper(anyString())).thenReturn(mock(MappedFieldType.class)); when(shardSearchRequest.indexRoutings()).thenReturn(new String[0]); - DefaultSearchContext context4 = new DefaultSearchContext(3L, shardSearchRequest, target, searcher, null, + DefaultSearchContext context4 = new DefaultSearchContext(4L, shardSearchRequest, target, searcher, null, indexService, indexShard, bigArrays, null, timeout, null); context4.sliceBuilder(new SliceBuilder(1,2)).parsedQuery(parsedQuery).preProcess(false); Query query1 = context4.query(); From 9f0ce3d9d012b8f699da46cc5a5ea502935ba6c0 Mon Sep 17 00:00:00 2001 From: Nirmal Chidambaram Date: Tue, 21 Jan 2020 09:23:47 -0600 Subject: [PATCH 3/3] Removed unused namespace --- .../java/org/elasticsearch/search/DefaultSearchContextTests.java | 1 - 1 file changed, 1 deletion(-) diff --git a/server/src/test/java/org/elasticsearch/search/DefaultSearchContextTests.java b/server/src/test/java/org/elasticsearch/search/DefaultSearchContextTests.java index bcb4a4e7d2bde..560f052664604 100644 --- a/server/src/test/java/org/elasticsearch/search/DefaultSearchContextTests.java +++ b/server/src/test/java/org/elasticsearch/search/DefaultSearchContextTests.java @@ -60,7 +60,6 @@ import java.util.UUID; import static org.hamcrest.Matchers.equalTo; -import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyObject; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq;