diff --git a/core/src/main/java/org/elasticsearch/index/query/ScriptQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/ScriptQueryBuilder.java index 4501d12b91f..01f29614e2e 100644 --- a/core/src/main/java/org/elasticsearch/index/query/ScriptQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/ScriptQueryBuilder.java @@ -138,9 +138,8 @@ public class ScriptQueryBuilder extends AbstractQueryBuilder static class ScriptQuery extends Query { - private final Script script; - - private final SearchScript searchScript; + final Script script; + final SearchScript searchScript; public ScriptQuery(Script script, SearchScript searchScript) { this.script = script; @@ -158,17 +157,23 @@ public class ScriptQueryBuilder extends AbstractQueryBuilder @Override public boolean equals(Object obj) { - if (this == obj) + // TODO: Do this if/when we can assume scripts are pure functions + // and they have a reliable equals impl + /*if (this == obj) return true; if (sameClassAs(obj) == false) return false; ScriptQuery other = (ScriptQuery) obj; - return Objects.equals(script, other.script); + return Objects.equals(script, other.script);*/ + return this == obj; } @Override public int hashCode() { - return Objects.hash(classHash(), script); + // TODO: Do this if/when we can assume scripts are pure functions + // and they have a reliable equals impl + // return Objects.hash(classHash(), script); + return System.identityHashCode(this); } @Override diff --git a/core/src/test/java/org/elasticsearch/index/query/ScriptQueryBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/ScriptQueryBuilderTests.java index e63dd713606..adce17c86bb 100644 --- a/core/src/test/java/org/elasticsearch/index/query/ScriptQueryBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/ScriptQueryBuilderTests.java @@ -20,6 +20,7 @@ package org.elasticsearch.index.query; import org.apache.lucene.search.Query; +import org.elasticsearch.index.query.ScriptQueryBuilder.ScriptQuery; import org.elasticsearch.script.MockScriptEngine; import org.elasticsearch.script.Script; import org.elasticsearch.script.ScriptService.ScriptType; @@ -41,9 +42,19 @@ public class ScriptQueryBuilderTests extends AbstractQueryTestCase> return parseInnerQueryBuilder; } + /** + * Whether the queries produced by this builder are expected to be cacheable. + */ + protected boolean builderGeneratesCacheableQueries() { + return true; + } + /** * Test creates the {@link Query} from the {@link QueryBuilder} under test and delegates the * assertions being made on the result to the implementing subclass. @@ -618,8 +625,10 @@ public abstract class AbstractQueryTestCase> assertNotNull("toQuery should not return null", secondLuceneQuery); assertLuceneQuery(secondQuery, secondLuceneQuery, searchContext); - assertEquals("two equivalent query builders lead to different lucene queries", - rewrite(secondLuceneQuery), rewrite(firstLuceneQuery)); + if (builderGeneratesCacheableQueries()) { + assertEquals("two equivalent query builders lead to different lucene queries", + rewrite(secondLuceneQuery), rewrite(firstLuceneQuery)); + } if (supportsBoostAndQueryName()) { secondQuery.boost(firstQuery.boost() + 1f + randomFloat());