add lang parameter to all script constructs, allowing for (later) custom script languages
This commit is contained in:
parent
99fcfde307
commit
aa116e5d40
|
@ -75,9 +75,9 @@ public class ScriptFieldsFunction implements FieldsFunction {
|
|||
|
||||
final SourceMap sourceMap;
|
||||
|
||||
public ScriptFieldsFunction(String script, ScriptService scriptService, MapperService mapperService, FieldDataCache fieldDataCache) {
|
||||
public ScriptFieldsFunction(String scriptLang, String script, ScriptService scriptService, MapperService mapperService, FieldDataCache fieldDataCache) {
|
||||
this.scriptService = scriptService;
|
||||
this.script = scriptService.compile(script);
|
||||
this.script = scriptService.compile(scriptLang, script);
|
||||
this.docMap = new DocMap(cachedFieldData.get().get(), mapperService, fieldDataCache);
|
||||
this.sourceMap = new SourceMap();
|
||||
}
|
||||
|
|
|
@ -60,6 +60,7 @@ public class CustomScoreQueryParser extends AbstractIndexComponent implements XC
|
|||
Query query = null;
|
||||
float boost = 1.0f;
|
||||
String script = null;
|
||||
String scriptLang = null;
|
||||
Map<String, Object> vars = null;
|
||||
|
||||
String currentFieldName = null;
|
||||
|
@ -76,6 +77,8 @@ public class CustomScoreQueryParser extends AbstractIndexComponent implements XC
|
|||
} else if (token.isValue()) {
|
||||
if ("script".equals(currentFieldName)) {
|
||||
script = parser.text();
|
||||
} else if ("lang".equals(currentFieldName)) {
|
||||
scriptLang = parser.text();
|
||||
} else if ("boost".equals(currentFieldName)) {
|
||||
boost = parser.floatValue();
|
||||
}
|
||||
|
@ -88,7 +91,7 @@ public class CustomScoreQueryParser extends AbstractIndexComponent implements XC
|
|||
throw new QueryParsingException(index, "[custom_score] requires 'script' field");
|
||||
}
|
||||
FunctionScoreQuery functionScoreQuery = new FunctionScoreQuery(query,
|
||||
new ScriptScoreFunction(new ScriptFieldsFunction(script, parseContext.scriptService(), parseContext.mapperService(), parseContext.indexCache().fieldData()), vars));
|
||||
new ScriptScoreFunction(new ScriptFieldsFunction(scriptLang, script, parseContext.scriptService(), parseContext.mapperService(), parseContext.indexCache().fieldData()), vars));
|
||||
functionScoreQuery.setBoost(boost);
|
||||
return functionScoreQuery;
|
||||
}
|
||||
|
|
|
@ -60,6 +60,7 @@ public class ScriptFilterParser extends AbstractIndexComponent implements XConte
|
|||
XContentParser.Token token;
|
||||
|
||||
String script = null;
|
||||
String scriptLang = null;
|
||||
Map<String, Object> params = null;
|
||||
|
||||
String filterName = null;
|
||||
|
@ -74,6 +75,8 @@ public class ScriptFilterParser extends AbstractIndexComponent implements XConte
|
|||
} else if (token.isValue()) {
|
||||
if ("script".equals(currentFieldName)) {
|
||||
script = parser.text();
|
||||
} else if ("lang".equals(currentFieldName)) {
|
||||
scriptLang = parser.text();
|
||||
} else if ("_name".equals(currentFieldName)) {
|
||||
filterName = parser.text();
|
||||
}
|
||||
|
@ -87,7 +90,7 @@ public class ScriptFilterParser extends AbstractIndexComponent implements XConte
|
|||
params = Maps.newHashMap();
|
||||
}
|
||||
|
||||
Filter filter = new ScriptFilter(script, params, parseContext.mapperService(), parseContext.indexCache().fieldData(), parseContext.scriptService());
|
||||
Filter filter = new ScriptFilter(scriptLang, script, params, parseContext.mapperService(), parseContext.indexCache().fieldData(), parseContext.scriptService());
|
||||
if (filterName != null) {
|
||||
parseContext.addNamedFilter(filterName, filter);
|
||||
}
|
||||
|
@ -96,6 +99,8 @@ public class ScriptFilterParser extends AbstractIndexComponent implements XConte
|
|||
|
||||
public static class ScriptFilter extends Filter {
|
||||
|
||||
private final String scriptLang;
|
||||
|
||||
private final String script;
|
||||
|
||||
private final Map<String, Object> params;
|
||||
|
@ -106,8 +111,9 @@ public class ScriptFilterParser extends AbstractIndexComponent implements XConte
|
|||
|
||||
private final ScriptService scriptService;
|
||||
|
||||
private ScriptFilter(String script, Map<String, Object> params,
|
||||
private ScriptFilter(String scriptLang, String script, Map<String, Object> params,
|
||||
MapperService mapperService, FieldDataCache fieldDataCache, ScriptService scriptService) {
|
||||
this.scriptLang = scriptLang;
|
||||
this.script = script;
|
||||
this.params = params;
|
||||
this.mapperService = mapperService;
|
||||
|
@ -142,7 +148,7 @@ public class ScriptFilterParser extends AbstractIndexComponent implements XConte
|
|||
}
|
||||
|
||||
@Override public DocIdSet getDocIdSet(final IndexReader reader) throws IOException {
|
||||
final ScriptFieldsFunction function = new ScriptFieldsFunction(script, scriptService, mapperService, fieldDataCache);
|
||||
final ScriptFieldsFunction function = new ScriptFieldsFunction(scriptLang, script, scriptService, mapperService, fieldDataCache);
|
||||
function.setNextReader(reader);
|
||||
return new GetDocSet(reader.maxDoc()) {
|
||||
@Override public boolean isCacheable() {
|
||||
|
|
|
@ -71,6 +71,9 @@ public class ScriptService extends AbstractComponent {
|
|||
if (compiled != null) {
|
||||
return compiled;
|
||||
}
|
||||
if (type == null) {
|
||||
type = defaultType;
|
||||
}
|
||||
synchronized (cache) {
|
||||
compiled = cache.get(script);
|
||||
if (compiled != null) {
|
||||
|
|
|
@ -57,6 +57,7 @@ public class GeoDistanceFacetCollectorParser implements FacetCollectorParser {
|
|||
String fieldName = null;
|
||||
String valueFieldName = null;
|
||||
String valueScript = null;
|
||||
String scriptLang = null;
|
||||
Map<String, Object> params = null;
|
||||
double lat = Double.NaN;
|
||||
double lon = Double.NaN;
|
||||
|
@ -133,6 +134,8 @@ public class GeoDistanceFacetCollectorParser implements FacetCollectorParser {
|
|||
valueFieldName = parser.text();
|
||||
} else if ("value_script".equals(currentName) || "valueScript".equals(currentName)) {
|
||||
valueScript = parser.text();
|
||||
} else if ("lang".equals(currentName)) {
|
||||
scriptLang = parser.text();
|
||||
} else {
|
||||
// assume the value is the actual value
|
||||
String value = parser.text();
|
||||
|
@ -166,7 +169,7 @@ public class GeoDistanceFacetCollectorParser implements FacetCollectorParser {
|
|||
|
||||
if (valueScript != null) {
|
||||
return new ScriptGeoDistanceFacetCollector(facetName, fieldName, lat, lon, unit, geoDistance, entries.toArray(new GeoDistanceFacet.Entry[entries.size()]),
|
||||
context, valueScript, params);
|
||||
context, scriptLang, valueScript, params);
|
||||
}
|
||||
|
||||
return new GeoDistanceFacetCollector(facetName, fieldName, lat, lon, unit, geoDistance, entries.toArray(new GeoDistanceFacet.Entry[entries.size()]),
|
||||
|
|
|
@ -40,11 +40,11 @@ public class ScriptGeoDistanceFacetCollector extends GeoDistanceFacetCollector {
|
|||
|
||||
public ScriptGeoDistanceFacetCollector(String facetName, String fieldName, double lat, double lon, DistanceUnit unit, GeoDistance geoDistance,
|
||||
GeoDistanceFacet.Entry[] entries, SearchContext context,
|
||||
String script, Map<String, Object> params) {
|
||||
String scriptLang, String script, Map<String, Object> params) {
|
||||
super(facetName, fieldName, lat, lon, unit, geoDistance, entries, context);
|
||||
this.params = params;
|
||||
|
||||
this.valueFunction = new ScriptFieldsFunction(script, context.scriptService(), context.mapperService(), context.fieldDataCache());
|
||||
this.valueFunction = new ScriptFieldsFunction(scriptLang, script, context.scriptService(), context.mapperService(), context.fieldDataCache());
|
||||
}
|
||||
|
||||
@Override protected void doSetNextReader(IndexReader reader, int docBase) throws IOException {
|
||||
|
|
|
@ -45,6 +45,7 @@ public class HistogramFacetCollectorParser implements FacetCollectorParser {
|
|||
String valueField = null;
|
||||
String keyScript = null;
|
||||
String valueScript = null;
|
||||
String scriptLang = null;
|
||||
Map<String, Object> params = null;
|
||||
long interval = 0;
|
||||
HistogramFacet.ComparatorType comparatorType = HistogramFacet.ComparatorType.KEY;
|
||||
|
@ -74,12 +75,14 @@ public class HistogramFacetCollectorParser implements FacetCollectorParser {
|
|||
valueScript = parser.text();
|
||||
} else if ("order".equals(fieldName) || "comparator".equals(fieldName)) {
|
||||
comparatorType = HistogramFacet.ComparatorType.fromString(parser.text());
|
||||
} else if ("lang".equals(fieldName)) {
|
||||
scriptLang = parser.text();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (keyScript != null && valueScript != null) {
|
||||
return new ScriptHistogramFacetCollector(facetName, keyScript, valueScript, params, interval, comparatorType, context);
|
||||
return new ScriptHistogramFacetCollector(facetName, scriptLang, keyScript, valueScript, params, interval, comparatorType, context);
|
||||
}
|
||||
|
||||
if (keyField == null) {
|
||||
|
|
|
@ -50,10 +50,10 @@ public class ScriptHistogramFacetCollector extends AbstractFacetCollector {
|
|||
|
||||
private final TLongDoubleHashMap totals = new TLongDoubleHashMap();
|
||||
|
||||
public ScriptHistogramFacetCollector(String facetName, String keyScript, String valueScript, Map<String, Object> params, long interval, HistogramFacet.ComparatorType comparatorType, SearchContext context) {
|
||||
public ScriptHistogramFacetCollector(String facetName, String scriptLang, String keyScript, String valueScript, Map<String, Object> params, long interval, HistogramFacet.ComparatorType comparatorType, SearchContext context) {
|
||||
super(facetName);
|
||||
this.keyFunction = new ScriptFieldsFunction(keyScript, context.scriptService(), context.mapperService(), context.fieldDataCache());
|
||||
this.valueFunction = new ScriptFieldsFunction(valueScript, context.scriptService(), context.mapperService(), context.fieldDataCache());
|
||||
this.keyFunction = new ScriptFieldsFunction(scriptLang, keyScript, context.scriptService(), context.mapperService(), context.fieldDataCache());
|
||||
this.valueFunction = new ScriptFieldsFunction(scriptLang, valueScript, context.scriptService(), context.mapperService(), context.fieldDataCache());
|
||||
this.interval = interval > 0 ? interval : 0;
|
||||
this.params = params;
|
||||
this.comparatorType = comparatorType;
|
||||
|
|
|
@ -45,6 +45,7 @@ public class RangeFacetCollectorParser implements FacetCollectorParser {
|
|||
@Override public FacetCollector parse(String facetName, XContentParser parser, SearchContext context) throws IOException {
|
||||
String keyField = null;
|
||||
String valueField = null;
|
||||
String scriptLang = null;
|
||||
String keyScript = null;
|
||||
String valueScript = null;
|
||||
Map<String, Object> params = null;
|
||||
|
@ -96,6 +97,8 @@ public class RangeFacetCollectorParser implements FacetCollectorParser {
|
|||
keyScript = parser.text();
|
||||
} else if ("value_script".equals(fieldName) || "valueScript".equals(fieldName)) {
|
||||
valueScript = parser.text();
|
||||
} else if ("lang".equals(fieldName)) {
|
||||
scriptLang = parser.text();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -123,7 +126,7 @@ public class RangeFacetCollectorParser implements FacetCollectorParser {
|
|||
}
|
||||
|
||||
if (keyScript != null && valueScript != null) {
|
||||
return new ScriptRangeFacetCollector(facetName, keyScript, valueScript, params, rangeEntries, context);
|
||||
return new ScriptRangeFacetCollector(facetName, scriptLang, keyScript, valueScript, params, rangeEntries, context);
|
||||
}
|
||||
|
||||
if (keyField == null) {
|
||||
|
|
|
@ -42,10 +42,10 @@ public class ScriptRangeFacetCollector extends AbstractFacetCollector {
|
|||
|
||||
private final RangeFacet.Entry[] entries;
|
||||
|
||||
public ScriptRangeFacetCollector(String facetName, String keyScript, String valueScript, Map<String, Object> params, RangeFacet.Entry[] entries, SearchContext context) {
|
||||
public ScriptRangeFacetCollector(String facetName, String scriptLang, String keyScript, String valueScript, Map<String, Object> params, RangeFacet.Entry[] entries, SearchContext context) {
|
||||
super(facetName);
|
||||
this.keyFunction = new ScriptFieldsFunction(keyScript, context.scriptService(), context.mapperService(), context.fieldDataCache());
|
||||
this.valueFunction = new ScriptFieldsFunction(valueScript, context.scriptService(), context.mapperService(), context.fieldDataCache());
|
||||
this.keyFunction = new ScriptFieldsFunction(scriptLang, keyScript, context.scriptService(), context.mapperService(), context.fieldDataCache());
|
||||
this.valueFunction = new ScriptFieldsFunction(scriptLang, valueScript, context.scriptService(), context.mapperService(), context.fieldDataCache());
|
||||
this.params = params;
|
||||
this.entries = entries;
|
||||
}
|
||||
|
|
|
@ -48,10 +48,10 @@ public class ScriptStatisticalFacetCollector extends AbstractFacetCollector {
|
|||
|
||||
private long count;
|
||||
|
||||
public ScriptStatisticalFacetCollector(String facetName, String script, Map<String, Object> params, SearchContext context) {
|
||||
public ScriptStatisticalFacetCollector(String facetName, String scriptLang, String script, Map<String, Object> params, SearchContext context) {
|
||||
super(facetName);
|
||||
this.params = params;
|
||||
this.function = new ScriptFieldsFunction(script, context.scriptService(), context.mapperService(), context.fieldDataCache());
|
||||
this.function = new ScriptFieldsFunction(scriptLang, script, context.scriptService(), context.mapperService(), context.fieldDataCache());
|
||||
}
|
||||
|
||||
@Override protected void doCollect(int doc) throws IOException {
|
||||
|
|
|
@ -52,6 +52,7 @@ public class StatisticalFacetCollectorParser implements FacetCollectorParser {
|
|||
|
||||
String currentFieldName = null;
|
||||
String script = null;
|
||||
String scriptLang = null;
|
||||
Map<String, Object> params = cachedParams.get().get();
|
||||
params.clear();
|
||||
XContentParser.Token token;
|
||||
|
@ -67,6 +68,8 @@ public class StatisticalFacetCollectorParser implements FacetCollectorParser {
|
|||
field = parser.text();
|
||||
} else if ("script".equals(currentFieldName)) {
|
||||
script = parser.text();
|
||||
} else if ("lang".equals(currentFieldName)) {
|
||||
scriptLang = parser.text();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -76,7 +79,7 @@ public class StatisticalFacetCollectorParser implements FacetCollectorParser {
|
|||
if (field != null) {
|
||||
return new StatisticalFacetCollector(facetName, field, context);
|
||||
} else {
|
||||
return new ScriptStatisticalFacetCollector(facetName, script, params, context);
|
||||
return new ScriptStatisticalFacetCollector(facetName, scriptLang, script, params, context);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -76,7 +76,7 @@ public class TermsFacetCollector extends AbstractFacetCollector {
|
|||
private final FieldsFunction scriptFunction;
|
||||
|
||||
public TermsFacetCollector(String facetName, String fieldName, int size, InternalTermsFacet.ComparatorType comparatorType, SearchContext context,
|
||||
ImmutableSet<String> excluded, Pattern pattern, String script, Map<String, Object> params) {
|
||||
ImmutableSet<String> excluded, Pattern pattern, String scriptLang, String script, Map<String, Object> params) {
|
||||
super(facetName);
|
||||
this.fieldDataCache = context.fieldDataCache();
|
||||
this.size = size;
|
||||
|
@ -100,7 +100,7 @@ public class TermsFacetCollector extends AbstractFacetCollector {
|
|||
}
|
||||
|
||||
if (script != null) {
|
||||
scriptFunction = new ScriptFieldsFunction(script, context.scriptService(), context.mapperService(), fieldDataCache);
|
||||
scriptFunction = new ScriptFieldsFunction(scriptLang, script, context.scriptService(), context.mapperService(), fieldDataCache);
|
||||
if (params == null) {
|
||||
params = Maps.newHashMapWithExpectedSize(1);
|
||||
}
|
||||
|
|
|
@ -51,6 +51,7 @@ public class TermsFacetCollectorParser implements FacetCollectorParser {
|
|||
String regex = null;
|
||||
String regexFlags = null;
|
||||
TermsFacet.ComparatorType comparatorType = TermsFacet.ComparatorType.COUNT;
|
||||
String scriptLang = null;
|
||||
String script = null;
|
||||
Map<String, Object> params = null;
|
||||
while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
|
||||
|
@ -81,6 +82,8 @@ public class TermsFacetCollectorParser implements FacetCollectorParser {
|
|||
comparatorType = TermsFacet.ComparatorType.fromString(parser.text());
|
||||
} else if ("script".equals(fieldName)) {
|
||||
script = parser.text();
|
||||
} else if ("lang".equals(fieldName)) {
|
||||
scriptLang = parser.text();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -93,6 +96,6 @@ public class TermsFacetCollectorParser implements FacetCollectorParser {
|
|||
if (regex != null) {
|
||||
pattern = Regex.compile(regex, regexFlags);
|
||||
}
|
||||
return new TermsFacetCollector(facetName, field, size, comparatorType, context, excluded, pattern, script, params);
|
||||
return new TermsFacetCollector(facetName, field, size, comparatorType, context, excluded, pattern, scriptLang, script, params);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -39,7 +39,7 @@ public class FieldsParseElement implements SearchParseElement {
|
|||
String name = parser.text();
|
||||
if (name.contains("_source.") || name.contains("doc[")) {
|
||||
// script field to load from source
|
||||
context.scriptFields().add(new ScriptFieldsContext.ScriptField(name, new ScriptFieldsFunction(name, context.scriptService(), context.mapperService(), context.fieldDataCache()), null));
|
||||
context.scriptFields().add(new ScriptFieldsContext.ScriptField(name, new ScriptFieldsFunction(null, name, context.scriptService(), context.mapperService(), context.fieldDataCache()), null));
|
||||
} else {
|
||||
context.fieldNames().add(name);
|
||||
}
|
||||
|
@ -51,7 +51,7 @@ public class FieldsParseElement implements SearchParseElement {
|
|||
String name = parser.text();
|
||||
if (name.contains("_source.") || name.contains("doc[")) {
|
||||
// script field to load from source
|
||||
context.scriptFields().add(new ScriptFieldsContext.ScriptField(name, new ScriptFieldsFunction(name, context.scriptService(), context.mapperService(), context.fieldDataCache()), null));
|
||||
context.scriptFields().add(new ScriptFieldsContext.ScriptField(name, new ScriptFieldsFunction(null, name, context.scriptService(), context.mapperService(), context.fieldDataCache()), null));
|
||||
} else {
|
||||
context.fieldNames().add(name);
|
||||
}
|
||||
|
|
|
@ -51,6 +51,7 @@ public class ScriptFieldsParseElement implements SearchParseElement {
|
|||
} else if (token == XContentParser.Token.START_OBJECT) {
|
||||
String fieldName = currentFieldName;
|
||||
String script = null;
|
||||
String scriptLang = null;
|
||||
Map<String, Object> params = null;
|
||||
while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
|
||||
if (token == XContentParser.Token.FIELD_NAME) {
|
||||
|
@ -58,10 +59,14 @@ public class ScriptFieldsParseElement implements SearchParseElement {
|
|||
} else if (token == XContentParser.Token.START_OBJECT) {
|
||||
params = parser.map();
|
||||
} else if (token.isValue()) {
|
||||
script = parser.text();
|
||||
if ("script".equals(currentFieldName)) {
|
||||
script = parser.text();
|
||||
} else if ("lang".equals(currentFieldName)) {
|
||||
scriptLang = parser.text();
|
||||
}
|
||||
}
|
||||
}
|
||||
context.scriptFields().add(new ScriptFieldsContext.ScriptField(fieldName, new ScriptFieldsFunction(script, context.scriptService(), context.mapperService(), context.fieldDataCache()), params));
|
||||
context.scriptFields().add(new ScriptFieldsContext.ScriptField(fieldName, new ScriptFieldsFunction(scriptLang, script, context.scriptService(), context.mapperService(), context.fieldDataCache()), params));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -42,6 +42,7 @@ public class ScriptSortParser implements SortParser {
|
|||
|
||||
@Override public SortField parse(XContentParser parser, SearchContext context) throws Exception {
|
||||
String script = null;
|
||||
String scriptLang = null;
|
||||
String type = null;
|
||||
Map<String, Object> params = null;
|
||||
boolean reverse = false;
|
||||
|
@ -62,6 +63,8 @@ public class ScriptSortParser implements SortParser {
|
|||
type = parser.text();
|
||||
} else if ("params".equals(currentName)) {
|
||||
params = parser.map();
|
||||
} else if ("lang".equals(currentName)) {
|
||||
scriptLang = parser.text();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -72,7 +75,7 @@ public class ScriptSortParser implements SortParser {
|
|||
if (type == null) {
|
||||
throw new SearchParseException(context, "_script sorting requires setting the type of the script");
|
||||
}
|
||||
FieldsFunction fieldsFunction = new ScriptFieldsFunction(script, context.scriptService(), context.mapperService(), context.fieldDataCache());
|
||||
FieldsFunction fieldsFunction = new ScriptFieldsFunction(scriptLang, script, context.scriptService(), context.mapperService(), context.fieldDataCache());
|
||||
FieldComparatorSource fieldComparatorSource;
|
||||
if ("string".equals(type)) {
|
||||
fieldComparatorSource = StringFieldsFunctionDataComparator.comparatorSource(fieldsFunction, params);
|
||||
|
|
Loading…
Reference in New Issue