Skip to content

Commit 2b0d151

Browse files
committed
Add more script contexts (#30721)
Added dedicated script contexts for: * script function score * script sorting * terms_set query Scripts for these contexts will either have a specific return value or use scoring and therefor in the future will need their own scripting classes. Relates to #30511
1 parent 661fd65 commit 2b0d151

File tree

7 files changed

+17
-7
lines changed

7 files changed

+17
-7
lines changed

plugins/examples/script-expert-scoring/src/main/java/org/elasticsearch/example/expertscript/ExpertScriptPlugin.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public String getType() {
5454

5555
@Override
5656
public <T> T compile(String scriptName, String scriptSource, ScriptContext<T> context, Map<String, String> params) {
57-
if (context.equals(SearchScript.CONTEXT) == false) {
57+
if (context.equals(SearchScript.SCRIPT_SCORE_CONTEXT) == false) {
5858
throw new IllegalArgumentException(getType() + " scripts cannot be used for context [" + context.name + "]");
5959
}
6060
// we use the script "source" as the script identifier

server/src/main/java/org/elasticsearch/index/query/TermsSetQueryBuilder.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,8 @@ protected Query doToQuery(QueryShardContext context) throws IOException {
249249
IndexNumericFieldData fieldData = context.getForField(msmFieldType);
250250
longValuesSource = new FieldValuesSource(fieldData);
251251
} else if (minimumShouldMatchScript != null) {
252-
SearchScript.Factory factory = context.getScriptService().compile(minimumShouldMatchScript, SearchScript.CONTEXT);
252+
SearchScript.Factory factory = context.getScriptService().compile(minimumShouldMatchScript,
253+
SearchScript.TERMS_SET_QUERY_CONTEXT);
253254
Map<String, Object> params = new HashMap<>();
254255
params.putAll(minimumShouldMatchScript.getParams());
255256
params.put("num_terms", queries.size());

server/src/main/java/org/elasticsearch/index/query/functionscore/ScriptScoreFunctionBuilder.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ protected int doHashCode() {
9292
@Override
9393
protected ScoreFunction doToFunction(QueryShardContext context) {
9494
try {
95-
SearchScript.Factory factory = context.getScriptService().compile(script, SearchScript.CONTEXT);
95+
SearchScript.Factory factory = context.getScriptService().compile(script, SearchScript.SCRIPT_SCORE_CONTEXT);
9696
SearchScript.LeafFactory searchScript = factory.newFactory(script.getParams(), context.lookup());
9797
return new ScriptScoreFunction(script, searchScript);
9898
} catch (Exception e) {

server/src/main/java/org/elasticsearch/script/ScriptModule.java

+3
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ public class ScriptModule {
4242
CORE_CONTEXTS = Stream.of(
4343
SearchScript.CONTEXT,
4444
SearchScript.AGGS_CONTEXT,
45+
SearchScript.SCRIPT_SCORE_CONTEXT,
46+
SearchScript.SCRIPT_SORT_CONTEXT,
47+
SearchScript.TERMS_SET_QUERY_CONTEXT,
4548
ExecutableScript.CONTEXT,
4649
ExecutableScript.AGGS_CONTEXT,
4750
ExecutableScript.UPDATE_CONTEXT,

server/src/main/java/org/elasticsearch/script/SearchScript.java

+8-2
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,12 @@ public interface Factory {
158158

159159
/** The context used to compile {@link SearchScript} factories. */
160160
public static final ScriptContext<Factory> CONTEXT = new ScriptContext<>("search", Factory.class);
161-
// TODO: remove aggs context when it has its own interface
161+
// TODO: remove these contexts when it has its own interface
162162
public static final ScriptContext<Factory> AGGS_CONTEXT = new ScriptContext<>("aggs", Factory.class);
163-
}
163+
// Can return a double. (For ScriptSortType#NUMBER only, for ScriptSortType#STRING normal CONTEXT should be used)
164+
public static final ScriptContext<Factory> SCRIPT_SORT_CONTEXT = new ScriptContext<>("sort", Factory.class);
165+
// Can return a float
166+
public static final ScriptContext<Factory> SCRIPT_SCORE_CONTEXT = new ScriptContext<>("score", Factory.class);
167+
// Can return a long
168+
public static final ScriptContext<Factory> TERMS_SET_QUERY_CONTEXT = new ScriptContext<>("terms_set", Factory.class);
169+
}

server/src/main/java/org/elasticsearch/search/sort/ScriptSortBuilder.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@ public static ScriptSortBuilder fromXContent(XContentParser parser, String eleme
305305

306306
@Override
307307
public SortFieldAndFormat build(QueryShardContext context) throws IOException {
308-
final SearchScript.Factory factory = context.getScriptService().compile(script, SearchScript.CONTEXT);
308+
final SearchScript.Factory factory = context.getScriptService().compile(script, SearchScript.SCRIPT_SORT_CONTEXT);
309309
final SearchScript.LeafFactory searchScript = factory.newFactory(script.getParams(), context.lookup());
310310

311311
MultiValueMode valueMode = null;

server/src/test/java/org/elasticsearch/search/functionscore/ExplainableScriptIT.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ public String getType() {
7676
@Override
7777
public <T> T compile(String scriptName, String scriptSource, ScriptContext<T> context, Map<String, String> params) {
7878
assert scriptSource.equals("explainable_script");
79-
assert context == SearchScript.CONTEXT;
79+
assert context == SearchScript.SCRIPT_SCORE_CONTEXT;
8080
SearchScript.Factory factory = (p, lookup) -> new SearchScript.LeafFactory() {
8181
@Override
8282
public SearchScript newInstance(LeafReaderContext context) throws IOException {

0 commit comments

Comments
 (0)