Skip to content

Commit 18e13c1

Browse files
committed
fixed expression scripts to work with ScoreScript
1 parent 6c6233e commit 18e13c1

File tree

1 file changed

+43
-0
lines changed

1 file changed

+43
-0
lines changed

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

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,10 @@
2323
import org.apache.lucene.expressions.SimpleBindings;
2424
import org.apache.lucene.expressions.js.JavascriptCompiler;
2525
import org.apache.lucene.expressions.js.VariableContext;
26+
import org.apache.lucene.index.LeafReaderContext;
2627
import org.apache.lucene.queries.function.ValueSource;
2728
import org.apache.lucene.queries.function.valuesource.DoubleConstValueSource;
29+
import org.apache.lucene.search.Scorer;
2830
import org.apache.lucene.search.SortField;
2931
import org.elasticsearch.SpecialPermission;
3032
import org.elasticsearch.common.Nullable;
@@ -39,12 +41,14 @@
3941
import org.elasticsearch.script.ClassPermission;
4042
import org.elasticsearch.script.ExecutableScript;
4143
import org.elasticsearch.script.FilterScript;
44+
import org.elasticsearch.script.ScoreScript;
4245
import org.elasticsearch.script.ScriptContext;
4346
import org.elasticsearch.script.ScriptEngine;
4447
import org.elasticsearch.script.ScriptException;
4548
import org.elasticsearch.script.SearchScript;
4649
import org.elasticsearch.search.lookup.SearchLookup;
4750

51+
import java.io.IOException;
4852
import java.security.AccessControlContext;
4953
import java.security.AccessController;
5054
import java.security.PrivilegedAction;
@@ -111,6 +115,9 @@ protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundE
111115
} else if (context.instanceClazz.equals(FilterScript.class)) {
112116
FilterScript.Factory factory = (p, lookup) -> newFilterScript(expr, lookup, p);
113117
return context.factoryClazz.cast(factory);
118+
} else if (context.instanceClazz.equals(ScoreScript.class)) {
119+
ScoreScript.Factory factory = (p, lookup) -> newScoreScript(expr, lookup, p);
120+
return context.factoryClazz.cast(factory);
114121
}
115122
throw new IllegalArgumentException("expression engine does not know how to handle script context [" + context.name + "]");
116123
}
@@ -260,6 +267,42 @@ public void setDocument(int docid) {
260267
};
261268
};
262269
}
270+
271+
private ScoreScript.LeafFactory newScoreScript(Expression expr, SearchLookup lookup, @Nullable Map<String, Object> vars) {
272+
SearchScript.LeafFactory searchLeafFactory = newSearchScript(expr, lookup, vars);
273+
return new ScoreScript.LeafFactory() {
274+
@Override
275+
public boolean needs_score() {
276+
return searchLeafFactory.needs_score();
277+
}
278+
279+
@Override
280+
public ScoreScript newInstance(LeafReaderContext ctx) throws IOException {
281+
SearchScript script = searchLeafFactory.newInstance(ctx);
282+
return new ScoreScript(vars, lookup, ctx) {
283+
@Override
284+
public double execute() {
285+
return script.runAsDouble();
286+
}
287+
288+
@Override
289+
public void setDocument(int docid) {
290+
script.setDocument(docid);
291+
}
292+
293+
@Override
294+
public void setScorer(Scorer scorer) {
295+
script.setScorer(scorer);
296+
}
297+
298+
@Override
299+
public double get_score() {
300+
return script.getScore();
301+
}
302+
};
303+
}
304+
};
305+
}
263306

264307
/**
265308
* converts a ParseException at compile-time or link-time to a ScriptException

0 commit comments

Comments
 (0)