Skip to content

Commit ee5cd44

Browse files
authored
Unify supported runtime fields script contexts (#71833)
There's a few places where we need to access all of the supported runtime fields script contexts. Up until now we have listed them in all those places, but a better way would be to have them listed in one place and access that same list from all consumers. This is what this commit introduces. Along with the introduction of runtime fields contexts in ScriptModule, we rename the whitelist files so that they contain their corresponding context name to simplify looking them up.
1 parent 319548c commit ee5cd44

File tree

11 files changed

+44
-61
lines changed

11 files changed

+44
-61
lines changed

modules/lang-painless/src/main/java/org/elasticsearch/painless/PainlessPlugin.java

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -37,17 +37,11 @@
3737
import org.elasticsearch.repositories.RepositoriesService;
3838
import org.elasticsearch.rest.RestController;
3939
import org.elasticsearch.rest.RestHandler;
40-
import org.elasticsearch.script.BooleanFieldScript;
41-
import org.elasticsearch.script.DateFieldScript;
42-
import org.elasticsearch.script.DoubleFieldScript;
43-
import org.elasticsearch.script.GeoPointFieldScript;
44-
import org.elasticsearch.script.IpFieldScript;
45-
import org.elasticsearch.script.LongFieldScript;
46-
import org.elasticsearch.script.StringFieldScript;
4740
import org.elasticsearch.script.IngestScript;
4841
import org.elasticsearch.script.ScoreScript;
4942
import org.elasticsearch.script.ScriptContext;
5043
import org.elasticsearch.script.ScriptEngine;
44+
import org.elasticsearch.script.ScriptModule;
5145
import org.elasticsearch.script.ScriptService;
5246
import org.elasticsearch.search.aggregations.pipeline.MovingFunctionScript;
5347
import org.elasticsearch.threadpool.ThreadPool;
@@ -96,13 +90,10 @@ public final class PainlessPlugin extends Plugin implements ScriptPlugin, Extens
9690
map.put(IngestScript.CONTEXT, ingest);
9791

9892
// Functions available to runtime fields
99-
map.put(BooleanFieldScript.CONTEXT, getRuntimeFieldWhitelist("boolean"));
100-
map.put(DateFieldScript.CONTEXT, getRuntimeFieldWhitelist("date"));
101-
map.put(DoubleFieldScript.CONTEXT, getRuntimeFieldWhitelist("double"));
102-
map.put(LongFieldScript.CONTEXT, getRuntimeFieldWhitelist("long"));
103-
map.put(StringFieldScript.CONTEXT, getRuntimeFieldWhitelist("string"));
104-
map.put(GeoPointFieldScript.CONTEXT, getRuntimeFieldWhitelist("geopoint"));
105-
map.put(IpFieldScript.CONTEXT, getRuntimeFieldWhitelist("ip"));
93+
94+
for (ScriptContext<?> scriptContext : ScriptModule.RUNTIME_FIELDS_CONTEXTS) {
95+
map.put(scriptContext, getRuntimeFieldWhitelist(scriptContext.name));
96+
}
10697

10798
// Execute context gets everything
10899
List<Whitelist> test = new ArrayList<>(Whitelist.BASE_WHITELISTS);
@@ -115,10 +106,10 @@ public final class PainlessPlugin extends Plugin implements ScriptPlugin, Extens
115106
whitelists = map;
116107
}
117108

118-
private static List<Whitelist> getRuntimeFieldWhitelist(String fieldType) {
109+
private static List<Whitelist> getRuntimeFieldWhitelist(String contextName) {
119110
List<Whitelist> scriptField = new ArrayList<>(Whitelist.BASE_WHITELISTS);
120111
Whitelist whitelist = WhitelistLoader.loadFromResourceFiles(Whitelist.class,
121-
"org.elasticsearch.script." + fieldType + ".txt");
112+
"org.elasticsearch.script." + contextName + ".txt");
122113
scriptField.add(whitelist);
123114
return scriptField;
124115
}

modules/lang-painless/src/main/java/org/elasticsearch/painless/action/PainlessExecuteAction.java

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -71,13 +71,16 @@
7171
import org.elasticsearch.script.ScoreScript;
7272
import org.elasticsearch.script.Script;
7373
import org.elasticsearch.script.ScriptContext;
74+
import org.elasticsearch.script.ScriptModule;
7475
import org.elasticsearch.script.ScriptService;
7576
import org.elasticsearch.script.ScriptType;
7677
import org.elasticsearch.script.StringFieldScript;
7778
import org.elasticsearch.threadpool.ThreadPool;
7879
import org.elasticsearch.transport.TransportService;
7980

8081
import java.io.IOException;
82+
import java.util.Collections;
83+
import java.util.HashMap;
8184
import java.util.List;
8285
import java.util.Map;
8386
import java.util.Objects;
@@ -110,18 +113,18 @@ public static class Request extends SingleShardRequest<Request> implements ToXCo
110113
PARSER.declareObject(ConstructingObjectParser.optionalConstructorArg(), ContextSetup::parse, CONTEXT_SETUP_FIELD);
111114
}
112115

113-
static final Map<String, ScriptContext<?>> SUPPORTED_CONTEXTS = Map.of(
114-
"painless_test", PainlessTestScript.CONTEXT,
115-
"filter", FilterScript.CONTEXT,
116-
"score", ScoreScript.CONTEXT,
117-
"boolean_field", BooleanFieldScript.CONTEXT,
118-
"date_field", DateFieldScript.CONTEXT,
119-
"double_field", DoubleFieldScript.CONTEXT,
120-
"geo_point_field", GeoPointFieldScript.CONTEXT,
121-
"ip_field", IpFieldScript.CONTEXT,
122-
"long_field", LongFieldScript.CONTEXT,
123-
"string_field", StringFieldScript.CONTEXT)
124-
;
116+
private static Map<String, ScriptContext<?>> getSupportedContexts() {
117+
Map<String, ScriptContext<?>> contexts = new HashMap<>();
118+
contexts.put(PainlessTestScript.CONTEXT.name, PainlessTestScript.CONTEXT);
119+
contexts.put(FilterScript.CONTEXT.name, FilterScript.CONTEXT);
120+
contexts.put(ScoreScript.CONTEXT.name, ScoreScript.CONTEXT);
121+
for (ScriptContext<?> runtimeFieldsContext : ScriptModule.RUNTIME_FIELDS_CONTEXTS) {
122+
contexts.put(runtimeFieldsContext.name, runtimeFieldsContext);
123+
}
124+
return Collections.unmodifiableMap(contexts);
125+
}
126+
127+
static final Map<String, ScriptContext<?>> SUPPORTED_CONTEXTS = getSupportedContexts();
125128

126129
static ScriptContext<?> fromScriptContextName(String name) {
127130
ScriptContext<?> scriptContext = SUPPORTED_CONTEXTS.get(name);
@@ -541,15 +544,15 @@ static Response innerShardOperation(Request request, ScriptService scriptService
541544
return prepareRamIndex(request, (context, leafReaderContext) -> {
542545
BooleanFieldScript.Factory factory = scriptService.compile(request.script, BooleanFieldScript.CONTEXT);
543546
BooleanFieldScript.LeafFactory leafFactory =
544-
factory.newFactory("boolean_field", request.getScript().getParams(), context.lookup());
547+
factory.newFactory(BooleanFieldScript.CONTEXT.name, request.getScript().getParams(), context.lookup());
545548
BooleanFieldScript booleanFieldScript = leafFactory.newInstance(leafReaderContext);
546549
booleanFieldScript.runForDoc(0);
547550
return new Response(booleanFieldScript.asDocValues());
548551
}, indexService);
549552
} else if (scriptContext == DateFieldScript.CONTEXT) {
550553
return prepareRamIndex(request, (context, leafReaderContext) -> {
551554
DateFieldScript.Factory factory = scriptService.compile(request.script, DateFieldScript.CONTEXT);
552-
DateFieldScript.LeafFactory leafFactory = factory.newFactory("date_field",
555+
DateFieldScript.LeafFactory leafFactory = factory.newFactory(DateFieldScript.CONTEXT.name,
553556
request.getScript().getParams(), context.lookup(), DateFieldMapper.DEFAULT_DATE_TIME_FORMATTER);
554557
DateFieldScript dateFieldScript = leafFactory.newInstance(leafReaderContext);
555558
dateFieldScript.runForDoc(0);
@@ -559,7 +562,7 @@ static Response innerShardOperation(Request request, ScriptService scriptService
559562
return prepareRamIndex(request, (context, leafReaderContext) -> {
560563
DoubleFieldScript.Factory factory = scriptService.compile(request.script, DoubleFieldScript.CONTEXT);
561564
DoubleFieldScript.LeafFactory leafFactory =
562-
factory.newFactory("double_field", request.getScript().getParams(), context.lookup());
565+
factory.newFactory(DoubleFieldScript.CONTEXT.name, request.getScript().getParams(), context.lookup());
563566
DoubleFieldScript doubleFieldScript = leafFactory.newInstance(leafReaderContext);
564567
doubleFieldScript.runForDoc(0);
565568
return new Response(doubleFieldScript.asDocValues());
@@ -568,7 +571,7 @@ static Response innerShardOperation(Request request, ScriptService scriptService
568571
return prepareRamIndex(request, (context, leafReaderContext) -> {
569572
GeoPointFieldScript.Factory factory = scriptService.compile(request.script, GeoPointFieldScript.CONTEXT);
570573
GeoPointFieldScript.LeafFactory leafFactory =
571-
factory.newFactory("geo_point_field", request.getScript().getParams(), context.lookup());
574+
factory.newFactory(GeoPointFieldScript.CONTEXT.name, request.getScript().getParams(), context.lookup());
572575
GeoPointFieldScript geoPointFieldScript = leafFactory.newInstance(leafReaderContext);
573576
geoPointFieldScript.runForDoc(0);
574577
return new Response(geoPointFieldScript.asDocValues());
@@ -577,7 +580,7 @@ static Response innerShardOperation(Request request, ScriptService scriptService
577580
return prepareRamIndex(request, (context, leafReaderContext) -> {
578581
IpFieldScript.Factory factory = scriptService.compile(request.script, IpFieldScript.CONTEXT);
579582
IpFieldScript.LeafFactory leafFactory =
580-
factory.newFactory("ip_field", request.getScript().getParams(), context.lookup());
583+
factory.newFactory(IpFieldScript.CONTEXT.name, request.getScript().getParams(), context.lookup());
581584
IpFieldScript ipFieldScript = leafFactory.newInstance(leafReaderContext);
582585
ipFieldScript.runForDoc(0);
583586
return new Response(ipFieldScript.asDocValues());
@@ -586,7 +589,7 @@ static Response innerShardOperation(Request request, ScriptService scriptService
586589
return prepareRamIndex(request, (context, leafReaderContext) -> {
587590
LongFieldScript.Factory factory = scriptService.compile(request.script, LongFieldScript.CONTEXT);
588591
LongFieldScript.LeafFactory leafFactory =
589-
factory.newFactory("long_field", request.getScript().getParams(), context.lookup());
592+
factory.newFactory(LongFieldScript.CONTEXT.name, request.getScript().getParams(), context.lookup());
590593
LongFieldScript longFieldScript = leafFactory.newInstance(leafReaderContext);
591594
longFieldScript.runForDoc(0);
592595
return new Response(longFieldScript.asDocValues());
@@ -595,7 +598,7 @@ static Response innerShardOperation(Request request, ScriptService scriptService
595598
return prepareRamIndex(request, (context, leafReaderContext) -> {
596599
StringFieldScript.Factory factory = scriptService.compile(request.script, StringFieldScript.CONTEXT);
597600
StringFieldScript.LeafFactory leafFactory =
598-
factory.newFactory("string_field", request.getScript().getParams(), context.lookup());
601+
factory.newFactory(StringFieldScript.CONTEXT.name, request.getScript().getParams(), context.lookup());
599602
StringFieldScript stringFieldScript = leafFactory.newInstance(leafReaderContext);
600603
stringFieldScript.resultsForDoc(0);
601604
return new Response(stringFieldScript.asDocValues());

modules/runtime-fields-common/src/main/java/org/elasticsearch/runtimefields/RuntimeFieldsPainlessExtension.java

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,11 @@
1414
import org.elasticsearch.painless.spi.WhitelistLoader;
1515
import org.elasticsearch.painless.spi.annotation.CompileTimeOnlyAnnotation;
1616
import org.elasticsearch.script.AbstractFieldScript;
17-
import org.elasticsearch.script.BooleanFieldScript;
18-
import org.elasticsearch.script.DateFieldScript;
19-
import org.elasticsearch.script.DoubleFieldScript;
20-
import org.elasticsearch.script.GeoPointFieldScript;
21-
import org.elasticsearch.script.IpFieldScript;
22-
import org.elasticsearch.script.LongFieldScript;
23-
import org.elasticsearch.script.StringFieldScript;
2417
import org.elasticsearch.script.ScriptContext;
18+
import org.elasticsearch.script.ScriptModule;
2519

20+
import java.util.Collections;
21+
import java.util.HashMap;
2622
import java.util.List;
2723
import java.util.Map;
2824

@@ -55,14 +51,10 @@ public RuntimeFieldsPainlessExtension(RuntimeFieldsCommonPlugin plugin) {
5551

5652
@Override
5753
public Map<ScriptContext<?>, List<Whitelist>> getContextWhitelists() {
58-
return Map.ofEntries(
59-
Map.entry(BooleanFieldScript.CONTEXT, whitelists),
60-
Map.entry(DateFieldScript.CONTEXT, whitelists),
61-
Map.entry(DoubleFieldScript.CONTEXT, whitelists),
62-
Map.entry(GeoPointFieldScript.CONTEXT, whitelists),
63-
Map.entry(IpFieldScript.CONTEXT, whitelists),
64-
Map.entry(LongFieldScript.CONTEXT, whitelists),
65-
Map.entry(StringFieldScript.CONTEXT, whitelists)
66-
);
54+
Map<ScriptContext<?>, List<Whitelist>> whiteLists = new HashMap<>();
55+
for (ScriptContext<?> scriptContext : ScriptModule.RUNTIME_FIELDS_CONTEXTS) {
56+
whiteLists.put(scriptContext, whitelists);
57+
}
58+
return Collections.unmodifiableMap(whiteLists);
6759
}
6860
}

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

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import java.util.HashMap;
1919
import java.util.List;
2020
import java.util.Map;
21+
import java.util.Set;
2122
import java.util.function.Function;
2223
import java.util.stream.Collectors;
2324
import java.util.stream.Stream;
@@ -27,9 +28,12 @@
2728
*/
2829
public class ScriptModule {
2930

31+
public static final Set<ScriptContext<?>> RUNTIME_FIELDS_CONTEXTS = Set.of(BooleanFieldScript.CONTEXT, DateFieldScript.CONTEXT,
32+
DoubleFieldScript.CONTEXT, LongFieldScript.CONTEXT, StringFieldScript.CONTEXT, GeoPointFieldScript.CONTEXT, IpFieldScript.CONTEXT);
33+
3034
public static final Map<String, ScriptContext<?>> CORE_CONTEXTS;
3135
static {
32-
CORE_CONTEXTS = Stream.of(
36+
CORE_CONTEXTS = Stream.concat(Stream.of(
3337
FieldScript.CONTEXT,
3438
AggregationScript.CONTEXT,
3539
ScoreScript.CONTEXT,
@@ -52,15 +56,8 @@ public class ScriptModule {
5256
ScriptedMetricAggContexts.MapScript.CONTEXT,
5357
ScriptedMetricAggContexts.CombineScript.CONTEXT,
5458
ScriptedMetricAggContexts.ReduceScript.CONTEXT,
55-
IntervalFilterScript.CONTEXT,
56-
BooleanFieldScript.CONTEXT,
57-
DateFieldScript.CONTEXT,
58-
DoubleFieldScript.CONTEXT,
59-
GeoPointFieldScript.CONTEXT,
60-
IpFieldScript.CONTEXT,
61-
LongFieldScript.CONTEXT,
62-
StringFieldScript.CONTEXT
63-
).collect(Collectors.toMap(c -> c.name, Function.identity()));
59+
IntervalFilterScript.CONTEXT
60+
), RUNTIME_FIELDS_CONTEXTS.stream()).collect(Collectors.toMap(c -> c.name, Function.identity()));
6461
}
6562

6663
public final Map<String, ScriptEngine> engines;

0 commit comments

Comments
 (0)