Skip to content

Commit 0ed1eb5

Browse files
authored
Test: MockScoreScript can be cacheable (#55422)
1 parent 93021f7 commit 0ed1eb5

File tree

5 files changed

+28
-22
lines changed

5 files changed

+28
-22
lines changed

server/src/test/java/org/elasticsearch/index/query/ScriptScoreQueryBuilderTests.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ public void testIllegalArguments() {
9494
}
9595

9696
/**
97-
* Check that this query is generally not cacheable
97+
* Check that this query is cacheable
9898
*/
9999
@Override
100100
public void testCacheability() throws IOException {
@@ -105,7 +105,7 @@ public void testCacheability() throws IOException {
105105
QueryShardContext context = createShardContext();
106106
QueryBuilder rewriteQuery = rewriteQuery(queryBuilder, new QueryShardContext(context));
107107
assertNotNull(rewriteQuery.toQuery(context));
108-
assertFalse("query should not be cacheable: " + queryBuilder.toString(), context.isCacheable());
108+
assertTrue("query should be cacheable: " + queryBuilder.toString(), context.isCacheable());
109109
}
110110

111111
@Override

server/src/test/java/org/elasticsearch/index/query/functionscore/FunctionScoreQueryBuilderTests.java

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -837,29 +837,28 @@ public void testCacheability() throws IOException {
837837
assertEquals("query should " + (isCacheable ? "" : "not") + " be cacheable: " + queryBuilder.toString(), isCacheable,
838838
context.isCacheable());
839839

840-
// check the two non-cacheable cases explicitly
841840
ScoreFunctionBuilder<?> scriptScoreFunction = new ScriptScoreFunctionBuilder(
842841
new Script(ScriptType.INLINE, MockScriptEngine.NAME, "1", Collections.emptyMap()));
843-
RandomScoreFunctionBuilder randomScoreFunctionBuilder = new RandomScoreFunctionBuilderWithFixedSeed();
844-
845-
for (ScoreFunctionBuilder<?> scoreFunction : List.of(scriptScoreFunction, randomScoreFunctionBuilder)) {
846-
FilterFunctionBuilder[] functions = new FilterFunctionBuilder[] {
847-
new FilterFunctionBuilder(RandomQueryBuilder.createQuery(random()), scoreFunction) };
848-
queryBuilder = new FunctionScoreQueryBuilder(functions);
842+
queryBuilder = new FunctionScoreQueryBuilder(new FilterFunctionBuilder[] {
843+
new FilterFunctionBuilder(RandomQueryBuilder.createQuery(random()), scriptScoreFunction) });
844+
context = createShardContext();
845+
rewriteQuery = rewriteQuery(queryBuilder, new QueryShardContext(context));
846+
assertNotNull(rewriteQuery.toQuery(context));
847+
assertTrue("function script query should be cacheable" + queryBuilder.toString(), context.isCacheable());
849848

850-
context = createShardContext();
851-
rewriteQuery = rewriteQuery(queryBuilder, new QueryShardContext(context));
852-
assertNotNull(rewriteQuery.toQuery(context));
853-
assertFalse("query should not be cacheable: " + queryBuilder.toString(), context.isCacheable());
854-
}
849+
RandomScoreFunctionBuilder randomScoreFunctionBuilder = new RandomScoreFunctionBuilderWithFixedSeed();
850+
queryBuilder = new FunctionScoreQueryBuilder(new FilterFunctionBuilder[] {
851+
new FilterFunctionBuilder(RandomQueryBuilder.createQuery(random()), randomScoreFunctionBuilder) });
852+
context = createShardContext();
853+
rewriteQuery = rewriteQuery(queryBuilder, new QueryShardContext(context));
854+
assertNotNull(rewriteQuery.toQuery(context));
855+
assertFalse("function random query should not be cacheable: " + queryBuilder.toString(), context.isCacheable());
855856
}
856857

857858
private boolean isCacheable(FunctionScoreQueryBuilder queryBuilder) {
858859
FilterFunctionBuilder[] filterFunctionBuilders = queryBuilder.filterFunctionBuilders();
859860
for (FilterFunctionBuilder builder : filterFunctionBuilders) {
860-
if (builder.getScoreFunction() instanceof ScriptScoreFunctionBuilder) {
861-
return false;
862-
} else if (builder.getScoreFunction() instanceof RandomScoreFunctionBuilder
861+
if (builder.getScoreFunction() instanceof RandomScoreFunctionBuilder
863862
&& ((RandomScoreFunctionBuilder) builder.getScoreFunction()).getSeed() == null) {
864863
return false;
865864
}

test/framework/src/main/java/org/elasticsearch/script/MockScriptEngine.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ public double execute(Map<String, Object> params1, double[] values) {
225225
};
226226
return context.factoryClazz.cast(factory);
227227
} else if (context.instanceClazz.equals(ScoreScript.class)) {
228-
ScoreScript.Factory factory = new MockScoreScript(script::apply);
228+
ScoreScript.Factory factory = new MockScoreScript(script);
229229
return context.factoryClazz.cast(factory);
230230
} else if (context.instanceClazz.equals(ScriptedMetricAggContexts.InitScript.class)) {
231231
ScriptedMetricAggContexts.InitScript.Factory factory = new MockMetricAggInitScriptFactory(script);
@@ -545,9 +545,9 @@ public static Script mockInlineScript(final String script) {
545545

546546
public class MockScoreScript implements ScoreScript.Factory {
547547

548-
private final Function<Map<String, Object>, Object> script;
548+
private final MockDeterministicScript script;
549549

550-
public MockScoreScript(Function<Map<String, Object>, Object> script) {
550+
public MockScoreScript(MockDeterministicScript script) {
551551
this.script = script;
552552
}
553553

@@ -581,6 +581,11 @@ public void setScorer(Scorable scorer) {
581581
}
582582
};
583583
}
584+
585+
@Override
586+
public boolean isResultDeterministic() {
587+
return script.isResultDeterministic();
588+
}
584589
}
585590

586591
class MockAggregationScript implements AggregationScript.Factory {

x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/monitoring/test/MockPainlessScriptEngine.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
package org.elasticsearch.xpack.core.monitoring.test;
77

88
import org.elasticsearch.common.settings.Settings;
9+
import org.elasticsearch.script.MockDeterministicScript;
910
import org.elasticsearch.script.MockScriptEngine;
1011
import org.elasticsearch.script.MockScriptPlugin;
1112
import org.elasticsearch.script.ScoreScript;
@@ -44,7 +45,7 @@ public String getType() {
4445
@Override
4546
public <T> T compile(String name, String script, ScriptContext<T> context, Map<String, String> options) {
4647
if (context.instanceClazz.equals(ScoreScript.class)) {
47-
return context.factoryClazz.cast(new MockScoreScript(p -> 0.0));
48+
return context.factoryClazz.cast(new MockScoreScript(MockDeterministicScript.asDeterministic(p -> 0.0)));
4849
}
4950
throw new IllegalArgumentException("mock painless does not know how to handle context [" + context.name + "]");
5051
}

x-pack/plugin/ml/qa/native-multi-node-tests/src/test/java/org/elasticsearch/xpack/ml/integration/MlNativeIntegTestCase.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.elasticsearch.persistent.PersistentTaskState;
2626
import org.elasticsearch.plugins.Plugin;
2727
import org.elasticsearch.script.IngestScript;
28+
import org.elasticsearch.script.MockDeterministicScript;
2829
import org.elasticsearch.script.MockScriptEngine;
2930
import org.elasticsearch.script.MockScriptPlugin;
3031
import org.elasticsearch.script.ScoreScript;
@@ -307,7 +308,7 @@ public String getType() {
307308
@Override
308309
public <T> T compile(String name, String script, ScriptContext<T> context, Map<String, String> options) {
309310
if (context.instanceClazz.equals(ScoreScript.class)) {
310-
return context.factoryClazz.cast(new MockScoreScript(p -> 0.0));
311+
return context.factoryClazz.cast(new MockScoreScript(MockDeterministicScript.asDeterministic(p -> 0.0)));
311312
}
312313
if (context.name.equals("ingest")) {
313314
IngestScript.Factory factory = vars -> new IngestScript(vars) {

0 commit comments

Comments
 (0)