Skip to content

Commit cd721b6

Browse files
authored
Scripting: ScriptFactory not required by compile (#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: #49466
1 parent 56cb357 commit cd721b6

File tree

33 files changed

+160
-105
lines changed

33 files changed

+160
-105
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

+56-7
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

@@ -85,22 +84,72 @@ public boolean execute() {
8584
},
8685

8786
FilterScript.CONTEXT,
88-
(Expression expr) -> (FilterScript.Factory) (p, lookup) -> newFilterScript(expr, lookup, p),
87+
(Expression expr) -> new FilterScript.Factory() {
88+
@Override
89+
public boolean isResultDeterministic() {
90+
return true;
91+
}
92+
93+
@Override
94+
public FilterScript.LeafFactory newFactory(Map<String, Object> params, SearchLookup lookup) {
95+
return newFilterScript(expr, lookup, params);
96+
}
97+
},
8998

9099
ScoreScript.CONTEXT,
91-
(Expression expr) -> (ScoreScript.Factory) (p, lookup) -> newScoreScript(expr, lookup, p),
100+
(Expression expr) -> new ScoreScript.Factory() {
101+
@Override
102+
public ScoreScript.LeafFactory newFactory(Map<String, Object> params, SearchLookup lookup) {
103+
return newScoreScript(expr, lookup, params);
104+
}
105+
106+
@Override
107+
public boolean isResultDeterministic() {
108+
return true;
109+
}
110+
},
92111

93112
TermsSetQueryScript.CONTEXT,
94113
(Expression expr) -> (TermsSetQueryScript.Factory) (p, lookup) -> newTermsSetQueryScript(expr, lookup, p),
95114

96115
AggregationScript.CONTEXT,
97-
(Expression expr) -> (AggregationScript.Factory) (p, lookup) -> newAggregationScript(expr, lookup, p),
116+
(Expression expr) -> new AggregationScript.Factory() {
117+
@Override
118+
public AggregationScript.LeafFactory newFactory(Map<String, Object> params, SearchLookup lookup) {
119+
return newAggregationScript(expr, lookup, params);
120+
}
121+
122+
@Override
123+
public boolean isResultDeterministic() {
124+
return true;
125+
}
126+
},
98127

99128
NumberSortScript.CONTEXT,
100-
(Expression expr) -> (NumberSortScript.Factory) (p, lookup) -> newSortScript(expr, lookup, p),
129+
(Expression expr) -> new NumberSortScript.Factory() {
130+
@Override
131+
public NumberSortScript.LeafFactory newFactory(Map<String, Object> params, SearchLookup lookup) {
132+
return newSortScript(expr, lookup, params);
133+
}
134+
135+
@Override
136+
public boolean isResultDeterministic() {
137+
return true;
138+
}
139+
},
101140

102141
FieldScript.CONTEXT,
103-
(Expression expr) -> (FieldScript.Factory) (p, lookup) -> newFieldScript(expr, lookup, p)
142+
(Expression expr) -> new FieldScript.Factory() {
143+
@Override
144+
public FieldScript.LeafFactory newFactory(Map<String, Object> params, SearchLookup lookup) {
145+
return newFieldScript(expr, lookup, params);
146+
}
147+
148+
@Override
149+
public boolean isResultDeterministic() {
150+
return true;
151+
}
152+
}
104153
);
105154

106155
@Override
@@ -109,7 +158,7 @@ public String getType() {
109158
}
110159

111160
@Override
112-
public <T extends ScriptFactory> T compile(
161+
public <T> T compile(
113162
String scriptName,
114163
String scriptSource,
115164
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
@@ -75,7 +75,6 @@
7575
import org.elasticsearch.script.ScoreScript;
7676
import org.elasticsearch.script.Script;
7777
import org.elasticsearch.script.ScriptContext;
78-
import org.elasticsearch.script.ScriptFactory;
7978
import org.elasticsearch.script.ScriptService;
8079
import org.elasticsearch.script.ScriptType;
8180
import org.elasticsearch.threadpool.ThreadPool;
@@ -416,7 +415,7 @@ public Map<String, Object> getParams() {
416415

417416
public abstract Object execute();
418417

419-
public interface Factory extends ScriptFactory {
418+
public interface Factory {
420419

421420
PainlessTestScript newInstance(Map<String, Object> params);
422421

0 commit comments

Comments
 (0)