diff --git a/buildSrc/src/main/resources/checkstyle_suppressions.xml b/buildSrc/src/main/resources/checkstyle_suppressions.xml index 54dfe661f35..67302f1fe8f 100644 --- a/buildSrc/src/main/resources/checkstyle_suppressions.xml +++ b/buildSrc/src/main/resources/checkstyle_suppressions.xml @@ -658,7 +658,6 @@ - diff --git a/core/src/main/java/org/elasticsearch/cluster/metadata/AliasMetaData.java b/core/src/main/java/org/elasticsearch/cluster/metadata/AliasMetaData.java index 8071871fbfe..c0262a6d01d 100644 --- a/core/src/main/java/org/elasticsearch/cluster/metadata/AliasMetaData.java +++ b/core/src/main/java/org/elasticsearch/cluster/metadata/AliasMetaData.java @@ -27,6 +27,7 @@ import org.elasticsearch.common.bytes.BytesArray; import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; +import org.elasticsearch.common.util.set.Sets; import org.elasticsearch.common.xcontent.ToXContent; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; @@ -58,7 +59,7 @@ public class AliasMetaData extends AbstractDiffable { this.indexRouting = indexRouting; this.searchRouting = searchRouting; if (searchRouting != null) { - searchRoutingValues = Collections.unmodifiableSet(Strings.splitStringByCommaToSet(searchRouting)); + searchRoutingValues = Collections.unmodifiableSet(Sets.newHashSet(Strings.splitStringByCommaToArray(searchRouting))); } else { searchRoutingValues = emptySet(); } @@ -186,7 +187,7 @@ public class AliasMetaData extends AbstractDiffable { } if (in.readBoolean()) { searchRouting = in.readString(); - searchRoutingValues = Collections.unmodifiableSet(Strings.splitStringByCommaToSet(searchRouting)); + searchRoutingValues = Collections.unmodifiableSet(Sets.newHashSet(Strings.splitStringByCommaToArray(searchRouting))); } else { searchRouting = null; searchRoutingValues = emptySet(); diff --git a/core/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java b/core/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java index 6dc92a44bb0..1f36e50ca1d 100644 --- a/core/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java +++ b/core/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java @@ -31,6 +31,7 @@ import org.elasticsearch.common.joda.DateMathParser; import org.elasticsearch.common.joda.FormatDateTimeFormatter; import org.elasticsearch.common.regex.Regex; import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.util.set.Sets; import org.elasticsearch.index.Index; import org.elasticsearch.index.IndexNotFoundException; import org.elasticsearch.indices.IndexClosedException; @@ -358,6 +359,7 @@ public class IndexNameExpressionResolver extends AbstractComponent { resolvedExpressions = expressionResolver.resolve(context, resolvedExpressions); } + // TODO: it appears that this can never be true? if (isAllIndices(resolvedExpressions)) { return resolveSearchRoutingAllIndices(state.metaData(), routing); } @@ -367,7 +369,7 @@ public class IndexNameExpressionResolver extends AbstractComponent { // List of indices that don't require any routing Set norouting = new HashSet<>(); if (routing != null) { - paramRouting = Strings.splitStringByCommaToSet(routing); + paramRouting = Sets.newHashSet(Strings.splitStringByCommaToArray(routing)); } for (String expression : resolvedExpressions) { @@ -442,9 +444,9 @@ public class IndexNameExpressionResolver extends AbstractComponent { /** * Sets the same routing for all indices */ - private Map> resolveSearchRoutingAllIndices(MetaData metaData, String routing) { + public Map> resolveSearchRoutingAllIndices(MetaData metaData, String routing) { if (routing != null) { - Set r = Strings.splitStringByCommaToSet(routing); + Set r = Sets.newHashSet(Strings.splitStringByCommaToArray(routing)); Map> routings = new HashMap<>(); String[] concreteIndices = metaData.getConcreteAllIndices(); for (String index : concreteIndices) { diff --git a/core/src/test/java/org/elasticsearch/cluster/metadata/AliasMetaDataTests.java b/core/src/test/java/org/elasticsearch/cluster/metadata/AliasMetaDataTests.java new file mode 100644 index 00000000000..d5ae07f4341 --- /dev/null +++ b/core/src/test/java/org/elasticsearch/cluster/metadata/AliasMetaDataTests.java @@ -0,0 +1,55 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.elasticsearch.cluster.metadata; + +import org.elasticsearch.common.io.stream.BytesStreamOutput; +import org.elasticsearch.common.io.stream.StreamInput; +import org.elasticsearch.common.util.set.Sets; +import org.elasticsearch.common.xcontent.XContent; +import org.elasticsearch.common.xcontent.XContentHelper; +import org.elasticsearch.test.ESTestCase; + +import java.io.IOException; + +import static org.hamcrest.Matchers.equalTo; + +public class AliasMetaDataTests extends ESTestCase { + + public void testSerialization() throws IOException { + final AliasMetaData before = + AliasMetaData + .builder("alias") + .filter("{ \"term\": \"foo\"}") + .indexRouting("indexRouting") + .routing("routing") + .searchRouting("trim,tw , ltw , lw") + .build(); + + assertThat(before.searchRoutingValues(), equalTo(Sets.newHashSet("trim", "tw ", " ltw ", " lw"))); + + final BytesStreamOutput out = new BytesStreamOutput(); + before.writeTo(out); + + final StreamInput in = out.bytes().streamInput(); + final AliasMetaData after = new AliasMetaData(in); + + assertThat(after, equalTo(before)); + } +} diff --git a/core/src/test/java/org/elasticsearch/routing/AliasResolveRoutingIT.java b/core/src/test/java/org/elasticsearch/routing/AliasResolveRoutingIT.java index c90ce51e48e..7a0ce93e77d 100644 --- a/core/src/test/java/org/elasticsearch/routing/AliasResolveRoutingIT.java +++ b/core/src/test/java/org/elasticsearch/routing/AliasResolveRoutingIT.java @@ -26,13 +26,13 @@ import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.common.Priority; import org.elasticsearch.test.ESIntegTestCase; +import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.concurrent.ExecutionException; import static org.elasticsearch.common.util.set.Sets.newHashSet; -import static org.elasticsearch.index.query.QueryBuilders.matchQuery; import static org.elasticsearch.index.query.QueryBuilders.queryStringQuery; import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertHitCount; import static org.hamcrest.Matchers.equalTo; @@ -40,7 +40,6 @@ import static org.hamcrest.Matchers.nullValue; public class AliasResolveRoutingIT extends ESIntegTestCase { - // see https://github.com/elastic/elasticsearch/issues/13278 public void testSearchClosedWildcardIndex() throws ExecutionException, InterruptedException { createIndex("test-0"); @@ -52,10 +51,17 @@ public class AliasResolveRoutingIT extends ESIntegTestCase { client().prepareIndex("test-0", "type1", "2").setSource("field1", "quick brown"), client().prepareIndex("test-0", "type1", "3").setSource("field1", "quick")); refresh("test-*"); - assertHitCount(client().prepareSearch().setIndices("alias-*").setIndicesOptions(IndicesOptions.lenientExpandOpen()).setQuery(queryStringQuery("quick")).get(), 3L); + assertHitCount( + client() + .prepareSearch() + .setIndices("alias-*") + .setIndicesOptions(IndicesOptions.lenientExpandOpen()) + .setQuery(queryStringQuery("quick")) + .get(), + 3L); } - public void testResolveIndexRouting() throws Exception { + public void testResolveIndexRouting() { createIndex("test1"); createIndex("test2"); client().admin().cluster().prepareHealth().setWaitForEvents(Priority.LANGUID).setWaitForGreenStatus().execute().actionGet(); @@ -97,9 +103,10 @@ public class AliasResolveRoutingIT extends ESIntegTestCase { } } - public void testResolveSearchRouting() throws Exception { + public void testResolveSearchRouting() { createIndex("test1"); createIndex("test2"); + createIndex("test3"); client().admin().cluster().prepareHealth().setWaitForEvents(Priority.LANGUID).setWaitForGreenStatus().execute().actionGet(); client().admin().indices().prepareAliases() @@ -108,7 +115,10 @@ public class AliasResolveRoutingIT extends ESIntegTestCase { .addAliasAction(AliasActions.add().index("test2").alias("alias20").routing("0")) .addAliasAction(AliasActions.add().index("test2").alias("alias21").routing("1")) .addAliasAction(AliasActions.add().index("test1").alias("alias0").routing("0")) - .addAliasAction(AliasActions.add().index("test2").alias("alias0").routing("0")).get(); + .addAliasAction(AliasActions.add().index("test2").alias("alias0").routing("0")) + .addAliasAction(AliasActions.add().index("test3").alias("alias3tw").routing("tw ")) + .addAliasAction(AliasActions.add().index("test3").alias("alias3ltw").routing(" ltw ")) + .addAliasAction(AliasActions.add().index("test3").alias("alias3lw").routing(" lw")).get(); ClusterState state = clusterService().state(); IndexNameExpressionResolver indexNameExpressionResolver = internalCluster().getInstance(IndexNameExpressionResolver.class); @@ -118,7 +128,9 @@ public class AliasResolveRoutingIT extends ESIntegTestCase { assertThat(indexNameExpressionResolver.resolveSearchRouting(state, null, "alias10"), equalTo(newMap("test1", newSet("0")))); assertThat(indexNameExpressionResolver.resolveSearchRouting(state, "0", "alias10"), equalTo(newMap("test1", newSet("0")))); assertThat(indexNameExpressionResolver.resolveSearchRouting(state, "1", "alias10"), nullValue()); - assertThat(indexNameExpressionResolver.resolveSearchRouting(state, null, "alias0"), equalTo(newMap("test1", newSet("0"), "test2", newSet("0")))); + assertThat( + indexNameExpressionResolver.resolveSearchRouting(state, null, "alias0"), + equalTo(newMap("test1", newSet("0"), "test2", newSet("0")))); assertThat(indexNameExpressionResolver.resolveSearchRouting(state, null, new String[]{"alias10", "alias20"}), equalTo(newMap("test1", newSet("0"), "test2", newSet("0")))); @@ -143,13 +155,42 @@ public class AliasResolveRoutingIT extends ESIntegTestCase { equalTo(newMap("test1", newSet("0"), "test2", newSet("1")))); assertThat(indexNameExpressionResolver.resolveSearchRouting(state, "0,1,2", new String[]{"test1", "alias10", "alias21"}), equalTo(newMap("test1", newSet("0", "1", "2"), "test2", newSet("1")))); + + assertThat( + indexNameExpressionResolver.resolveSearchRouting(state, "tw , ltw , lw", "test1"), + equalTo(newMap("test1", newSet("tw ", " ltw ", " lw")))); + assertThat( + indexNameExpressionResolver.resolveSearchRouting(state, "tw , ltw , lw", "alias3tw"), + equalTo(newMap("test3", newSet("tw ")))); + assertThat( + indexNameExpressionResolver.resolveSearchRouting(state, "tw , ltw , lw", "alias3ltw"), + equalTo(newMap("test3", newSet(" ltw ")))); + assertThat( + indexNameExpressionResolver.resolveSearchRouting(state, "tw , ltw , lw", "alias3lw"), + equalTo(newMap("test3", newSet(" lw")))); + assertThat( + indexNameExpressionResolver.resolveSearchRouting(state, "0,tw , ltw , lw", "test1", "alias3ltw"), + equalTo(newMap("test1", newSet("0", "tw ", " ltw ", " lw"), "test3", newSet(" ltw ")))); + + assertThat( + indexNameExpressionResolver.resolveSearchRouting(state, "0,1,2,tw , ltw , lw", (String[])null), + equalTo(newMap( + "test1", newSet("0", "1", "2", "tw ", " ltw ", " lw"), + "test2", newSet("0", "1", "2", "tw ", " ltw ", " lw"), + "test3", newSet("0", "1", "2", "tw ", " ltw ", " lw")))); + + assertThat( + indexNameExpressionResolver.resolveSearchRoutingAllIndices(state.metaData(), "0,1,2,tw , ltw , lw"), + equalTo(newMap( + "test1", newSet("0", "1", "2", "tw ", " ltw ", " lw"), + "test2", newSet("0", "1", "2", "tw ", " ltw ", " lw"), + "test3", newSet("0", "1", "2", "tw ", " ltw ", " lw")))); } private Set newSet(T... elements) { return newHashSet(elements); } - private Map newMap(K key, V value) { Map r = new HashMap<>(); r.put(key, value); @@ -163,4 +204,12 @@ public class AliasResolveRoutingIT extends ESIntegTestCase { return r; } + private Map newMap(K key1, V value1, K key2, V value2, K key3, V value3) { + Map r = new HashMap<>(); + r.put(key1, value1); + r.put(key2, value2); + r.put(key3, value3); + return r; + } + }