|
@@ -30,19 +30,38 @@ import org.apache.lucene.search.Query;
|
|
|
import org.apache.lucene.store.Directory;
|
|
|
import org.apache.lucene.store.RAMDirectory;
|
|
|
import org.elasticsearch.Version;
|
|
|
+import org.elasticsearch.action.IndicesRequest;
|
|
|
+import org.elasticsearch.action.search.SearchShardIterator;
|
|
|
+import org.elasticsearch.action.search.SearchType;
|
|
|
+import org.elasticsearch.action.support.IndicesOptions;
|
|
|
+import org.elasticsearch.cluster.ClusterState;
|
|
|
import org.elasticsearch.cluster.metadata.IndexMetaData;
|
|
|
+import org.elasticsearch.cluster.metadata.MetaData;
|
|
|
+import org.elasticsearch.cluster.routing.GroupShardsIterator;
|
|
|
+import org.elasticsearch.cluster.routing.OperationRouting;
|
|
|
+import org.elasticsearch.cluster.routing.ShardIterator;
|
|
|
+import org.elasticsearch.cluster.service.ClusterService;
|
|
|
import org.elasticsearch.common.Nullable;
|
|
|
+import org.elasticsearch.common.Strings;
|
|
|
+import org.elasticsearch.common.bytes.BytesReference;
|
|
|
import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
|
|
|
import org.elasticsearch.common.settings.Settings;
|
|
|
import org.elasticsearch.common.xcontent.XContentBuilder;
|
|
|
import org.elasticsearch.common.xcontent.XContentFactory;
|
|
|
import org.elasticsearch.common.xcontent.XContentParser;
|
|
|
import org.elasticsearch.common.xcontent.XContentType;
|
|
|
+import org.elasticsearch.index.Index;
|
|
|
import org.elasticsearch.index.IndexSettings;
|
|
|
import org.elasticsearch.index.fielddata.IndexNumericFieldData;
|
|
|
import org.elasticsearch.index.mapper.IdFieldMapper;
|
|
|
import org.elasticsearch.index.mapper.MappedFieldType;
|
|
|
import org.elasticsearch.index.query.QueryShardContext;
|
|
|
+import org.elasticsearch.index.query.Rewriteable;
|
|
|
+import org.elasticsearch.index.shard.ShardId;
|
|
|
+import org.elasticsearch.search.Scroll;
|
|
|
+import org.elasticsearch.search.builder.SearchSourceBuilder;
|
|
|
+import org.elasticsearch.search.internal.AliasFilter;
|
|
|
+import org.elasticsearch.search.internal.ShardSearchRequest;
|
|
|
import org.elasticsearch.test.ESTestCase;
|
|
|
|
|
|
import java.io.IOException;
|
|
@@ -58,13 +77,138 @@ import static org.elasticsearch.test.EqualsHashCodeTestUtils.checkEqualsAndHashC
|
|
|
import static org.hamcrest.Matchers.containsString;
|
|
|
import static org.hamcrest.Matchers.equalTo;
|
|
|
import static org.hamcrest.Matchers.instanceOf;
|
|
|
+import static org.mockito.Matchers.any;
|
|
|
import static org.mockito.Mockito.mock;
|
|
|
import static org.mockito.Mockito.when;
|
|
|
|
|
|
public class SliceBuilderTests extends ESTestCase {
|
|
|
private static final int MAX_SLICE = 20;
|
|
|
|
|
|
- private static SliceBuilder randomSliceBuilder() throws IOException {
|
|
|
+ static class ShardSearchRequestTest implements IndicesRequest, ShardSearchRequest {
|
|
|
+ private final String[] indices;
|
|
|
+ private final int shardId;
|
|
|
+ private final String[] indexRoutings;
|
|
|
+ private final String preference;
|
|
|
+
|
|
|
+ ShardSearchRequestTest(String index, int shardId, String[] indexRoutings, String preference) {
|
|
|
+ this.indices = new String[] { index };
|
|
|
+ this.shardId = shardId;
|
|
|
+ this.indexRoutings = indexRoutings;
|
|
|
+ this.preference = preference;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String[] indices() {
|
|
|
+ return indices;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IndicesOptions indicesOptions() {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ShardId shardId() {
|
|
|
+ return new ShardId(new Index(indices[0], indices[0]), shardId);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String[] types() {
|
|
|
+ return new String[0];
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public SearchSourceBuilder source() {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public AliasFilter getAliasFilter() {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void setAliasFilter(AliasFilter filter) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void source(SearchSourceBuilder source) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public int numberOfShards() {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public SearchType searchType() {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public float indexBoost() {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public long nowInMillis() {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Boolean requestCache() {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Boolean allowPartialSearchResults() {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Scroll scroll() {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String[] indexRoutings() {
|
|
|
+ return indexRoutings;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String preference() {
|
|
|
+ return preference;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void setProfile(boolean profile) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean isProfile() {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public BytesReference cacheKey() throws IOException {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String getClusterAlias() {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Rewriteable<Rewriteable> getRewriteable() {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private static SliceBuilder randomSliceBuilder() {
|
|
|
int max = randomIntBetween(2, MAX_SLICE);
|
|
|
int id = randomIntBetween(1, max - 1);
|
|
|
String field = randomAlphaOfLengthBetween(5, 20);
|
|
@@ -75,7 +219,7 @@ public class SliceBuilderTests extends ESTestCase {
|
|
|
return copyWriteable(original, new NamedWriteableRegistry(Collections.emptyList()), SliceBuilder::new);
|
|
|
}
|
|
|
|
|
|
- private static SliceBuilder mutate(SliceBuilder original) throws IOException {
|
|
|
+ private static SliceBuilder mutate(SliceBuilder original) {
|
|
|
switch (randomIntBetween(0, 2)) {
|
|
|
case 0: return new SliceBuilder(original.getField() + "_xyz", original.getId(), original.getMax());
|
|
|
case 1: return new SliceBuilder(original.getField(), original.getId() - 1, original.getMax());
|
|
@@ -84,6 +228,63 @@ public class SliceBuilderTests extends ESTestCase {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ private IndexSettings createIndexSettings(Version indexVersionCreated, int numShards) {
|
|
|
+ Settings settings = Settings.builder()
|
|
|
+ .put(IndexMetaData.SETTING_VERSION_CREATED, indexVersionCreated)
|
|
|
+ .put(IndexMetaData.SETTING_NUMBER_OF_SHARDS, numShards)
|
|
|
+ .put(IndexMetaData.SETTING_NUMBER_OF_REPLICAS, 0)
|
|
|
+ .build();
|
|
|
+ IndexMetaData indexState = IndexMetaData.builder("index").settings(settings).build();
|
|
|
+ return new IndexSettings(indexState, Settings.EMPTY);
|
|
|
+ }
|
|
|
+
|
|
|
+ private ShardSearchRequest createRequest(int shardId) {
|
|
|
+ return createRequest(shardId, Strings.EMPTY_ARRAY, null);
|
|
|
+ }
|
|
|
+
|
|
|
+ private ShardSearchRequest createRequest(int shardId, String[] routings, String preference) {
|
|
|
+ return new ShardSearchRequestTest("index", shardId, routings, preference);
|
|
|
+ }
|
|
|
+
|
|
|
+ private QueryShardContext createShardContext(Version indexVersionCreated, IndexReader reader,
|
|
|
+ String fieldName, DocValuesType dvType, int numShards, int shardId) {
|
|
|
+ MappedFieldType fieldType = new MappedFieldType() {
|
|
|
+ @Override
|
|
|
+ public MappedFieldType clone() {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String typeName() {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Query termQuery(Object value, @Nullable QueryShardContext context) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ public Query existsQuery(QueryShardContext context) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ };
|
|
|
+ fieldType.setName(fieldName);
|
|
|
+ QueryShardContext context = mock(QueryShardContext.class);
|
|
|
+ when(context.fieldMapper(fieldName)).thenReturn(fieldType);
|
|
|
+ when(context.getIndexReader()).thenReturn(reader);
|
|
|
+ when(context.getShardId()).thenReturn(shardId);
|
|
|
+ IndexSettings indexSettings = createIndexSettings(indexVersionCreated, numShards);
|
|
|
+ when(context.getIndexSettings()).thenReturn(indexSettings);
|
|
|
+ if (dvType != null) {
|
|
|
+ fieldType.setHasDocValues(true);
|
|
|
+ fieldType.setDocValuesType(dvType);
|
|
|
+ IndexNumericFieldData fd = mock(IndexNumericFieldData.class);
|
|
|
+ when(context.getForField(fieldType)).thenReturn(fd);
|
|
|
+ }
|
|
|
+ return context;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
public void testSerialization() throws Exception {
|
|
|
SliceBuilder original = randomSliceBuilder();
|
|
|
SliceBuilder deserialized = serializedCopy(original);
|
|
@@ -131,92 +332,41 @@ public class SliceBuilderTests extends ESTestCase {
|
|
|
assertEquals("max must be greater than id", e.getMessage());
|
|
|
}
|
|
|
|
|
|
- public void testToFilter() throws IOException {
|
|
|
+ public void testToFilterSimple() throws IOException {
|
|
|
Directory dir = new RAMDirectory();
|
|
|
try (IndexWriter writer = new IndexWriter(dir, newIndexWriterConfig(new MockAnalyzer(random())))) {
|
|
|
writer.commit();
|
|
|
}
|
|
|
- QueryShardContext context = mock(QueryShardContext.class);
|
|
|
try (IndexReader reader = DirectoryReader.open(dir)) {
|
|
|
- MappedFieldType fieldType = new MappedFieldType() {
|
|
|
- @Override
|
|
|
- public MappedFieldType clone() {
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public String typeName() {
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public Query termQuery(Object value, @Nullable QueryShardContext context) {
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
- public Query existsQuery(QueryShardContext context) {
|
|
|
- return null;
|
|
|
- }
|
|
|
- };
|
|
|
- fieldType.setName(IdFieldMapper.NAME);
|
|
|
- fieldType.setHasDocValues(false);
|
|
|
- when(context.fieldMapper(IdFieldMapper.NAME)).thenReturn(fieldType);
|
|
|
- when(context.getIndexReader()).thenReturn(reader);
|
|
|
- Settings settings = Settings.builder()
|
|
|
- .put(IndexMetaData.SETTING_VERSION_CREATED, Version.CURRENT)
|
|
|
- .put(IndexMetaData.SETTING_NUMBER_OF_SHARDS, 2)
|
|
|
- .put(IndexMetaData.SETTING_NUMBER_OF_REPLICAS, 0)
|
|
|
- .build();
|
|
|
- IndexMetaData indexState = IndexMetaData.builder("index").settings(settings).build();
|
|
|
- IndexSettings indexSettings = new IndexSettings(indexState, Settings.EMPTY);
|
|
|
- when(context.getIndexSettings()).thenReturn(indexSettings);
|
|
|
+ QueryShardContext context =
|
|
|
+ createShardContext(Version.CURRENT, reader, "_id", DocValuesType.SORTED_NUMERIC, 1,0);
|
|
|
SliceBuilder builder = new SliceBuilder(5, 10);
|
|
|
- Query query = builder.toFilter(context, 0, 1);
|
|
|
+ Query query = builder.toFilter(null, createRequest(0), context, Version.CURRENT);
|
|
|
assertThat(query, instanceOf(TermsSliceQuery.class));
|
|
|
|
|
|
- assertThat(builder.toFilter(context, 0, 1), equalTo(query));
|
|
|
+ assertThat(builder.toFilter(null, createRequest(0), context, Version.CURRENT), equalTo(query));
|
|
|
try (IndexReader newReader = DirectoryReader.open(dir)) {
|
|
|
when(context.getIndexReader()).thenReturn(newReader);
|
|
|
- assertThat(builder.toFilter(context, 0, 1), equalTo(query));
|
|
|
+ assertThat(builder.toFilter(null, createRequest(0), context, Version.CURRENT), equalTo(query));
|
|
|
}
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
+ public void testToFilterRandom() throws IOException {
|
|
|
+ Directory dir = new RAMDirectory();
|
|
|
+ try (IndexWriter writer = new IndexWriter(dir, newIndexWriterConfig(new MockAnalyzer(random())))) {
|
|
|
+ writer.commit();
|
|
|
+ }
|
|
|
try (IndexReader reader = DirectoryReader.open(dir)) {
|
|
|
- MappedFieldType fieldType = new MappedFieldType() {
|
|
|
- @Override
|
|
|
- public MappedFieldType clone() {
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public String typeName() {
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public Query termQuery(Object value, @Nullable QueryShardContext context) {
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
- public Query existsQuery(QueryShardContext context) {
|
|
|
- return null;
|
|
|
- }
|
|
|
- };
|
|
|
- fieldType.setName("field_doc_values");
|
|
|
- fieldType.setHasDocValues(true);
|
|
|
- fieldType.setDocValuesType(DocValuesType.SORTED_NUMERIC);
|
|
|
- when(context.fieldMapper("field_doc_values")).thenReturn(fieldType);
|
|
|
- when(context.getIndexReader()).thenReturn(reader);
|
|
|
- IndexNumericFieldData fd = mock(IndexNumericFieldData.class);
|
|
|
- when(context.getForField(fieldType)).thenReturn(fd);
|
|
|
- SliceBuilder builder = new SliceBuilder("field_doc_values", 5, 10);
|
|
|
- Query query = builder.toFilter(context, 0, 1);
|
|
|
+ QueryShardContext context =
|
|
|
+ createShardContext(Version.CURRENT, reader, "field", DocValuesType.SORTED_NUMERIC, 1,0);
|
|
|
+ SliceBuilder builder = new SliceBuilder("field", 5, 10);
|
|
|
+ Query query = builder.toFilter(null, createRequest(0), context, Version.CURRENT);
|
|
|
assertThat(query, instanceOf(DocValuesSliceQuery.class));
|
|
|
-
|
|
|
- assertThat(builder.toFilter(context, 0, 1), equalTo(query));
|
|
|
+ assertThat(builder.toFilter(null, createRequest(0), context, Version.CURRENT), equalTo(query));
|
|
|
try (IndexReader newReader = DirectoryReader.open(dir)) {
|
|
|
when(context.getIndexReader()).thenReturn(newReader);
|
|
|
- assertThat(builder.toFilter(context, 0, 1), equalTo(query));
|
|
|
+ assertThat(builder.toFilter(null, createRequest(0), context, Version.CURRENT), equalTo(query));
|
|
|
}
|
|
|
|
|
|
// numSlices > numShards
|
|
@@ -226,7 +376,8 @@ public class SliceBuilderTests extends ESTestCase {
|
|
|
for (int i = 0; i < numSlices; i++) {
|
|
|
for (int j = 0; j < numShards; j++) {
|
|
|
SliceBuilder slice = new SliceBuilder("_id", i, numSlices);
|
|
|
- Query q = slice.toFilter(context, j, numShards);
|
|
|
+ context = createShardContext(Version.CURRENT, reader, "_id", DocValuesType.SORTED, numShards, j);
|
|
|
+ Query q = slice.toFilter(null, createRequest(j), context, Version.CURRENT);
|
|
|
if (q instanceof TermsSliceQuery || q instanceof MatchAllDocsQuery) {
|
|
|
AtomicInteger count = numSliceMap.get(j);
|
|
|
if (count == null) {
|
|
@@ -250,12 +401,13 @@ public class SliceBuilderTests extends ESTestCase {
|
|
|
|
|
|
// numShards > numSlices
|
|
|
numShards = randomIntBetween(4, 100);
|
|
|
- numSlices = randomIntBetween(2, numShards-1);
|
|
|
+ numSlices = randomIntBetween(2, numShards - 1);
|
|
|
List<Integer> targetShards = new ArrayList<>();
|
|
|
for (int i = 0; i < numSlices; i++) {
|
|
|
for (int j = 0; j < numShards; j++) {
|
|
|
SliceBuilder slice = new SliceBuilder("_id", i, numSlices);
|
|
|
- Query q = slice.toFilter(context, j, numShards);
|
|
|
+ context = createShardContext(Version.CURRENT, reader, "_id", DocValuesType.SORTED, numShards, j);
|
|
|
+ Query q = slice.toFilter(null, createRequest(j), context, Version.CURRENT);
|
|
|
if (q instanceof MatchNoDocsQuery == false) {
|
|
|
assertThat(q, instanceOf(MatchAllDocsQuery.class));
|
|
|
targetShards.add(j);
|
|
@@ -271,7 +423,7 @@ public class SliceBuilderTests extends ESTestCase {
|
|
|
for (int i = 0; i < numSlices; i++) {
|
|
|
for (int j = 0; j < numShards; j++) {
|
|
|
SliceBuilder slice = new SliceBuilder("_id", i, numSlices);
|
|
|
- Query q = slice.toFilter(context, j, numShards);
|
|
|
+ Query q = slice.toFilter(null, createRequest(j), context, Version.CURRENT);
|
|
|
if (i == j) {
|
|
|
assertThat(q, instanceOf(MatchAllDocsQuery.class));
|
|
|
} else {
|
|
@@ -280,85 +432,35 @@ public class SliceBuilderTests extends ESTestCase {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
+ public void testInvalidField() throws IOException {
|
|
|
+ Directory dir = new RAMDirectory();
|
|
|
+ try (IndexWriter writer = new IndexWriter(dir, newIndexWriterConfig(new MockAnalyzer(random())))) {
|
|
|
+ writer.commit();
|
|
|
+ }
|
|
|
try (IndexReader reader = DirectoryReader.open(dir)) {
|
|
|
- MappedFieldType fieldType = new MappedFieldType() {
|
|
|
- @Override
|
|
|
- public MappedFieldType clone() {
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public String typeName() {
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public Query termQuery(Object value, @Nullable QueryShardContext context) {
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
- public Query existsQuery(QueryShardContext context) {
|
|
|
- return null;
|
|
|
- }
|
|
|
- };
|
|
|
- fieldType.setName("field_without_doc_values");
|
|
|
- when(context.fieldMapper("field_without_doc_values")).thenReturn(fieldType);
|
|
|
- when(context.getIndexReader()).thenReturn(reader);
|
|
|
- SliceBuilder builder = new SliceBuilder("field_without_doc_values", 5, 10);
|
|
|
- IllegalArgumentException exc =
|
|
|
- expectThrows(IllegalArgumentException.class, () -> builder.toFilter(context, 0, 1));
|
|
|
+ QueryShardContext context = createShardContext(Version.CURRENT, reader, "field", null, 1,0);
|
|
|
+ SliceBuilder builder = new SliceBuilder("field", 5, 10);
|
|
|
+ IllegalArgumentException exc = expectThrows(IllegalArgumentException.class,
|
|
|
+ () -> builder.toFilter(null, createRequest(0), context, Version.CURRENT));
|
|
|
assertThat(exc.getMessage(), containsString("cannot load numeric doc values"));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
public void testToFilterDeprecationMessage() throws IOException {
|
|
|
Directory dir = new RAMDirectory();
|
|
|
try (IndexWriter writer = new IndexWriter(dir, newIndexWriterConfig(new MockAnalyzer(random())))) {
|
|
|
writer.commit();
|
|
|
}
|
|
|
- QueryShardContext context = mock(QueryShardContext.class);
|
|
|
try (IndexReader reader = DirectoryReader.open(dir)) {
|
|
|
- MappedFieldType fieldType = new MappedFieldType() {
|
|
|
- @Override
|
|
|
- public MappedFieldType clone() {
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public String typeName() {
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public Query termQuery(Object value, @Nullable QueryShardContext context) {
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
- public Query existsQuery(QueryShardContext context) {
|
|
|
- return null;
|
|
|
- }
|
|
|
- };
|
|
|
- fieldType.setName("_uid");
|
|
|
- fieldType.setHasDocValues(false);
|
|
|
- when(context.fieldMapper("_uid")).thenReturn(fieldType);
|
|
|
- when(context.getIndexReader()).thenReturn(reader);
|
|
|
- Settings settings = Settings.builder()
|
|
|
- .put(IndexMetaData.SETTING_VERSION_CREATED, Version.V_6_3_0)
|
|
|
- .put(IndexMetaData.SETTING_NUMBER_OF_SHARDS, 2)
|
|
|
- .put(IndexMetaData.SETTING_NUMBER_OF_REPLICAS, 0)
|
|
|
- .build();
|
|
|
- IndexMetaData indexState = IndexMetaData.builder("index").settings(settings).build();
|
|
|
- IndexSettings indexSettings = new IndexSettings(indexState, Settings.EMPTY);
|
|
|
- when(context.getIndexSettings()).thenReturn(indexSettings);
|
|
|
+ QueryShardContext context = createShardContext(Version.V_6_3_0, reader, "_uid", null, 1,0);
|
|
|
SliceBuilder builder = new SliceBuilder("_uid", 5, 10);
|
|
|
- Query query = builder.toFilter(context, 0, 1);
|
|
|
+ Query query = builder.toFilter(null, createRequest(0), context, Version.CURRENT);
|
|
|
assertThat(query, instanceOf(TermsSliceQuery.class));
|
|
|
- assertThat(builder.toFilter(context, 0, 1), equalTo(query));
|
|
|
+ assertThat(builder.toFilter(null, createRequest(0), context, Version.CURRENT), equalTo(query));
|
|
|
assertWarnings("Computing slices on the [_uid] field is deprecated for 6.x indices, use [_id] instead");
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
|
|
|
public void testSerializationBackcompat() throws IOException {
|
|
@@ -375,4 +477,35 @@ public class SliceBuilderTests extends ESTestCase {
|
|
|
SliceBuilder::new, Version.V_6_3_0);
|
|
|
assertEquals(sliceBuilder, copy63);
|
|
|
}
|
|
|
+
|
|
|
+ public void testToFilterWithRouting() throws IOException {
|
|
|
+ Directory dir = new RAMDirectory();
|
|
|
+ try (IndexWriter writer = new IndexWriter(dir, newIndexWriterConfig(new MockAnalyzer(random())))) {
|
|
|
+ writer.commit();
|
|
|
+ }
|
|
|
+ ClusterService clusterService = mock(ClusterService.class);
|
|
|
+ ClusterState state = mock(ClusterState.class);
|
|
|
+ when(state.metaData()).thenReturn(MetaData.EMPTY_META_DATA);
|
|
|
+ when(clusterService.state()).thenReturn(state);
|
|
|
+ OperationRouting routing = mock(OperationRouting.class);
|
|
|
+ GroupShardsIterator<ShardIterator> it = new GroupShardsIterator<>(
|
|
|
+ Collections.singletonList(
|
|
|
+ new SearchShardIterator(null, new ShardId("index", "index", 1), null, null)
|
|
|
+ )
|
|
|
+ );
|
|
|
+ when(routing.searchShards(any(), any(), any(), any())).thenReturn(it);
|
|
|
+ when(clusterService.operationRouting()).thenReturn(routing);
|
|
|
+ when(clusterService.getSettings()).thenReturn(Settings.EMPTY);
|
|
|
+ try (IndexReader reader = DirectoryReader.open(dir)) {
|
|
|
+ QueryShardContext context = createShardContext(Version.CURRENT, reader, "field", DocValuesType.SORTED, 5, 0);
|
|
|
+ SliceBuilder builder = new SliceBuilder("field", 6, 10);
|
|
|
+ String[] routings = new String[] { "foo" };
|
|
|
+ Query query = builder.toFilter(clusterService, createRequest(1, routings, null), context, Version.CURRENT);
|
|
|
+ assertEquals(new DocValuesSliceQuery("field", 6, 10), query);
|
|
|
+ query = builder.toFilter(clusterService, createRequest(1, Strings.EMPTY_ARRAY, "foo"), context, Version.CURRENT);
|
|
|
+ assertEquals(new DocValuesSliceQuery("field", 6, 10), query);
|
|
|
+ query = builder.toFilter(clusterService, createRequest(1, Strings.EMPTY_ARRAY, "foo"), context, Version.V_6_2_0);
|
|
|
+ assertEquals(new DocValuesSliceQuery("field", 1, 2), query);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|