diff --git a/core/src/main/java/org/elasticsearch/search/internal/AliasFilter.java b/core/src/main/java/org/elasticsearch/search/internal/AliasFilter.java index 915e745ddf4..f053b3d48fe 100644 --- a/core/src/main/java/org/elasticsearch/search/internal/AliasFilter.java +++ b/core/src/main/java/org/elasticsearch/search/internal/AliasFilter.java @@ -126,7 +126,7 @@ public final class AliasFilter implements Writeable { @Override public int hashCode() { - return Objects.hash(aliases, filter, reparseAliases); + return Objects.hash(reparseAliases, Arrays.hashCode(aliases), filter); } @Override diff --git a/core/src/test/java/org/elasticsearch/search/internal/AliasFilterTests.java b/core/src/test/java/org/elasticsearch/search/internal/AliasFilterTests.java new file mode 100644 index 00000000000..ba21a63f683 --- /dev/null +++ b/core/src/test/java/org/elasticsearch/search/internal/AliasFilterTests.java @@ -0,0 +1,62 @@ +/* + * 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.search.internal; + +import org.elasticsearch.common.io.stream.BytesStreamOutput; +import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.index.query.TermQueryBuilder; +import org.elasticsearch.test.ESTestCase; +import org.elasticsearch.test.EqualsHashCodeTestUtils; + +import java.util.Arrays; + +import static org.hamcrest.Matchers.greaterThan; +import static org.hamcrest.Matchers.instanceOf; + +public class AliasFilterTests extends ESTestCase { + + public void testEqualsAndHashCode() { + final QueryBuilder filter = QueryBuilders.termQuery("field", "value"); + final String[] aliases = new String[] { "alias_0", "alias_1" }; + final AliasFilter aliasFilter = new AliasFilter(filter, aliases); + final EqualsHashCodeTestUtils.CopyFunction aliasFilterCopyFunction = x -> { + assertThat(x.getQueryBuilder(), instanceOf(TermQueryBuilder.class)); + final BytesStreamOutput out = new BytesStreamOutput(); + x.getQueryBuilder().writeTo(out); + final QueryBuilder otherFilter = new TermQueryBuilder(out.bytes().streamInput()); + final String[] otherAliases = Arrays.copyOf(x.getAliases(), x.getAliases().length); + return new AliasFilter(otherFilter, otherAliases); + }; + + final EqualsHashCodeTestUtils.MutateFunction aliasFilterMutationFunction = x -> { + assertThat(x.getQueryBuilder(), instanceOf(TermQueryBuilder.class)); + final BytesStreamOutput out = new BytesStreamOutput(); + x.getQueryBuilder().writeTo(out); + final QueryBuilder otherFilter = new TermQueryBuilder(out.bytes().streamInput()); + assertThat(x.getAliases().length, greaterThan(0)); + final String[] otherAliases = Arrays.copyOf(x.getAliases(), x.getAliases().length - 1); + return new AliasFilter(otherFilter, otherAliases); + }; + + EqualsHashCodeTestUtils.checkEqualsAndHashCode(aliasFilter, aliasFilterCopyFunction, aliasFilterMutationFunction); + } + +}