Skip to content

Commit 4d04199

Browse files
authored
Unify supported runtime fields script contexts (elastic#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 7f57a31 commit 4d04199

File tree

11 files changed

+42
-64
lines changed

11 files changed

+42
-64
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: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@
7272
import org.elasticsearch.script.ScoreScript;
7373
import org.elasticsearch.script.Script;
7474
import org.elasticsearch.script.ScriptContext;
75+
import org.elasticsearch.script.ScriptModule;
7576
import org.elasticsearch.script.ScriptService;
7677
import org.elasticsearch.script.ScriptType;
7778
import org.elasticsearch.script.StringFieldScript;
@@ -115,23 +116,19 @@ public static class Request extends SingleShardRequest<Request> implements ToXCo
115116
PARSER.declareObject(ConstructingObjectParser.optionalConstructorArg(), ContextSetup::parse, CONTEXT_SETUP_FIELD);
116117
}
117118

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

130+
static final Map<String, ScriptContext<?>> SUPPORTED_CONTEXTS = getSupportedContexts();
131+
135132
static ScriptContext<?> fromScriptContextName(String name) {
136133
ScriptContext<?> scriptContext = SUPPORTED_CONTEXTS.get(name);
137134
if (scriptContext == null) {
@@ -561,15 +558,15 @@ static Response innerShardOperation(Request request, ScriptService scriptService
561558
return prepareRamIndex(request, (context, leafReaderContext) -> {
562559
BooleanFieldScript.Factory factory = scriptService.compile(request.script, BooleanFieldScript.CONTEXT);
563560
BooleanFieldScript.LeafFactory leafFactory =
564-
factory.newFactory("boolean_field", request.getScript().getParams(), context.lookup());
561+
factory.newFactory(BooleanFieldScript.CONTEXT.name, request.getScript().getParams(), context.lookup());
565562
BooleanFieldScript booleanFieldScript = leafFactory.newInstance(leafReaderContext);
566563
booleanFieldScript.runForDoc(0);
567564
return new Response(booleanFieldScript.asDocValues());
568565
}, indexService);
569566
} else if (scriptContext == DateFieldScript.CONTEXT) {
570567
return prepareRamIndex(request, (context, leafReaderContext) -> {
571568
DateFieldScript.Factory factory = scriptService.compile(request.script, DateFieldScript.CONTEXT);
572-
DateFieldScript.LeafFactory leafFactory = factory.newFactory("date_field",
569+
DateFieldScript.LeafFactory leafFactory = factory.newFactory(DateFieldScript.CONTEXT.name,
573570
request.getScript().getParams(), context.lookup(), DateFieldMapper.DEFAULT_DATE_TIME_FORMATTER);
574571
DateFieldScript dateFieldScript = leafFactory.newInstance(leafReaderContext);
575572
dateFieldScript.runForDoc(0);
@@ -579,7 +576,7 @@ static Response innerShardOperation(Request request, ScriptService scriptService
579576
return prepareRamIndex(request, (context, leafReaderContext) -> {
580577
DoubleFieldScript.Factory factory = scriptService.compile(request.script, DoubleFieldScript.CONTEXT);
581578
DoubleFieldScript.LeafFactory leafFactory =
582-
factory.newFactory("double_field", request.getScript().getParams(), context.lookup());
579+
factory.newFactory(DoubleFieldScript.CONTEXT.name, request.getScript().getParams(), context.lookup());
583580
DoubleFieldScript doubleFieldScript = leafFactory.newInstance(leafReaderContext);
584581
doubleFieldScript.runForDoc(0);
585582
return new Response(doubleFieldScript.asDocValues());
@@ -588,7 +585,7 @@ static Response innerShardOperation(Request request, ScriptService scriptService
588585
return prepareRamIndex(request, (context, leafReaderContext) -> {
589586
GeoPointFieldScript.Factory factory = scriptService.compile(request.script, GeoPointFieldScript.CONTEXT);
590587
GeoPointFieldScript.LeafFactory leafFactory =
591-
factory.newFactory("geo_point_field", request.getScript().getParams(), context.lookup());
588+
factory.newFactory(GeoPointFieldScript.CONTEXT.name, request.getScript().getParams(), context.lookup());
592589
GeoPointFieldScript geoPointFieldScript = leafFactory.newInstance(leafReaderContext);
593590
geoPointFieldScript.runForDoc(0);
594591
return new Response(geoPointFieldScript.asDocValues());
@@ -597,7 +594,7 @@ static Response innerShardOperation(Request request, ScriptService scriptService
597594
return prepareRamIndex(request, (context, leafReaderContext) -> {
598595
IpFieldScript.Factory factory = scriptService.compile(request.script, IpFieldScript.CONTEXT);
599596
IpFieldScript.LeafFactory leafFactory =
600-
factory.newFactory("ip_field", request.getScript().getParams(), context.lookup());
597+
factory.newFactory(IpFieldScript.CONTEXT.name, request.getScript().getParams(), context.lookup());
601598
IpFieldScript ipFieldScript = leafFactory.newInstance(leafReaderContext);
602599
ipFieldScript.runForDoc(0);
603600
return new Response(ipFieldScript.asDocValues());
@@ -606,7 +603,7 @@ static Response innerShardOperation(Request request, ScriptService scriptService
606603
return prepareRamIndex(request, (context, leafReaderContext) -> {
607604
LongFieldScript.Factory factory = scriptService.compile(request.script, LongFieldScript.CONTEXT);
608605
LongFieldScript.LeafFactory leafFactory =
609-
factory.newFactory("long_field", request.getScript().getParams(), context.lookup());
606+
factory.newFactory(LongFieldScript.CONTEXT.name, request.getScript().getParams(), context.lookup());
610607
LongFieldScript longFieldScript = leafFactory.newInstance(leafReaderContext);
611608
longFieldScript.runForDoc(0);
612609
return new Response(longFieldScript.asDocValues());
@@ -615,7 +612,7 @@ static Response innerShardOperation(Request request, ScriptService scriptService
615612
return prepareRamIndex(request, (context, leafReaderContext) -> {
616613
StringFieldScript.Factory factory = scriptService.compile(request.script, StringFieldScript.CONTEXT);
617614
StringFieldScript.LeafFactory leafFactory =
618-
factory.newFactory("string_field", request.getScript().getParams(), context.lookup());
615+
factory.newFactory(StringFieldScript.CONTEXT.name, request.getScript().getParams(), context.lookup());
619616
StringFieldScript stringFieldScript = leafFactory.newInstance(leafReaderContext);
620617
stringFieldScript.resultsForDoc(0);
621618
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 org.elasticsearch.common.collect.Map.ofEntries(
59-
org.elasticsearch.common.collect.Map.entry(BooleanFieldScript.CONTEXT, whitelists),
60-
org.elasticsearch.common.collect.Map.entry(DateFieldScript.CONTEXT, whitelists),
61-
org.elasticsearch.common.collect.Map.entry(DoubleFieldScript.CONTEXT, whitelists),
62-
org.elasticsearch.common.collect.Map.entry(GeoPointFieldScript.CONTEXT, whitelists),
63-
org.elasticsearch.common.collect.Map.entry(IpFieldScript.CONTEXT, whitelists),
64-
org.elasticsearch.common.collect.Map.entry(LongFieldScript.CONTEXT, whitelists),
65-
org.elasticsearch.common.collect.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: 8 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,13 @@
2728
*/
2829
public class ScriptModule {
2930

31+
public static final Set<ScriptContext<?>> RUNTIME_FIELDS_CONTEXTS = org.elasticsearch.common.collect.Set.of(BooleanFieldScript.CONTEXT,
32+
DateFieldScript.CONTEXT, DoubleFieldScript.CONTEXT, LongFieldScript.CONTEXT, StringFieldScript.CONTEXT, GeoPointFieldScript.CONTEXT,
33+
IpFieldScript.CONTEXT);
34+
3035
public static final Map<String, ScriptContext<?>> CORE_CONTEXTS;
3136
static {
32-
CORE_CONTEXTS = Stream.of(
37+
CORE_CONTEXTS = Stream.concat(Stream.of(
3338
FieldScript.CONTEXT,
3439
AggregationScript.CONTEXT,
3540
ScoreScript.CONTEXT,
@@ -52,15 +57,8 @@ public class ScriptModule {
5257
ScriptedMetricAggContexts.MapScript.CONTEXT,
5358
ScriptedMetricAggContexts.CombineScript.CONTEXT,
5459
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()));
60+
IntervalFilterScript.CONTEXT
61+
), RUNTIME_FIELDS_CONTEXTS.stream()).collect(Collectors.toMap(c -> c.name, Function.identity()));
6462
}
6563

6664
public final Map<String, ScriptEngine> engines;

0 commit comments

Comments
 (0)