diff --git a/server/src/test/java/org/elasticsearch/index/query/ScriptScoreQueryBuilderTests.java b/server/src/test/java/org/elasticsearch/index/query/ScriptScoreQueryBuilderTests.java index a32b96b8f24..92239d7c887 100644 --- a/server/src/test/java/org/elasticsearch/index/query/ScriptScoreQueryBuilderTests.java +++ b/server/src/test/java/org/elasticsearch/index/query/ScriptScoreQueryBuilderTests.java @@ -94,7 +94,7 @@ public class ScriptScoreQueryBuilderTests extends AbstractQueryTestCase scriptScoreFunction = new ScriptScoreFunctionBuilder( new Script(ScriptType.INLINE, MockScriptEngine.NAME, "1", Collections.emptyMap())); + queryBuilder = new FunctionScoreQueryBuilder(new FilterFunctionBuilder[] { + new FilterFunctionBuilder(RandomQueryBuilder.createQuery(random()), scriptScoreFunction) }); + context = createShardContext(); + rewriteQuery = rewriteQuery(queryBuilder, new QueryShardContext(context)); + assertNotNull(rewriteQuery.toQuery(context)); + assertTrue("function script query should be cacheable" + queryBuilder.toString(), context.isCacheable()); + RandomScoreFunctionBuilder randomScoreFunctionBuilder = new RandomScoreFunctionBuilderWithFixedSeed(); - - for (ScoreFunctionBuilder scoreFunction : Arrays.asList(scriptScoreFunction, randomScoreFunctionBuilder)) { - FilterFunctionBuilder[] functions = new FilterFunctionBuilder[] { - new FilterFunctionBuilder(RandomQueryBuilder.createQuery(random()), scoreFunction) }; - queryBuilder = new FunctionScoreQueryBuilder(functions); - - context = createShardContext(); - rewriteQuery = rewriteQuery(queryBuilder, new QueryShardContext(context)); - assertNotNull(rewriteQuery.toQuery(context)); - assertFalse("query should not be cacheable: " + queryBuilder.toString(), context.isCacheable()); - } + queryBuilder = new FunctionScoreQueryBuilder(new FilterFunctionBuilder[] { + new FilterFunctionBuilder(RandomQueryBuilder.createQuery(random()), randomScoreFunctionBuilder) }); + context = createShardContext(); + rewriteQuery = rewriteQuery(queryBuilder, new QueryShardContext(context)); + assertNotNull(rewriteQuery.toQuery(context)); + assertFalse("function random query should not be cacheable: " + queryBuilder.toString(), context.isCacheable()); } private boolean isCacheable(FunctionScoreQueryBuilder queryBuilder) { FilterFunctionBuilder[] filterFunctionBuilders = queryBuilder.filterFunctionBuilders(); for (FilterFunctionBuilder builder : filterFunctionBuilders) { - if (builder.getScoreFunction() instanceof ScriptScoreFunctionBuilder) { - return false; - } else if (builder.getScoreFunction() instanceof RandomScoreFunctionBuilder + if (builder.getScoreFunction() instanceof RandomScoreFunctionBuilder && ((RandomScoreFunctionBuilder) builder.getScoreFunction()).getSeed() == null) { return false; } diff --git a/test/framework/src/main/java/org/elasticsearch/script/MockScriptEngine.java b/test/framework/src/main/java/org/elasticsearch/script/MockScriptEngine.java index d31974b0198..7ffe5f2fe5a 100644 --- a/test/framework/src/main/java/org/elasticsearch/script/MockScriptEngine.java +++ b/test/framework/src/main/java/org/elasticsearch/script/MockScriptEngine.java @@ -227,7 +227,7 @@ public class MockScriptEngine implements ScriptEngine { }; return context.factoryClazz.cast(factory); } else if (context.instanceClazz.equals(ScoreScript.class)) { - ScoreScript.Factory factory = new MockScoreScript(script::apply); + ScoreScript.Factory factory = new MockScoreScript(script); return context.factoryClazz.cast(factory); } else if (context.instanceClazz.equals(ScriptedMetricAggContexts.InitScript.class)) { ScriptedMetricAggContexts.InitScript.Factory factory = new MockMetricAggInitScriptFactory(script); @@ -547,9 +547,9 @@ public class MockScriptEngine implements ScriptEngine { public class MockScoreScript implements ScoreScript.Factory { - private final Function, Object> script; + private final MockDeterministicScript script; - public MockScoreScript(Function, Object> script) { + public MockScoreScript(MockDeterministicScript script) { this.script = script; } @@ -583,6 +583,11 @@ public class MockScriptEngine implements ScriptEngine { } }; } + + @Override + public boolean isResultDeterministic() { + return script.isResultDeterministic(); + } } class MockAggregationScript implements AggregationScript.Factory { diff --git a/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/monitoring/test/MockPainlessScriptEngine.java b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/monitoring/test/MockPainlessScriptEngine.java index 2052cebe1d0..575d046b2c4 100644 --- a/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/monitoring/test/MockPainlessScriptEngine.java +++ b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/monitoring/test/MockPainlessScriptEngine.java @@ -6,6 +6,7 @@ package org.elasticsearch.xpack.core.monitoring.test; import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.script.MockDeterministicScript; import org.elasticsearch.script.MockScriptEngine; import org.elasticsearch.script.MockScriptPlugin; import org.elasticsearch.script.ScoreScript; @@ -44,7 +45,7 @@ public class MockPainlessScriptEngine extends MockScriptEngine { @Override public T compile(String name, String script, ScriptContext context, Map options) { if (context.instanceClazz.equals(ScoreScript.class)) { - return context.factoryClazz.cast(new MockScoreScript(p -> 0.0)); + return context.factoryClazz.cast(new MockScoreScript(MockDeterministicScript.asDeterministic(p -> 0.0))); } throw new IllegalArgumentException("mock painless does not know how to handle context [" + context.name + "]"); } diff --git a/x-pack/plugin/ml/qa/native-multi-node-tests/src/test/java/org/elasticsearch/xpack/ml/integration/MlNativeIntegTestCase.java b/x-pack/plugin/ml/qa/native-multi-node-tests/src/test/java/org/elasticsearch/xpack/ml/integration/MlNativeIntegTestCase.java index 235b781f5f3..f1271f7f489 100644 --- a/x-pack/plugin/ml/qa/native-multi-node-tests/src/test/java/org/elasticsearch/xpack/ml/integration/MlNativeIntegTestCase.java +++ b/x-pack/plugin/ml/qa/native-multi-node-tests/src/test/java/org/elasticsearch/xpack/ml/integration/MlNativeIntegTestCase.java @@ -23,6 +23,7 @@ import org.elasticsearch.persistent.PersistentTaskParams; import org.elasticsearch.persistent.PersistentTaskState; import org.elasticsearch.plugins.Plugin; import org.elasticsearch.script.IngestScript; +import org.elasticsearch.script.MockDeterministicScript; import org.elasticsearch.script.MockScriptEngine; import org.elasticsearch.script.MockScriptPlugin; import org.elasticsearch.script.ScoreScript; @@ -283,7 +284,7 @@ abstract class MlNativeIntegTestCase extends ESIntegTestCase { @Override public T compile(String name, String script, ScriptContext context, Map options) { if (context.instanceClazz.equals(ScoreScript.class)) { - return context.factoryClazz.cast(new MockScoreScript(p -> 0.0)); + return context.factoryClazz.cast(new MockScoreScript(MockDeterministicScript.asDeterministic(p -> 0.0))); } if (context.name.equals("ingest")) { IngestScript.Factory factory = vars -> new IngestScript(vars) {