Skip to content

Commit 4249af9

Browse files
committed
Scripting: ScriptFactory not required by compile (elastic#50344)
Avoid backwards incompatible changes for 8.x and 7.6 by removing type restriction on compile and Factory. Factories may optionally implement ScriptFactory. If so, then they can indicate determinism and thus cacheability. Relates: elastic#49466
1 parent 9033052 commit 4249af9

File tree

33 files changed

+162
-107
lines changed

33 files changed

+162
-107
lines changed

modules/analysis-common/src/main/java/org/elasticsearch/analysis/common/AnalysisPredicateScript.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
import org.apache.lucene.analysis.tokenattributes.TypeAttribute;
2828
import org.apache.lucene.util.AttributeSource;
2929
import org.elasticsearch.script.ScriptContext;
30-
import org.elasticsearch.script.ScriptFactory;
3130

3231
/**
3332
* A predicate based on the current token in a TokenStream
@@ -108,7 +107,7 @@ public boolean isKeyword() {
108107
*/
109108
public abstract boolean execute(Token token);
110109

111-
public interface Factory extends ScriptFactory {
110+
public interface Factory {
112111
AnalysisPredicateScript newInstance();
113112
}
114113

modules/analysis-common/src/test/java/org/elasticsearch/analysis/common/PredicateTokenScriptFilterTests.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import org.elasticsearch.indices.analysis.AnalysisModule;
3131
import org.elasticsearch.script.Script;
3232
import org.elasticsearch.script.ScriptContext;
33-
import org.elasticsearch.script.ScriptFactory;
3433
import org.elasticsearch.script.ScriptService;
3534
import org.elasticsearch.test.ESTokenStreamTestCase;
3635
import org.elasticsearch.test.IndexSettingsModule;
@@ -64,7 +63,7 @@ public boolean execute(Token token) {
6463
@SuppressWarnings("unchecked")
6564
ScriptService scriptService = new ScriptService(indexSettings, Collections.emptyMap(), Collections.emptyMap()){
6665
@Override
67-
public <FactoryType extends ScriptFactory> FactoryType compile(Script script, ScriptContext<FactoryType> context) {
66+
public <FactoryType> FactoryType compile(Script script, ScriptContext<FactoryType> context) {
6867
assertEquals(context, AnalysisPredicateScript.CONTEXT);
6968
assertEquals(new Script("my_script"), script);
7069
return (FactoryType) factory;

modules/analysis-common/src/test/java/org/elasticsearch/analysis/common/ScriptedConditionTokenFilterTests.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import org.elasticsearch.indices.analysis.AnalysisModule;
3131
import org.elasticsearch.script.Script;
3232
import org.elasticsearch.script.ScriptContext;
33-
import org.elasticsearch.script.ScriptFactory;
3433
import org.elasticsearch.script.ScriptService;
3534
import org.elasticsearch.test.ESTokenStreamTestCase;
3635
import org.elasticsearch.test.IndexSettingsModule;
@@ -64,7 +63,7 @@ public boolean execute(Token token) {
6463
@SuppressWarnings("unchecked")
6564
ScriptService scriptService = new ScriptService(indexSettings, Collections.emptyMap(), Collections.emptyMap()){
6665
@Override
67-
public <FactoryType extends ScriptFactory> FactoryType compile(Script script, ScriptContext<FactoryType> context) {
66+
public <FactoryType> FactoryType compile(Script script, ScriptContext<FactoryType> context) {
6867
assertEquals(context, AnalysisPredicateScript.CONTEXT);
6968
assertEquals(new Script("token.getPosition() > 1"), script);
7069
return (FactoryType) factory;

modules/lang-expression/src/main/java/org/elasticsearch/script/expression/ExpressionScriptEngine.java

+58-9
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@
4444
import org.elasticsearch.script.ScriptContext;
4545
import org.elasticsearch.script.ScriptEngine;
4646
import org.elasticsearch.script.ScriptException;
47-
import org.elasticsearch.script.ScriptFactory;
4847
import org.elasticsearch.script.TermsSetQueryScript;
4948
import org.elasticsearch.search.lookup.SearchLookup;
5049

@@ -88,33 +87,83 @@ public boolean execute() {
8887
return wrappedFactory; });
8988

9089
contexts.put(FilterScript.CONTEXT,
91-
(Expression expr) -> (FilterScript.Factory) (p, lookup) -> newFilterScript(expr, lookup, p));
90+
(Expression expr) -> new FilterScript.Factory() {
91+
@Override
92+
public boolean isResultDeterministic() {
93+
return true;
94+
}
95+
96+
@Override
97+
public FilterScript.LeafFactory newFactory(Map<String, Object> params, SearchLookup lookup) {
98+
return newFilterScript(expr, lookup, params);
99+
}
100+
});
92101

93102
contexts.put(ScoreScript.CONTEXT,
94-
(Expression expr) -> (ScoreScript.Factory) (p, lookup) -> newScoreScript(expr, lookup, p));
103+
(Expression expr) -> new ScoreScript.Factory() {
104+
@Override
105+
public ScoreScript.LeafFactory newFactory(Map<String, Object> params, SearchLookup lookup) {
106+
return newScoreScript(expr, lookup, params);
107+
}
108+
109+
@Override
110+
public boolean isResultDeterministic() {
111+
return true;
112+
}
113+
});
95114

96115
contexts.put(TermsSetQueryScript.CONTEXT,
97116
(Expression expr) -> (TermsSetQueryScript.Factory) (p, lookup) -> newTermsSetQueryScript(expr, lookup, p));
98117

99118
contexts.put(AggregationScript.CONTEXT,
100-
(Expression expr) -> (AggregationScript.Factory) (p, lookup) -> newAggregationScript(expr, lookup, p));
119+
(Expression expr) -> new AggregationScript.Factory() {
120+
@Override
121+
public AggregationScript.LeafFactory newFactory(Map<String, Object> params, SearchLookup lookup) {
122+
return newAggregationScript(expr, lookup, params);
123+
}
124+
125+
@Override
126+
public boolean isResultDeterministic() {
127+
return true;
128+
}
129+
});
101130

102131
contexts.put(NumberSortScript.CONTEXT,
103-
(Expression expr) -> (NumberSortScript.Factory) (p, lookup) -> newSortScript(expr, lookup, p));
132+
(Expression expr) -> new NumberSortScript.Factory() {
133+
@Override
134+
public NumberSortScript.LeafFactory newFactory(Map<String, Object> params, SearchLookup lookup) {
135+
return newSortScript(expr, lookup, params);
136+
}
137+
138+
@Override
139+
public boolean isResultDeterministic() {
140+
return true;
141+
}
142+
});
104143

105144
contexts.put(FieldScript.CONTEXT,
106-
(Expression expr) -> (FieldScript.Factory) (p, lookup) -> newFieldScript(expr, lookup, p));
145+
(Expression expr) -> new FieldScript.Factory() {
146+
@Override
147+
public FieldScript.LeafFactory newFactory(Map<String, Object> params, SearchLookup lookup) {
148+
return newFieldScript(expr, lookup, params);
149+
}
107150

108-
ExpressionScriptEngine.contexts = Collections.unmodifiableMap(contexts);
109-
}
151+
@Override
152+
public boolean isResultDeterministic() {
153+
return true;
154+
}
155+
});
156+
157+
ExpressionScriptEngine.contexts = Collections.unmodifiableMap(contexts);
158+
}
110159

111160
@Override
112161
public String getType() {
113162
return NAME;
114163
}
115164

116165
@Override
117-
public <T extends ScriptFactory> T compile(
166+
public <T> T compile(
118167
String scriptName,
119168
String scriptSource,
120169
ScriptContext<T> context,

modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/MustacheScriptEngine.java

+2-4
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,8 @@
2121
import com.github.mustachejava.Mustache;
2222
import com.github.mustachejava.MustacheException;
2323
import com.github.mustachejava.MustacheFactory;
24-
25-
import org.apache.logging.log4j.Logger;
2624
import org.apache.logging.log4j.LogManager;
25+
import org.apache.logging.log4j.Logger;
2726
import org.apache.logging.log4j.message.ParameterizedMessage;
2827
import org.apache.logging.log4j.util.Supplier;
2928
import org.elasticsearch.SpecialPermission;
@@ -32,7 +31,6 @@
3231
import org.elasticsearch.script.ScriptContext;
3332
import org.elasticsearch.script.ScriptEngine;
3433
import org.elasticsearch.script.ScriptException;
35-
import org.elasticsearch.script.ScriptFactory;
3634
import org.elasticsearch.script.TemplateScript;
3735

3836
import java.io.Reader;
@@ -65,7 +63,7 @@ public final class MustacheScriptEngine implements ScriptEngine {
6563
* @return a compiled template object for later execution.
6664
* */
6765
@Override
68-
public <T extends ScriptFactory> T compile(
66+
public <T> T compile(
6967
String templateName,
7068
String templateSource,
7169
ScriptContext<T> context,

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

+3-4
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
import org.elasticsearch.script.ScriptContext;
2929
import org.elasticsearch.script.ScriptEngine;
3030
import org.elasticsearch.script.ScriptException;
31-
import org.elasticsearch.script.ScriptFactory;
3231
import org.objectweb.asm.ClassWriter;
3332
import org.objectweb.asm.Opcodes;
3433
import org.objectweb.asm.Type;
@@ -123,7 +122,7 @@ public String getType() {
123122
}
124123

125124
@Override
126-
public <T extends ScriptFactory> T compile(
125+
public <T> T compile(
127126
String scriptName,
128127
String scriptSource,
129128
ScriptContext<T> context,
@@ -169,7 +168,7 @@ public Set<ScriptContext<?>> getSupportedContexts() {
169168
* @param <T> The factory class.
170169
* @return A factory class that will return script instances.
171170
*/
172-
private <T extends ScriptFactory> Type generateStatefulFactory(
171+
private <T> Type generateStatefulFactory(
173172
Loader loader,
174173
ScriptContext<T> context,
175174
Set<String> extractedVariables
@@ -275,7 +274,7 @@ private <T extends ScriptFactory> Type generateStatefulFactory(
275274
* @param <T> The factory class.
276275
* @return A factory class that will return script instances.
277276
*/
278-
private <T extends ScriptFactory> T generateFactory(
277+
private <T> T generateFactory(
279278
Loader loader,
280279
ScriptContext<T> context,
281280
Set<String> extractedVariables,

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

+1-2
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,6 @@
7676
import org.elasticsearch.script.ScoreScript;
7777
import org.elasticsearch.script.Script;
7878
import org.elasticsearch.script.ScriptContext;
79-
import org.elasticsearch.script.ScriptFactory;
8079
import org.elasticsearch.script.ScriptService;
8180
import org.elasticsearch.script.ScriptType;
8281
import org.elasticsearch.threadpool.ThreadPool;
@@ -435,7 +434,7 @@ public Map<String, Object> getParams() {
435434

436435
public abstract Object execute();
437436

438-
public interface Factory extends ScriptFactory {
437+
public interface Factory {
439438

440439
PainlessTestScript newInstance(Map<String, Object> params);
441440

0 commit comments

Comments
 (0)