|
@@ -62,11 +62,22 @@ public class MockScriptEngine implements ScriptEngine {
|
|
|
public static final String NAME = "mockscript";
|
|
|
|
|
|
private final String type;
|
|
|
- private final Map<String, Function<Map<String, Object>, Object>> scripts;
|
|
|
+ private final Map<String, MockDeterministicScript> scripts;
|
|
|
private final Map<ScriptContext<?>, ContextCompiler> contexts;
|
|
|
|
|
|
public MockScriptEngine(String type, Map<String, Function<Map<String, Object>, Object>> scripts,
|
|
|
Map<ScriptContext<?>, ContextCompiler> contexts) {
|
|
|
+ this(type, scripts, Collections.emptyMap(), contexts);
|
|
|
+ }
|
|
|
+
|
|
|
+ public MockScriptEngine(String type, Map<String, Function<Map<String, Object>, Object>> deterministicScripts,
|
|
|
+ Map<String, Function<Map<String, Object>, Object>> nonDeterministicScripts,
|
|
|
+ Map<ScriptContext<?>, ContextCompiler> contexts) {
|
|
|
+
|
|
|
+ Map<String, MockDeterministicScript> scripts = new HashMap<>(deterministicScripts.size() + nonDeterministicScripts.size());
|
|
|
+ deterministicScripts.forEach((key, value) -> scripts.put(key, MockDeterministicScript.asDeterministic(value)));
|
|
|
+ nonDeterministicScripts.forEach((key, value) -> scripts.put(key, MockDeterministicScript.asNonDeterministic(value)));
|
|
|
+
|
|
|
this.type = type;
|
|
|
this.scripts = Collections.unmodifiableMap(scripts);
|
|
|
this.contexts = Collections.unmodifiableMap(contexts);
|
|
@@ -85,34 +96,14 @@ public class MockScriptEngine implements ScriptEngine {
|
|
|
public <T extends ScriptFactory> T compile(String name, String source, ScriptContext<T> context, Map<String, String> params) {
|
|
|
// Scripts are always resolved using the script's source. For inline scripts, it's easy because they don't have names and the
|
|
|
// source is always provided. For stored and file scripts, the source of the script must match the key of a predefined script.
|
|
|
- Function<Map<String, Object>, Object> script = scripts.get(source);
|
|
|
+ MockDeterministicScript script = scripts.get(source);
|
|
|
if (script == null) {
|
|
|
throw new IllegalArgumentException("No pre defined script matching [" + source + "] for script with name [" + name + "], " +
|
|
|
"did you declare the mocked script?");
|
|
|
}
|
|
|
MockCompiledScript mockCompiled = new MockCompiledScript(name, params, source, script);
|
|
|
if (context.instanceClazz.equals(FieldScript.class)) {
|
|
|
- FieldScript.Factory factory = (parameters, lookup) ->
|
|
|
- ctx -> new FieldScript(parameters, lookup, ctx) {
|
|
|
- @Override
|
|
|
- public Object execute() {
|
|
|
- Map<String, Object> vars = createVars(parameters);
|
|
|
- vars.putAll(getLeafLookup().asMap());
|
|
|
- return script.apply(vars);
|
|
|
- }
|
|
|
- };
|
|
|
- return context.factoryClazz.cast(factory);
|
|
|
- } else if (context.instanceClazz.equals(FieldScript.class)) {
|
|
|
- FieldScript.Factory factory = (parameters, lookup) ->
|
|
|
- ctx -> new FieldScript(parameters, lookup, ctx) {
|
|
|
- @Override
|
|
|
- public Object execute() {
|
|
|
- Map<String, Object> vars = createVars(parameters);
|
|
|
- vars.putAll(getLeafLookup().asMap());
|
|
|
- return script.apply(vars);
|
|
|
- }
|
|
|
- };
|
|
|
- return context.factoryClazz.cast(factory);
|
|
|
+ return context.factoryClazz.cast(new MockFieldScriptFactory(script));
|
|
|
} else if(context.instanceClazz.equals(TermsSetQueryScript.class)) {
|
|
|
TermsSetQueryScript.Factory factory = (parameters, lookup) -> (TermsSetQueryScript.LeafFactory) ctx
|
|
|
-> new TermsSetQueryScript(parameters, lookup, ctx) {
|
|
@@ -147,17 +138,7 @@ public class MockScriptEngine implements ScriptEngine {
|
|
|
};
|
|
|
return context.factoryClazz.cast(factory);
|
|
|
} else if (context.instanceClazz.equals(StringSortScript.class)) {
|
|
|
- StringSortScript.Factory factory = (parameters, lookup) -> (StringSortScript.LeafFactory) ctx
|
|
|
- -> new StringSortScript(parameters, lookup, ctx) {
|
|
|
- @Override
|
|
|
- public String execute() {
|
|
|
- Map<String, Object> vars = new HashMap<>(parameters);
|
|
|
- vars.put("params", parameters);
|
|
|
- vars.put("doc", getDoc());
|
|
|
- return String.valueOf(script.apply(vars));
|
|
|
- }
|
|
|
- };
|
|
|
- return context.factoryClazz.cast(factory);
|
|
|
+ return context.factoryClazz.cast(new MockStringSortScriptFactory(script));
|
|
|
} else if (context.instanceClazz.equals(IngestScript.class)) {
|
|
|
IngestScript.Factory factory = vars -> new IngestScript(vars) {
|
|
|
@Override
|
|
@@ -167,37 +148,7 @@ public class MockScriptEngine implements ScriptEngine {
|
|
|
};
|
|
|
return context.factoryClazz.cast(factory);
|
|
|
} else if(context.instanceClazz.equals(AggregationScript.class)) {
|
|
|
- AggregationScript.Factory factory = (parameters, lookup) -> new AggregationScript.LeafFactory() {
|
|
|
- @Override
|
|
|
- public AggregationScript newInstance(final LeafReaderContext ctx) {
|
|
|
- return new AggregationScript(parameters, lookup, ctx) {
|
|
|
- @Override
|
|
|
- public Object execute() {
|
|
|
- Map<String, Object> vars = new HashMap<>(parameters);
|
|
|
- vars.put("params", parameters);
|
|
|
- vars.put("doc", getDoc());
|
|
|
- vars.put("_score", get_score());
|
|
|
- vars.put("_value", get_value());
|
|
|
- return script.apply(vars);
|
|
|
- }
|
|
|
- };
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public boolean needs_score() {
|
|
|
- return true;
|
|
|
- }
|
|
|
- };
|
|
|
- return context.factoryClazz.cast(factory);
|
|
|
- } else if (context.instanceClazz.equals(IngestScript.class)) {
|
|
|
- IngestScript.Factory factory = vars ->
|
|
|
- new IngestScript(vars) {
|
|
|
- @Override
|
|
|
- public void execute(Map<String, Object> ctx) {
|
|
|
- script.apply(ctx);
|
|
|
- }
|
|
|
- };
|
|
|
- return context.factoryClazz.cast(factory);
|
|
|
+ return context.factoryClazz.cast(new MockAggregationScript(script));
|
|
|
} else if (context.instanceClazz.equals(IngestConditionalScript.class)) {
|
|
|
IngestConditionalScript.Factory factory = parameters -> new IngestConditionalScript(parameters) {
|
|
|
@Override
|
|
@@ -240,13 +191,7 @@ public class MockScriptEngine implements ScriptEngine {
|
|
|
};
|
|
|
return context.factoryClazz.cast(factory);
|
|
|
} else if (context.instanceClazz.equals(SignificantTermsHeuristicScoreScript.class)) {
|
|
|
- SignificantTermsHeuristicScoreScript.Factory factory = () -> new SignificantTermsHeuristicScoreScript() {
|
|
|
- @Override
|
|
|
- public double execute(Map<String, Object> vars) {
|
|
|
- return ((Number) script.apply(vars)).doubleValue();
|
|
|
- }
|
|
|
- };
|
|
|
- return context.factoryClazz.cast(factory);
|
|
|
+ return context.factoryClazz.cast(new MockSignificantTermsHeuristicScoreScript(script));
|
|
|
} else if (context.instanceClazz.equals(TemplateScript.class)) {
|
|
|
TemplateScript.Factory factory = vars -> {
|
|
|
Map<String, Object> varsWithParams = new HashMap<>();
|
|
@@ -280,19 +225,19 @@ public class MockScriptEngine implements ScriptEngine {
|
|
|
};
|
|
|
return context.factoryClazz.cast(factory);
|
|
|
} else if (context.instanceClazz.equals(ScoreScript.class)) {
|
|
|
- ScoreScript.Factory factory = new MockScoreScript(script);
|
|
|
+ ScoreScript.Factory factory = new MockScoreScript(script::apply);
|
|
|
return context.factoryClazz.cast(factory);
|
|
|
} else if (context.instanceClazz.equals(ScriptedMetricAggContexts.InitScript.class)) {
|
|
|
- ScriptedMetricAggContexts.InitScript.Factory factory = mockCompiled::createMetricAggInitScript;
|
|
|
+ ScriptedMetricAggContexts.InitScript.Factory factory = new MockMetricAggInitScriptFactory(script);
|
|
|
return context.factoryClazz.cast(factory);
|
|
|
} else if (context.instanceClazz.equals(ScriptedMetricAggContexts.MapScript.class)) {
|
|
|
- ScriptedMetricAggContexts.MapScript.Factory factory = mockCompiled::createMetricAggMapScript;
|
|
|
+ ScriptedMetricAggContexts.MapScript.Factory factory = new MockMetricAggMapScriptFactory(script);
|
|
|
return context.factoryClazz.cast(factory);
|
|
|
} else if (context.instanceClazz.equals(ScriptedMetricAggContexts.CombineScript.class)) {
|
|
|
- ScriptedMetricAggContexts.CombineScript.Factory factory = mockCompiled::createMetricAggCombineScript;
|
|
|
+ ScriptedMetricAggContexts.CombineScript.Factory factory = new MockMetricAggCombineScriptFactory(script);
|
|
|
return context.factoryClazz.cast(factory);
|
|
|
} else if (context.instanceClazz.equals(ScriptedMetricAggContexts.ReduceScript.class)) {
|
|
|
- ScriptedMetricAggContexts.ReduceScript.Factory factory = mockCompiled::createMetricAggReduceScript;
|
|
|
+ ScriptedMetricAggContexts.ReduceScript.Factory factory = new MockMetricAggReduceScriptFactory(script);
|
|
|
return context.factoryClazz.cast(factory);
|
|
|
} else if (context.instanceClazz.equals(IntervalFilterScript.class)) {
|
|
|
IntervalFilterScript.Factory factory = mockCompiled::createIntervalFilterScript;
|
|
@@ -300,7 +245,7 @@ public class MockScriptEngine implements ScriptEngine {
|
|
|
}
|
|
|
ContextCompiler compiler = contexts.get(context);
|
|
|
if (compiler != null) {
|
|
|
- return context.factoryClazz.cast(compiler.compile(script, params));
|
|
|
+ return context.factoryClazz.cast(compiler.compile(script::apply, params));
|
|
|
}
|
|
|
throw new IllegalArgumentException("mock script engine does not know how to handle context [" + context.name + "]");
|
|
|
}
|
|
@@ -370,25 +315,6 @@ public class MockScriptEngine implements ScriptEngine {
|
|
|
return new MockSimilarityWeightScript(script != null ? script : ctx -> 42d);
|
|
|
}
|
|
|
|
|
|
- public ScriptedMetricAggContexts.InitScript createMetricAggInitScript(Map<String, Object> params, Map<String, Object> state) {
|
|
|
- return new MockMetricAggInitScript(params, state, script != null ? script : ctx -> 42d);
|
|
|
- }
|
|
|
-
|
|
|
- public ScriptedMetricAggContexts.MapScript.LeafFactory createMetricAggMapScript(Map<String, Object> params,
|
|
|
- Map<String, Object> state,
|
|
|
- SearchLookup lookup) {
|
|
|
- return new MockMetricAggMapScript(params, state, lookup, script != null ? script : ctx -> 42d);
|
|
|
- }
|
|
|
-
|
|
|
- public ScriptedMetricAggContexts.CombineScript createMetricAggCombineScript(Map<String, Object> params,
|
|
|
- Map<String, Object> state) {
|
|
|
- return new MockMetricAggCombineScript(params, state, script != null ? script : ctx -> 42d);
|
|
|
- }
|
|
|
-
|
|
|
- public ScriptedMetricAggContexts.ReduceScript createMetricAggReduceScript(Map<String, Object> params, List<Object> states) {
|
|
|
- return new MockMetricAggReduceScript(params, states, script != null ? script : ctx -> 42d);
|
|
|
- }
|
|
|
-
|
|
|
public IntervalFilterScript createIntervalFilterScript() {
|
|
|
return new IntervalFilterScript() {
|
|
|
@Override
|
|
@@ -469,6 +395,17 @@ public class MockScriptEngine implements ScriptEngine {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ public static class MockMetricAggInitScriptFactory implements ScriptedMetricAggContexts.InitScript.Factory, ScriptFactory {
|
|
|
+ private final MockDeterministicScript script;
|
|
|
+ MockMetricAggInitScriptFactory(MockDeterministicScript script) { this.script = script; }
|
|
|
+ @Override public boolean isResultDeterministic() { return script.isResultDeterministic(); }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ScriptedMetricAggContexts.InitScript newInstance(Map<String, Object> params, Map<String, Object> state) {
|
|
|
+ return new MockMetricAggInitScript(params, state, script);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
public static class MockMetricAggInitScript extends ScriptedMetricAggContexts.InitScript {
|
|
|
private final Function<Map<String, Object>, Object> script;
|
|
|
|
|
@@ -491,6 +428,18 @@ public class MockScriptEngine implements ScriptEngine {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ public static class MockMetricAggMapScriptFactory implements ScriptedMetricAggContexts.MapScript.Factory, ScriptFactory {
|
|
|
+ private final MockDeterministicScript script;
|
|
|
+ MockMetricAggMapScriptFactory(MockDeterministicScript script) { this.script = script; }
|
|
|
+ @Override public boolean isResultDeterministic() { return script.isResultDeterministic(); }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ScriptedMetricAggContexts.MapScript.LeafFactory newFactory(Map<String, Object> params, Map<String, Object> state,
|
|
|
+ SearchLookup lookup) {
|
|
|
+ return new MockMetricAggMapScript(params, state, lookup, script);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
public static class MockMetricAggMapScript implements ScriptedMetricAggContexts.MapScript.LeafFactory {
|
|
|
private final Map<String, Object> params;
|
|
|
private final Map<String, Object> state;
|
|
@@ -527,11 +476,21 @@ public class MockScriptEngine implements ScriptEngine {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ public static class MockMetricAggCombineScriptFactory implements ScriptedMetricAggContexts.CombineScript.Factory, ScriptFactory {
|
|
|
+ private final MockDeterministicScript script;
|
|
|
+ MockMetricAggCombineScriptFactory(MockDeterministicScript script) { this.script = script; }
|
|
|
+ @Override public boolean isResultDeterministic() { return script.isResultDeterministic(); }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ScriptedMetricAggContexts.CombineScript newInstance(Map<String, Object> params, Map<String, Object> state) {
|
|
|
+ return new MockMetricAggCombineScript(params, state, script);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
public static class MockMetricAggCombineScript extends ScriptedMetricAggContexts.CombineScript {
|
|
|
private final Function<Map<String, Object>, Object> script;
|
|
|
|
|
|
- MockMetricAggCombineScript(Map<String, Object> params, Map<String, Object> state,
|
|
|
- Function<Map<String, Object>, Object> script) {
|
|
|
+ MockMetricAggCombineScript(Map<String, Object> params, Map<String, Object> state, Function<Map<String, Object>, Object> script) {
|
|
|
super(params, state);
|
|
|
this.script = script;
|
|
|
}
|
|
@@ -549,11 +508,21 @@ public class MockScriptEngine implements ScriptEngine {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ public static class MockMetricAggReduceScriptFactory implements ScriptedMetricAggContexts.ReduceScript.Factory, ScriptFactory {
|
|
|
+ private final MockDeterministicScript script;
|
|
|
+ MockMetricAggReduceScriptFactory(MockDeterministicScript script) { this.script = script; }
|
|
|
+ @Override public boolean isResultDeterministic() { return script.isResultDeterministic(); }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ScriptedMetricAggContexts.ReduceScript newInstance(Map<String, Object> params, List<Object> states) {
|
|
|
+ return new MockMetricAggReduceScript(params, states, script);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
public static class MockMetricAggReduceScript extends ScriptedMetricAggContexts.ReduceScript {
|
|
|
private final Function<Map<String, Object>, Object> script;
|
|
|
|
|
|
- MockMetricAggReduceScript(Map<String, Object> params, List<Object> states,
|
|
|
- Function<Map<String, Object>, Object> script) {
|
|
|
+ MockMetricAggReduceScript(Map<String, Object> params, List<Object> states, Function<Map<String, Object>, Object> script) {
|
|
|
super(params, states);
|
|
|
this.script = script;
|
|
|
}
|
|
@@ -615,4 +584,88 @@ public class MockScriptEngine implements ScriptEngine {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ class MockAggregationScript implements AggregationScript.Factory, ScriptFactory {
|
|
|
+ private final MockDeterministicScript script;
|
|
|
+ MockAggregationScript(MockDeterministicScript script) { this.script = script; }
|
|
|
+ @Override public boolean isResultDeterministic() { return script.isResultDeterministic(); }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public AggregationScript.LeafFactory newFactory(Map<String, Object> params, SearchLookup lookup) {
|
|
|
+ return new AggregationScript.LeafFactory() {
|
|
|
+ @Override
|
|
|
+ public AggregationScript newInstance(final LeafReaderContext ctx) {
|
|
|
+ return new AggregationScript(params, lookup, ctx) {
|
|
|
+ @Override
|
|
|
+ public Object execute() {
|
|
|
+ Map<String, Object> vars = new HashMap<>(params);
|
|
|
+ vars.put("params", params);
|
|
|
+ vars.put("doc", getDoc());
|
|
|
+ vars.put("_score", get_score());
|
|
|
+ vars.put("_value", get_value());
|
|
|
+ return script.apply(vars);
|
|
|
+ }
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean needs_score() {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ };
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ class MockSignificantTermsHeuristicScoreScript implements SignificantTermsHeuristicScoreScript.Factory, ScriptFactory {
|
|
|
+ private final MockDeterministicScript script;
|
|
|
+ MockSignificantTermsHeuristicScoreScript(MockDeterministicScript script) { this.script = script; }
|
|
|
+ @Override public boolean isResultDeterministic() { return script.isResultDeterministic(); }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public SignificantTermsHeuristicScoreScript newInstance() {
|
|
|
+ return new SignificantTermsHeuristicScoreScript() {
|
|
|
+ @Override
|
|
|
+ public double execute(Map<String, Object> vars) {
|
|
|
+ return ((Number) script.apply(vars)).doubleValue();
|
|
|
+ }
|
|
|
+ };
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ class MockFieldScriptFactory implements FieldScript.Factory, ScriptFactory {
|
|
|
+ private final MockDeterministicScript script;
|
|
|
+ MockFieldScriptFactory(MockDeterministicScript script) { this.script = script; }
|
|
|
+ @Override public boolean isResultDeterministic() { return script.isResultDeterministic(); }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public FieldScript.LeafFactory newFactory(Map<String, Object> parameters, SearchLookup lookup) {
|
|
|
+ return ctx -> new FieldScript(parameters, lookup, ctx) {
|
|
|
+ @Override
|
|
|
+ public Object execute() {
|
|
|
+ Map<String, Object> vars = createVars(parameters);
|
|
|
+ vars.putAll(getLeafLookup().asMap());
|
|
|
+ return script.apply(vars);
|
|
|
+
|
|
|
+ }
|
|
|
+ };
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ class MockStringSortScriptFactory implements StringSortScript.Factory, ScriptFactory {
|
|
|
+ private final MockDeterministicScript script;
|
|
|
+ MockStringSortScriptFactory(MockDeterministicScript script) { this.script = script; }
|
|
|
+ @Override public boolean isResultDeterministic() { return script.isResultDeterministic(); }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public StringSortScript.LeafFactory newFactory(Map<String, Object> parameters, SearchLookup lookup) {
|
|
|
+ return ctx -> new StringSortScript(parameters, lookup, ctx) {
|
|
|
+ @Override
|
|
|
+ public String execute() {
|
|
|
+ Map<String, Object> vars = new HashMap<>(parameters);
|
|
|
+ vars.put("params", parameters);
|
|
|
+ vars.put("doc", getDoc());
|
|
|
+ return String.valueOf(script.apply(vars));
|
|
|
+ }
|
|
|
+ };
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|