diff --git a/core/src/main/java/org/elasticsearch/action/percolate/TransportPercolateAction.java b/core/src/main/java/org/elasticsearch/action/percolate/TransportPercolateAction.java index 42f51396094..4a3dfedb577 100644 --- a/core/src/main/java/org/elasticsearch/action/percolate/TransportPercolateAction.java +++ b/core/src/main/java/org/elasticsearch/action/percolate/TransportPercolateAction.java @@ -219,7 +219,7 @@ public class TransportPercolateAction extends HandledTransportAction float boost = AbstractQueryBuilder.DEFAULT_BOOST; ScoreMode scoreMode = ScoreMode.Avg; String queryName = null; - QueryBuilder query = null; + QueryBuilder query = null; String path = null; String currentFieldName = null; InnerHitBuilder innerHitBuilder = null; @@ -176,7 +176,7 @@ public class NestedQueryBuilder extends AbstractQueryBuilder if (parseContext.parseFieldMatcher().match(currentFieldName, QUERY_FIELD)) { query = parseContext.parseInnerQueryBuilder(); } else if (parseContext.parseFieldMatcher().match(currentFieldName, INNER_HITS_FIELD)) { - innerHitBuilder = InnerHitBuilder.fromXContent(parser, parseContext); + innerHitBuilder = InnerHitBuilder.fromXContent(parseContext); } else { throw new ParsingException(parser.getTokenLocation(), "[nested] query does not support [" + currentFieldName + "]"); } diff --git a/core/src/main/java/org/elasticsearch/index/query/functionscore/DecayFunctionParser.java b/core/src/main/java/org/elasticsearch/index/query/functionscore/DecayFunctionParser.java index 913e16cabb8..45af75595ac 100644 --- a/core/src/main/java/org/elasticsearch/index/query/functionscore/DecayFunctionParser.java +++ b/core/src/main/java/org/elasticsearch/index/query/functionscore/DecayFunctionParser.java @@ -97,7 +97,8 @@ public final class DecayFunctionParser> im * */ @Override - public DFB fromXContent(QueryParseContext context, XContentParser parser) throws IOException, ParsingException { + public DFB fromXContent(QueryParseContext context) throws IOException, ParsingException { + XContentParser parser = context.parser(); String currentFieldName; XContentParser.Token token; MultiValueMode multiValueMode = DecayFunctionBuilder.DEFAULT_MULTI_VALUE_MODE; diff --git a/core/src/main/java/org/elasticsearch/index/query/functionscore/FieldValueFactorFunctionBuilder.java b/core/src/main/java/org/elasticsearch/index/query/functionscore/FieldValueFactorFunctionBuilder.java index cdc9c8aa8a9..7f6c5a91d39 100644 --- a/core/src/main/java/org/elasticsearch/index/query/functionscore/FieldValueFactorFunctionBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/functionscore/FieldValueFactorFunctionBuilder.java @@ -159,8 +159,9 @@ public class FieldValueFactorFunctionBuilder extends ScoreFunctionBuilder scoreFunction = scoreFunctionsRegistry.lookup(currentFieldName, parseContext.parser()) - .fromXContent(parseContext, parser); + .fromXContent(parseContext); filterFunctionBuilders.add(new FunctionScoreQueryBuilder.FilterFunctionBuilder(scoreFunction)); } } else if (token == XContentParser.Token.START_ARRAY) { @@ -487,7 +487,7 @@ public class FunctionScoreQueryBuilder extends AbstractQueryBuilder> scoreFunctionsRegistry, - QueryParseContext parseContext, XContentParser parser, - List filterFunctionBuilders) throws IOException { + QueryParseContext parseContext, List filterFunctionBuilders) + throws IOException { String currentFieldName = null; XContentParser.Token token; + XContentParser parser = parseContext.parser(); while ((token = parser.nextToken()) != XContentParser.Token.END_ARRAY) { QueryBuilder filter = null; ScoreFunctionBuilder scoreFunction = null; @@ -580,7 +581,7 @@ public class FunctionScoreQueryBuilder extends AbstractQueryBuilder> { - FB fromXContent(QueryParseContext context, XContentParser parser) throws IOException, ParsingException; + FB fromXContent(QueryParseContext context) throws IOException, ParsingException; } diff --git a/core/src/main/java/org/elasticsearch/index/query/functionscore/ScriptScoreFunctionBuilder.java b/core/src/main/java/org/elasticsearch/index/query/functionscore/ScriptScoreFunctionBuilder.java index 4cf0d2640d9..e6c61ccaf45 100644 --- a/core/src/main/java/org/elasticsearch/index/query/functionscore/ScriptScoreFunctionBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/functionscore/ScriptScoreFunctionBuilder.java @@ -32,9 +32,9 @@ import org.elasticsearch.index.query.QueryShardContext; import org.elasticsearch.index.query.QueryShardException; import org.elasticsearch.script.Script; import org.elasticsearch.script.Script.ScriptField; -import org.elasticsearch.script.ScriptParameterParser.ScriptParameterValue; import org.elasticsearch.script.ScriptContext; import org.elasticsearch.script.ScriptParameterParser; +import org.elasticsearch.script.ScriptParameterParser.ScriptParameterValue; import org.elasticsearch.script.SearchScript; import java.io.IOException; @@ -110,8 +110,9 @@ public class ScriptScoreFunctionBuilder extends ScoreFunctionBuilder vars = null; diff --git a/core/src/main/java/org/elasticsearch/index/query/support/InnerHitBuilder.java b/core/src/main/java/org/elasticsearch/index/query/support/InnerHitBuilder.java index 99c01811c03..33aebdba0e0 100644 --- a/core/src/main/java/org/elasticsearch/index/query/support/InnerHitBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/support/InnerHitBuilder.java @@ -82,7 +82,7 @@ public final class InnerHitBuilder extends ToXContentToBytes implements Writeabl try { List scriptFields = new ArrayList<>(); for (XContentParser.Token token = p.nextToken(); token != END_OBJECT; token = p.nextToken()) { - scriptFields.add(new ScriptField(p, c)); + scriptFields.add(new ScriptField(c)); } i.setScriptFields(scriptFields); } catch (IOException e) { @@ -93,7 +93,7 @@ public final class InnerHitBuilder extends ToXContentToBytes implements Writeabl ObjectParser.ValueType.OBJECT_ARRAY); PARSER.declareField((p, i, c) -> { try { - i.setFetchSourceContext(FetchSourceContext.parse(p, c)); + i.setFetchSourceContext(FetchSourceContext.parse(c)); } catch (IOException e) { throw new ParsingException(p.getTokenLocation(), "Could not parse inner _source definition", e); } @@ -109,7 +109,7 @@ public final class InnerHitBuilder extends ToXContentToBytes implements Writeabl }, SearchSourceBuilder.QUERY_FIELD); PARSER.declareObject(InnerHitBuilder::setInnerHitsBuilder, (p, c) -> { try { - return InnerHitsBuilder.fromXContent(p, c); + return InnerHitsBuilder.fromXContent(c); } catch (IOException e) { throw new ParsingException(p.getTokenLocation(), "Could not parse inner query definition", e); } @@ -579,8 +579,8 @@ public final class InnerHitBuilder extends ToXContentToBytes implements Writeabl fieldDataFields, scriptFields, fetchSourceContext, sorts, highlightBuilder, query, innerHitsBuilder); } - public static InnerHitBuilder fromXContent(XContentParser parser, QueryParseContext context) throws IOException { - return PARSER.parse(parser, new InnerHitBuilder(), context); + public static InnerHitBuilder fromXContent(QueryParseContext context) throws IOException { + return PARSER.parse(context.parser(), new InnerHitBuilder(), context); } } diff --git a/core/src/main/java/org/elasticsearch/index/query/support/InnerHitsBuilder.java b/core/src/main/java/org/elasticsearch/index/query/support/InnerHitsBuilder.java index 5b1e9c16133..0d27c1f1d99 100644 --- a/core/src/main/java/org/elasticsearch/index/query/support/InnerHitsBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/support/InnerHitsBuilder.java @@ -23,7 +23,6 @@ import org.elasticsearch.common.ParsingException; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.io.stream.Writeable; -import org.elasticsearch.common.xcontent.ToXContent; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.XContentParser.Token; @@ -104,13 +103,14 @@ public final class InnerHitsBuilder extends ToXContentToBytes implements Writeab return innerHitsBuilders.hashCode(); } - public static InnerHitsBuilder fromXContent(XContentParser parser, QueryParseContext context) throws IOException { + public static InnerHitsBuilder fromXContent(QueryParseContext context) throws IOException { Map innerHitBuilders = new HashMap<>(); String innerHitName = null; + XContentParser parser = context.parser(); for (Token token = parser.nextToken(); token != Token.END_OBJECT; token = parser.nextToken()) { switch (token) { case START_OBJECT: - InnerHitBuilder innerHitBuilder = InnerHitBuilder.fromXContent(parser, context); + InnerHitBuilder innerHitBuilder = InnerHitBuilder.fromXContent(context); innerHitBuilder.setName(innerHitName); innerHitBuilders.put(innerHitName, innerHitBuilder); break; diff --git a/core/src/main/java/org/elasticsearch/rest/action/search/RestMultiSearchAction.java b/core/src/main/java/org/elasticsearch/rest/action/search/RestMultiSearchAction.java index bac5e3700ec..5a969943b68 100644 --- a/core/src/main/java/org/elasticsearch/rest/action/search/RestMultiSearchAction.java +++ b/core/src/main/java/org/elasticsearch/rest/action/search/RestMultiSearchAction.java @@ -196,7 +196,7 @@ public class RestMultiSearchAction extends BaseRestHandler { } else { try (XContentParser requestParser = XContentFactory.xContent(slice).createParser(slice)) { queryParseContext.reset(requestParser); - searchRequest.source(SearchSourceBuilder.fromXContent(requestParser, queryParseContext, aggParsers, suggesters)); + searchRequest.source(SearchSourceBuilder.fromXContent(queryParseContext, aggParsers, suggesters)); } } // move pointers diff --git a/core/src/main/java/org/elasticsearch/rest/action/search/RestSearchAction.java b/core/src/main/java/org/elasticsearch/rest/action/search/RestSearchAction.java index 10319a22682..dcba845ccfd 100644 --- a/core/src/main/java/org/elasticsearch/rest/action/search/RestSearchAction.java +++ b/core/src/main/java/org/elasticsearch/rest/action/search/RestSearchAction.java @@ -130,7 +130,7 @@ public class RestSearchAction extends BaseRestHandler { Template template = TemplateQueryBuilder.parse(parser, context.parseFieldMatcher(), "params", "template"); searchRequest.template(template); } else { - searchRequest.source().parseXContent(parser, context, aggParsers, suggesters); + searchRequest.source().parseXContent(context, aggParsers, suggesters); } } } diff --git a/core/src/main/java/org/elasticsearch/search/SearchService.java b/core/src/main/java/org/elasticsearch/search/SearchService.java index 974cd7937fe..d1c724eaf36 100644 --- a/core/src/main/java/org/elasticsearch/search/SearchService.java +++ b/core/src/main/java/org/elasticsearch/search/SearchService.java @@ -20,6 +20,7 @@ package org.elasticsearch.search; import com.carrotsearch.hppc.ObjectFloatHashMap; + import org.apache.lucene.search.FieldDoc; import org.apache.lucene.search.Sort; import org.apache.lucene.search.TopDocs; @@ -571,7 +572,7 @@ public class SearchService extends AbstractLifecycleComponent imp QueryParseContext queryParseContext = new QueryParseContext(indicesService.getIndicesQueryRegistry()); queryParseContext.reset(parser); queryParseContext.parseFieldMatcher(parseFieldMatcher); - parseSource(context, SearchSourceBuilder.fromXContent(parser, queryParseContext, aggParsers, suggesters)); + parseSource(context, SearchSourceBuilder.fromXContent(queryParseContext, aggParsers, suggesters)); } } parseSource(context, request.source()); diff --git a/core/src/main/java/org/elasticsearch/search/aggregations/AggregationParseElement.java b/core/src/main/java/org/elasticsearch/search/aggregations/AggregationParseElement.java index fee445dd104..8f769feb241 100644 --- a/core/src/main/java/org/elasticsearch/search/aggregations/AggregationParseElement.java +++ b/core/src/main/java/org/elasticsearch/search/aggregations/AggregationParseElement.java @@ -65,7 +65,7 @@ public class AggregationParseElement implements SearchParseElement { QueryParseContext parseContext = new QueryParseContext(queriesRegistry); parseContext.reset(parser); parseContext.parseFieldMatcher(context.parseFieldMatcher()); - AggregatorFactories.Builder builders = aggregatorParsers.parseAggregators(parser, parseContext); + AggregatorFactories.Builder builders = aggregatorParsers.parseAggregators(parseContext); AggregationContext aggContext = new AggregationContext(context); AggregatorFactories factories = builders.build(aggContext, null); factories.validate(); diff --git a/core/src/main/java/org/elasticsearch/search/aggregations/Aggregator.java b/core/src/main/java/org/elasticsearch/search/aggregations/Aggregator.java index 7834485f1c8..7204af5357e 100644 --- a/core/src/main/java/org/elasticsearch/search/aggregations/Aggregator.java +++ b/core/src/main/java/org/elasticsearch/search/aggregations/Aggregator.java @@ -26,7 +26,6 @@ import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.io.stream.Writeable; import org.elasticsearch.common.lease.Releasable; -import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.query.QueryParseContext; import org.elasticsearch.search.aggregations.bucket.BucketsAggregator; import org.elasticsearch.search.aggregations.support.AggregationContext; @@ -60,12 +59,11 @@ public abstract class Aggregator extends BucketCollector implements Releasable { * aggregation should be skipped (e.g. when trying to aggregate on unmapped fields). * * @param aggregationName The name of the aggregation - * @param parser The xcontent parser - * @param context The search context + * @param context The parse context * @return The resolved aggregator factory or {@code null} in case the aggregation should be skipped * @throws java.io.IOException When parsing fails */ - AggregatorBuilder parse(String aggregationName, XContentParser parser, QueryParseContext context) throws IOException; + AggregatorBuilder parse(String aggregationName, QueryParseContext context) throws IOException; /** * @return an empty {@link AggregatorBuilder} instance for this parser diff --git a/core/src/main/java/org/elasticsearch/search/aggregations/AggregatorParsers.java b/core/src/main/java/org/elasticsearch/search/aggregations/AggregatorParsers.java index e0e50651bac..409b22f4f3c 100644 --- a/core/src/main/java/org/elasticsearch/search/aggregations/AggregatorParsers.java +++ b/core/src/main/java/org/elasticsearch/search/aggregations/AggregatorParsers.java @@ -71,15 +71,14 @@ public class AggregatorParsers { /** * Parses the aggregation request recursively generating aggregator factories in turn. * - * @param parser The input xcontent that will be parsed. * @param parseContext The parse context. * * @return The parsed aggregator factories. * * @throws IOException When parsing fails for unknown reasons. */ - public AggregatorFactories.Builder parseAggregators(XContentParser parser, QueryParseContext parseContext) throws IOException { - return parseAggregators(parser, parseContext, 0); + public AggregatorFactories.Builder parseAggregators(QueryParseContext parseContext) throws IOException { + return parseAggregators(parseContext.parser(), parseContext, 0); } private AggregatorFactories.Builder parseAggregators(XContentParser parser, QueryParseContext parseContext, int level) @@ -173,10 +172,10 @@ public class AggregatorParsers { throw new ParsingException(parser.getTokenLocation(), "Could not find aggregator type [" + fieldName + "] in [" + aggregationName + "]"); } else { - pipelineAggregatorFactory = pipelineAggregatorParser.parse(aggregationName, parser, parseContext); + pipelineAggregatorFactory = pipelineAggregatorParser.parse(aggregationName, parseContext); } } else { - aggFactory = aggregatorParser.parse(aggregationName, parser, parseContext); + aggFactory = aggregatorParser.parse(aggregationName, parseContext); } } } else { diff --git a/core/src/main/java/org/elasticsearch/search/aggregations/bucket/children/ChildrenAggregatorBuilder.java b/core/src/main/java/org/elasticsearch/search/aggregations/bucket/children/ChildrenAggregatorBuilder.java index aaf87152b45..64e5760e4bf 100644 --- a/core/src/main/java/org/elasticsearch/search/aggregations/bucket/children/ChildrenAggregatorBuilder.java +++ b/core/src/main/java/org/elasticsearch/search/aggregations/bucket/children/ChildrenAggregatorBuilder.java @@ -126,12 +126,12 @@ public class ChildrenAggregatorBuilder extends ValuesSourceAggregatorBuilder filter = context.parseInnerQueryBuilder(); if (filter == null) { diff --git a/core/src/main/java/org/elasticsearch/search/aggregations/bucket/filters/FiltersParser.java b/core/src/main/java/org/elasticsearch/search/aggregations/bucket/filters/FiltersParser.java index a3cd32a1cfe..fca52cde1d6 100644 --- a/core/src/main/java/org/elasticsearch/search/aggregations/bucket/filters/FiltersParser.java +++ b/core/src/main/java/org/elasticsearch/search/aggregations/bucket/filters/FiltersParser.java @@ -53,8 +53,9 @@ public class FiltersParser implements Aggregator.Parser { } @Override - public FiltersAggregatorBuilder parse(String aggregationName, XContentParser parser, QueryParseContext context) + public FiltersAggregatorBuilder parse(String aggregationName, QueryParseContext context) throws IOException { + XContentParser parser = context.parser(); List keyedFilters = null; List> nonKeyedFilters = null; diff --git a/core/src/main/java/org/elasticsearch/search/aggregations/bucket/global/GlobalParser.java b/core/src/main/java/org/elasticsearch/search/aggregations/bucket/global/GlobalParser.java index 2a0ff5fb025..821e17e1b68 100644 --- a/core/src/main/java/org/elasticsearch/search/aggregations/bucket/global/GlobalParser.java +++ b/core/src/main/java/org/elasticsearch/search/aggregations/bucket/global/GlobalParser.java @@ -18,9 +18,9 @@ */ package org.elasticsearch.search.aggregations.bucket.global; -import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.query.QueryParseContext; import org.elasticsearch.search.aggregations.Aggregator; + import java.io.IOException; /** @@ -34,9 +34,8 @@ public class GlobalParser implements Aggregator.Parser { } @Override - public GlobalAggregatorBuilder parse(String aggregationName, XContentParser parser, QueryParseContext context) - throws IOException { - parser.nextToken(); + public GlobalAggregatorBuilder parse(String aggregationName, QueryParseContext context) throws IOException { + context.parser().nextToken(); return new GlobalAggregatorBuilder(aggregationName); } diff --git a/core/src/main/java/org/elasticsearch/search/aggregations/bucket/nested/NestedParser.java b/core/src/main/java/org/elasticsearch/search/aggregations/bucket/nested/NestedParser.java index a4beae49f0e..fb2fe3b701c 100644 --- a/core/src/main/java/org/elasticsearch/search/aggregations/bucket/nested/NestedParser.java +++ b/core/src/main/java/org/elasticsearch/search/aggregations/bucket/nested/NestedParser.java @@ -22,6 +22,7 @@ import org.elasticsearch.common.ParsingException; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.query.QueryParseContext; import org.elasticsearch.search.aggregations.Aggregator; + import java.io.IOException; /** @@ -35,12 +36,12 @@ public class NestedParser implements Aggregator.Parser { } @Override - public NestedAggregatorBuilder parse(String aggregationName, XContentParser parser, QueryParseContext context) - throws IOException { + public NestedAggregatorBuilder parse(String aggregationName, QueryParseContext context) throws IOException { String path = null; XContentParser.Token token; String currentFieldName = null; + XContentParser parser = context.parser(); while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { if (token == XContentParser.Token.FIELD_NAME) { currentFieldName = parser.currentName(); diff --git a/core/src/main/java/org/elasticsearch/search/aggregations/bucket/nested/ReverseNestedParser.java b/core/src/main/java/org/elasticsearch/search/aggregations/bucket/nested/ReverseNestedParser.java index 2fe530dc172..7d1a22548e4 100644 --- a/core/src/main/java/org/elasticsearch/search/aggregations/bucket/nested/ReverseNestedParser.java +++ b/core/src/main/java/org/elasticsearch/search/aggregations/bucket/nested/ReverseNestedParser.java @@ -22,6 +22,7 @@ import org.elasticsearch.common.ParsingException; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.query.QueryParseContext; import org.elasticsearch.search.aggregations.Aggregator; + import java.io.IOException; /** @@ -35,12 +36,12 @@ public class ReverseNestedParser implements Aggregator.Parser { } @Override - public ReverseNestedAggregatorBuilder parse(String aggregationName, XContentParser parser, - QueryParseContext context) throws IOException { + public ReverseNestedAggregatorBuilder parse(String aggregationName, QueryParseContext context) throws IOException { String path = null; XContentParser.Token token; String currentFieldName = null; + XContentParser parser = context.parser(); while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { if (token == XContentParser.Token.FIELD_NAME) { currentFieldName = parser.currentName(); diff --git a/core/src/main/java/org/elasticsearch/search/aggregations/bucket/sampler/SamplerParser.java b/core/src/main/java/org/elasticsearch/search/aggregations/bucket/sampler/SamplerParser.java index 593ab28580b..4a366511ca1 100644 --- a/core/src/main/java/org/elasticsearch/search/aggregations/bucket/sampler/SamplerParser.java +++ b/core/src/main/java/org/elasticsearch/search/aggregations/bucket/sampler/SamplerParser.java @@ -23,6 +23,7 @@ import org.elasticsearch.common.ParsingException; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.query.QueryParseContext; import org.elasticsearch.search.aggregations.Aggregator; + import java.io.IOException; /** @@ -36,13 +37,13 @@ public class SamplerParser implements Aggregator.Parser { } @Override - public SamplerAggregatorBuilder parse(String aggregationName, XContentParser parser, QueryParseContext context) - throws IOException { + public SamplerAggregatorBuilder parse(String aggregationName, QueryParseContext context) throws IOException { XContentParser.Token token; String currentFieldName = null; Integer shardSize = null; + XContentParser parser = context.parser(); while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { if (token == XContentParser.Token.FIELD_NAME) { currentFieldName = parser.currentName(); diff --git a/core/src/main/java/org/elasticsearch/search/aggregations/metrics/scripted/ScriptedMetricParser.java b/core/src/main/java/org/elasticsearch/search/aggregations/metrics/scripted/ScriptedMetricParser.java new file mode 100644 index 00000000000..fbab6e9826c --- /dev/null +++ b/core/src/main/java/org/elasticsearch/search/aggregations/metrics/scripted/ScriptedMetricParser.java @@ -0,0 +1,168 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.elasticsearch.search.aggregations.metrics.scripted; + +import org.elasticsearch.common.ParseField; +import org.elasticsearch.common.ParsingException; +import org.elasticsearch.common.xcontent.XContentParser; +import org.elasticsearch.index.query.QueryParseContext; +import org.elasticsearch.script.Script; +import org.elasticsearch.script.ScriptParameterParser; +import org.elasticsearch.script.ScriptParameterParser.ScriptParameterValue; +import org.elasticsearch.search.aggregations.Aggregator; + +import java.io.IOException; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +public class ScriptedMetricParser implements Aggregator.Parser { + + public static final String INIT_SCRIPT = "init_script"; + public static final String MAP_SCRIPT = "map_script"; + public static final String COMBINE_SCRIPT = "combine_script"; + public static final String REDUCE_SCRIPT = "reduce_script"; + public static final ParseField INIT_SCRIPT_FIELD = new ParseField("init_script"); + public static final ParseField MAP_SCRIPT_FIELD = new ParseField("map_script"); + public static final ParseField COMBINE_SCRIPT_FIELD = new ParseField("combine_script"); + public static final ParseField REDUCE_SCRIPT_FIELD = new ParseField("reduce_script"); + public static final ParseField PARAMS_FIELD = new ParseField("params"); + public static final ParseField REDUCE_PARAMS_FIELD = new ParseField("reduce_params"); + public static final ParseField LANG_FIELD = new ParseField("lang"); + + @Override + public String type() { + return InternalScriptedMetric.TYPE.name(); + } + + @Override + public ScriptedMetricAggregatorBuilder parse(String aggregationName, QueryParseContext context) throws IOException { + Script initScript = null; + Script mapScript = null; + Script combineScript = null; + Script reduceScript = null; + Map params = null; + Map reduceParams = null; + XContentParser.Token token; + String currentFieldName = null; + Set scriptParameters = new HashSet<>(); + scriptParameters.add(INIT_SCRIPT); + scriptParameters.add(MAP_SCRIPT); + scriptParameters.add(COMBINE_SCRIPT); + scriptParameters.add(REDUCE_SCRIPT); + ScriptParameterParser scriptParameterParser = new ScriptParameterParser(scriptParameters); + + XContentParser parser = context.parser(); + while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { + if (token == XContentParser.Token.FIELD_NAME) { + currentFieldName = parser.currentName(); + } else if (token == XContentParser.Token.START_OBJECT) { + if (context.parseFieldMatcher().match(currentFieldName, INIT_SCRIPT_FIELD)) { + initScript = Script.parse(parser, context.parseFieldMatcher()); + } else if (context.parseFieldMatcher().match(currentFieldName, MAP_SCRIPT_FIELD)) { + mapScript = Script.parse(parser, context.parseFieldMatcher()); + } else if (context.parseFieldMatcher().match(currentFieldName, COMBINE_SCRIPT_FIELD)) { + combineScript = Script.parse(parser, context.parseFieldMatcher()); + } else if (context.parseFieldMatcher().match(currentFieldName, REDUCE_SCRIPT_FIELD)) { + reduceScript = Script.parse(parser, context.parseFieldMatcher()); + } else if (context.parseFieldMatcher().match(currentFieldName, PARAMS_FIELD)) { + params = parser.map(); + } else if (context.parseFieldMatcher().match(currentFieldName, REDUCE_PARAMS_FIELD)) { + reduceParams = parser.map(); + } else { + throw new ParsingException(parser.getTokenLocation(), + "Unknown key for a " + token + " in [" + aggregationName + "]: [" + currentFieldName + "]."); + } + } else if (token.isValue()) { + if (!scriptParameterParser.token(currentFieldName, token, parser, context.parseFieldMatcher())) { + throw new ParsingException(parser.getTokenLocation(), + "Unknown key for a " + token + " in [" + aggregationName + "]: [" + currentFieldName + "]."); + } + } else { + throw new ParsingException(parser.getTokenLocation(), "Unexpected token " + token + " in [" + aggregationName + "]."); + } + } + + if (initScript == null) { // Didn't find anything using the new API so try using the old one instead + ScriptParameterValue scriptValue = scriptParameterParser.getScriptParameterValue(INIT_SCRIPT); + if (scriptValue != null) { + initScript = new Script(scriptValue.script(), scriptValue.scriptType(), scriptParameterParser.lang(), params); + } + } else if (initScript.getParams() != null) { + throw new ParsingException(parser.getTokenLocation(), + "init_script params are not supported. Parameters for the init_script must be specified in the params field on the scripted_metric aggregator not inside the init_script object"); + } + + if (mapScript == null) { // Didn't find anything using the new API so try using the old one instead + ScriptParameterValue scriptValue = scriptParameterParser.getScriptParameterValue(MAP_SCRIPT); + if (scriptValue != null) { + mapScript = new Script(scriptValue.script(), scriptValue.scriptType(), scriptParameterParser.lang(), params); + } + } else if (mapScript.getParams() != null) { + throw new ParsingException(parser.getTokenLocation(), + "map_script params are not supported. Parameters for the map_script must be specified in the params field on the scripted_metric aggregator not inside the map_script object"); + } + + if (combineScript == null) { // Didn't find anything using the new API so try using the old one instead + ScriptParameterValue scriptValue = scriptParameterParser.getScriptParameterValue(COMBINE_SCRIPT); + if (scriptValue != null) { + combineScript = new Script(scriptValue.script(), scriptValue.scriptType(), scriptParameterParser.lang(), params); + } + } else if (combineScript.getParams() != null) { + throw new ParsingException(parser.getTokenLocation(), + "combine_script params are not supported. Parameters for the combine_script must be specified in the params field on the scripted_metric aggregator not inside the combine_script object"); + } + + if (reduceScript == null) { // Didn't find anything using the new API so try using the old one instead + ScriptParameterValue scriptValue = scriptParameterParser.getScriptParameterValue(REDUCE_SCRIPT); + if (scriptValue != null) { + reduceScript = new Script(scriptValue.script(), scriptValue.scriptType(), scriptParameterParser.lang(), reduceParams); + } + } + + if (mapScript == null) { + throw new ParsingException(parser.getTokenLocation(), "map_script field is required in [" + aggregationName + "]."); + } + + ScriptedMetricAggregatorBuilder factory = new ScriptedMetricAggregatorBuilder(aggregationName); + if (initScript != null) { + factory.initScript(initScript); + } + if (mapScript != null) { + factory.mapScript(mapScript); + } + if (combineScript != null) { + factory.combineScript(combineScript); + } + if (reduceScript != null) { + factory.reduceScript(reduceScript); + } + if (params != null) { + factory.params(params); + } + return factory; + } + + @Override + public ScriptedMetricAggregatorBuilder getFactoryPrototypes() { + return ScriptedMetricAggregatorBuilder.PROTOTYPE; + } + +} diff --git a/core/src/main/java/org/elasticsearch/search/aggregations/metrics/tophits/TopHitsParser.java b/core/src/main/java/org/elasticsearch/search/aggregations/metrics/tophits/TopHitsParser.java index a12c9ece95f..9c478198761 100644 --- a/core/src/main/java/org/elasticsearch/search/aggregations/metrics/tophits/TopHitsParser.java +++ b/core/src/main/java/org/elasticsearch/search/aggregations/metrics/tophits/TopHitsParser.java @@ -44,11 +44,11 @@ public class TopHitsParser implements Aggregator.Parser { } @Override - public TopHitsAggregatorBuilder parse(String aggregationName, XContentParser parser, QueryParseContext context) - throws IOException { + public TopHitsAggregatorBuilder parse(String aggregationName, QueryParseContext context) throws IOException { TopHitsAggregatorBuilder factory = new TopHitsAggregatorBuilder(aggregationName); XContentParser.Token token; String currentFieldName = null; + XContentParser parser = context.parser(); while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { if (token == XContentParser.Token.FIELD_NAME) { currentFieldName = parser.currentName(); @@ -64,7 +64,7 @@ public class TopHitsParser implements Aggregator.Parser { } else if (context.parseFieldMatcher().match(currentFieldName, SearchSourceBuilder.TRACK_SCORES_FIELD)) { factory.trackScores(parser.booleanValue()); } else if (context.parseFieldMatcher().match(currentFieldName, SearchSourceBuilder._SOURCE_FIELD)) { - factory.fetchSource(FetchSourceContext.parse(parser, context)); + factory.fetchSource(FetchSourceContext.parse(context)); } else if (context.parseFieldMatcher().match(currentFieldName, SearchSourceBuilder.FIELDS_FIELD)) { List fieldNames = new ArrayList<>(); fieldNames.add(parser.text()); @@ -77,7 +77,7 @@ public class TopHitsParser implements Aggregator.Parser { } } else if (token == XContentParser.Token.START_OBJECT) { if (context.parseFieldMatcher().match(currentFieldName, SearchSourceBuilder._SOURCE_FIELD)) { - factory.fetchSource(FetchSourceContext.parse(parser, context)); + factory.fetchSource(FetchSourceContext.parse(context)); } else if (context.parseFieldMatcher().match(currentFieldName, SearchSourceBuilder.SCRIPT_FIELDS_FIELD)) { List scriptFields = new ArrayList<>(); while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { @@ -157,7 +157,7 @@ public class TopHitsParser implements Aggregator.Parser { List> sorts = SortBuilder.fromXContent(context); factory.sorts(sorts); } else if (context.parseFieldMatcher().match(currentFieldName, SearchSourceBuilder._SOURCE_FIELD)) { - factory.fetchSource(FetchSourceContext.parse(parser, context)); + factory.fetchSource(FetchSourceContext.parse(context)); } else { throw new ParsingException(parser.getTokenLocation(), "Unknown key for a " + token + " in [" + currentFieldName + "].", parser.getTokenLocation()); diff --git a/core/src/main/java/org/elasticsearch/search/aggregations/pipeline/PipelineAggregator.java b/core/src/main/java/org/elasticsearch/search/aggregations/pipeline/PipelineAggregator.java index 1c49415bead..e9a102438a3 100644 --- a/core/src/main/java/org/elasticsearch/search/aggregations/pipeline/PipelineAggregator.java +++ b/core/src/main/java/org/elasticsearch/search/aggregations/pipeline/PipelineAggregator.java @@ -24,7 +24,6 @@ import org.elasticsearch.common.ParseField; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.io.stream.Streamable; -import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.query.QueryParseContext; import org.elasticsearch.search.aggregations.InternalAggregation; import org.elasticsearch.search.aggregations.InternalAggregation.ReduceContext; @@ -59,15 +58,13 @@ public abstract class PipelineAggregator implements Streamable { * * @param pipelineAggregatorName * The name of the pipeline aggregation - * @param parser - * The xcontent parser * @param context * The search context * @return The resolved pipeline aggregator factory * @throws java.io.IOException * When parsing fails */ - PipelineAggregatorBuilder parse(String pipelineAggregatorName, XContentParser parser, QueryParseContext context) + PipelineAggregatorBuilder parse(String pipelineAggregatorName, QueryParseContext context) throws IOException; /** diff --git a/core/src/main/java/org/elasticsearch/search/aggregations/pipeline/bucketmetrics/BucketMetricsParser.java b/core/src/main/java/org/elasticsearch/search/aggregations/pipeline/bucketmetrics/BucketMetricsParser.java index 3682e069a22..dd2c4b20630 100644 --- a/core/src/main/java/org/elasticsearch/search/aggregations/pipeline/bucketmetrics/BucketMetricsParser.java +++ b/core/src/main/java/org/elasticsearch/search/aggregations/pipeline/bucketmetrics/BucketMetricsParser.java @@ -25,6 +25,7 @@ import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.query.QueryParseContext; import org.elasticsearch.search.aggregations.pipeline.BucketHelpers.GapPolicy; import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator; + import java.io.IOException; import java.text.ParseException; import java.util.ArrayList; @@ -44,8 +45,9 @@ public abstract class BucketMetricsParser implements PipelineAggregator.Parser { } @Override - public final BucketMetricsPipelineAggregatorBuilder parse(String pipelineAggregatorName, XContentParser parser, - QueryParseContext context) throws IOException { + public final BucketMetricsPipelineAggregatorBuilder parse(String pipelineAggregatorName, QueryParseContext context) + throws IOException { + XContentParser parser = context.parser(); XContentParser.Token token; String currentFieldName = null; String[] bucketsPaths = null; diff --git a/core/src/main/java/org/elasticsearch/search/aggregations/pipeline/bucketscript/BucketScriptParser.java b/core/src/main/java/org/elasticsearch/search/aggregations/pipeline/bucketscript/BucketScriptParser.java index 8b1fb8f06a2..91c9daecb84 100644 --- a/core/src/main/java/org/elasticsearch/search/aggregations/pipeline/bucketscript/BucketScriptParser.java +++ b/core/src/main/java/org/elasticsearch/search/aggregations/pipeline/bucketscript/BucketScriptParser.java @@ -46,8 +46,8 @@ public class BucketScriptParser implements PipelineAggregator.Parser { } @Override - public BucketScriptPipelineAggregatorBuilder parse(String reducerName, XContentParser parser, - QueryParseContext context) throws IOException { + public BucketScriptPipelineAggregatorBuilder parse(String reducerName, QueryParseContext context) throws IOException { + XContentParser parser = context.parser(); XContentParser.Token token; Script script = null; String currentFieldName = null; diff --git a/core/src/main/java/org/elasticsearch/search/aggregations/pipeline/bucketselector/BucketSelectorParser.java b/core/src/main/java/org/elasticsearch/search/aggregations/pipeline/bucketselector/BucketSelectorParser.java index ffd43795dc2..8573cc737a8 100644 --- a/core/src/main/java/org/elasticsearch/search/aggregations/pipeline/bucketselector/BucketSelectorParser.java +++ b/core/src/main/java/org/elasticsearch/search/aggregations/pipeline/bucketselector/BucketSelectorParser.java @@ -46,8 +46,8 @@ public class BucketSelectorParser implements PipelineAggregator.Parser { } @Override - public BucketSelectorPipelineAggregatorBuilder parse(String reducerName, XContentParser parser, - QueryParseContext context) throws IOException { + public BucketSelectorPipelineAggregatorBuilder parse(String reducerName, QueryParseContext context) throws IOException { + XContentParser parser = context.parser(); XContentParser.Token token; Script script = null; String currentFieldName = null; diff --git a/core/src/main/java/org/elasticsearch/search/aggregations/pipeline/cumulativesum/CumulativeSumParser.java b/core/src/main/java/org/elasticsearch/search/aggregations/pipeline/cumulativesum/CumulativeSumParser.java index fc133f28cb6..de0c9531477 100644 --- a/core/src/main/java/org/elasticsearch/search/aggregations/pipeline/cumulativesum/CumulativeSumParser.java +++ b/core/src/main/java/org/elasticsearch/search/aggregations/pipeline/cumulativesum/CumulativeSumParser.java @@ -24,6 +24,7 @@ import org.elasticsearch.common.ParsingException; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.query.QueryParseContext; import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator; + import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -40,8 +41,8 @@ public class CumulativeSumParser implements PipelineAggregator.Parser { } @Override - public CumulativeSumPipelineAggregatorBuilder parse(String pipelineAggregatorName, - XContentParser parser, QueryParseContext context) throws IOException { + public CumulativeSumPipelineAggregatorBuilder parse(String pipelineAggregatorName, QueryParseContext context) throws IOException { + XContentParser parser = context.parser(); XContentParser.Token token; String currentFieldName = null; String[] bucketsPaths = null; diff --git a/core/src/main/java/org/elasticsearch/search/aggregations/pipeline/derivative/DerivativeParser.java b/core/src/main/java/org/elasticsearch/search/aggregations/pipeline/derivative/DerivativeParser.java index eb2dbeb0070..e08efc4a23f 100644 --- a/core/src/main/java/org/elasticsearch/search/aggregations/pipeline/derivative/DerivativeParser.java +++ b/core/src/main/java/org/elasticsearch/search/aggregations/pipeline/derivative/DerivativeParser.java @@ -25,6 +25,7 @@ import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.query.QueryParseContext; import org.elasticsearch.search.aggregations.pipeline.BucketHelpers.GapPolicy; import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator; + import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -41,8 +42,8 @@ public class DerivativeParser implements PipelineAggregator.Parser { } @Override - public DerivativePipelineAggregatorBuilder parse(String pipelineAggregatorName, XContentParser parser, - QueryParseContext context) throws IOException { + public DerivativePipelineAggregatorBuilder parse(String pipelineAggregatorName, QueryParseContext context) throws IOException { + XContentParser parser = context.parser(); XContentParser.Token token; String currentFieldName = null; String[] bucketsPaths = null; diff --git a/core/src/main/java/org/elasticsearch/search/aggregations/pipeline/movavg/MovAvgParser.java b/core/src/main/java/org/elasticsearch/search/aggregations/pipeline/movavg/MovAvgParser.java index bbc2130f09a..d3af7cb95a0 100644 --- a/core/src/main/java/org/elasticsearch/search/aggregations/pipeline/movavg/MovAvgParser.java +++ b/core/src/main/java/org/elasticsearch/search/aggregations/pipeline/movavg/MovAvgParser.java @@ -56,8 +56,8 @@ public class MovAvgParser implements PipelineAggregator.Parser { } @Override - public MovAvgPipelineAggregatorBuilder parse(String pipelineAggregatorName, XContentParser parser, - QueryParseContext context) throws IOException { + public MovAvgPipelineAggregatorBuilder parse(String pipelineAggregatorName, QueryParseContext context) throws IOException { + XContentParser parser = context.parser(); XContentParser.Token token; String currentFieldName = null; String[] bucketsPaths = null; diff --git a/core/src/main/java/org/elasticsearch/search/aggregations/pipeline/serialdiff/SerialDiffParser.java b/core/src/main/java/org/elasticsearch/search/aggregations/pipeline/serialdiff/SerialDiffParser.java index 2fb02bbc550..8a2a0df2edb 100644 --- a/core/src/main/java/org/elasticsearch/search/aggregations/pipeline/serialdiff/SerialDiffParser.java +++ b/core/src/main/java/org/elasticsearch/search/aggregations/pipeline/serialdiff/SerialDiffParser.java @@ -25,6 +25,7 @@ import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.query.QueryParseContext; import org.elasticsearch.search.aggregations.pipeline.BucketHelpers.GapPolicy; import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator; + import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -41,8 +42,8 @@ public class SerialDiffParser implements PipelineAggregator.Parser { } @Override - public SerialDiffPipelineAggregatorBuilder parse(String reducerName, XContentParser parser, - QueryParseContext context) throws IOException { + public SerialDiffPipelineAggregatorBuilder parse(String reducerName, QueryParseContext context) throws IOException { + XContentParser parser = context.parser(); XContentParser.Token token; String currentFieldName = null; String[] bucketsPaths = null; diff --git a/core/src/main/java/org/elasticsearch/search/aggregations/support/AbstractValuesSourceParser.java b/core/src/main/java/org/elasticsearch/search/aggregations/support/AbstractValuesSourceParser.java index d1efc5aa699..d864fc97664 100644 --- a/core/src/main/java/org/elasticsearch/search/aggregations/support/AbstractValuesSourceParser.java +++ b/core/src/main/java/org/elasticsearch/search/aggregations/support/AbstractValuesSourceParser.java @@ -84,9 +84,10 @@ public abstract class AbstractValuesSourceParser } @Override - public final ValuesSourceAggregatorBuilder parse(String aggregationName, XContentParser parser, QueryParseContext context) + public final ValuesSourceAggregatorBuilder parse(String aggregationName, QueryParseContext context) throws IOException { + XContentParser parser = context.parser(); String field = null; Script script = null; ValueType valueType = null; diff --git a/core/src/main/java/org/elasticsearch/search/builder/SearchSourceBuilder.java b/core/src/main/java/org/elasticsearch/search/builder/SearchSourceBuilder.java index 05aebb0ca47..a9acd530dec 100644 --- a/core/src/main/java/org/elasticsearch/search/builder/SearchSourceBuilder.java +++ b/core/src/main/java/org/elasticsearch/search/builder/SearchSourceBuilder.java @@ -101,10 +101,10 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ public static final ParseField PROFILE_FIELD = new ParseField("profile"); public static final ParseField SEARCH_AFTER = new ParseField("search_after"); - public static SearchSourceBuilder fromXContent(XContentParser parser, QueryParseContext context, AggregatorParsers aggParsers, + public static SearchSourceBuilder fromXContent(QueryParseContext context, AggregatorParsers aggParsers, Suggesters suggesters) throws IOException { SearchSourceBuilder builder = new SearchSourceBuilder(); - builder.parseXContent(parser, context, aggParsers, suggesters); + builder.parseXContent(context, aggParsers, suggesters); return builder; } @@ -979,11 +979,12 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ /** * Parse some xContent into this SearchSourceBuilder, overwriting any values specified in the xContent. Use this if you need to set up * different defaults than a regular SearchSourceBuilder would have and use - * {@link #fromXContent(XContentParser, QueryParseContext, AggregatorParsers, Suggesters)} if you have normal defaults. + * {@link #fromXContent(QueryParseContext, AggregatorParsers, Suggesters)} if you have normal defaults. */ - public void parseXContent(XContentParser parser, QueryParseContext context, AggregatorParsers aggParsers, Suggesters suggesters) + public void parseXContent(QueryParseContext context, AggregatorParsers aggParsers, Suggesters suggesters) throws IOException { + XContentParser parser = context.parser(); XContentParser.Token token = parser.currentToken(); String currentFieldName = null; if (token != XContentParser.Token.START_OBJECT && (token = parser.nextToken()) != XContentParser.Token.START_OBJECT) { @@ -1011,7 +1012,7 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ } else if (context.parseFieldMatcher().match(currentFieldName, TRACK_SCORES_FIELD)) { trackScores = parser.booleanValue(); } else if (context.parseFieldMatcher().match(currentFieldName, _SOURCE_FIELD)) { - fetchSourceContext = FetchSourceContext.parse(parser, context); + fetchSourceContext = FetchSourceContext.parse(context); } else if (context.parseFieldMatcher().match(currentFieldName, FIELDS_FIELD)) { field(parser.text()); } else if (context.parseFieldMatcher().match(currentFieldName, SORT_FIELD)) { @@ -1028,11 +1029,11 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ } else if (context.parseFieldMatcher().match(currentFieldName, POST_FILTER_FIELD)) { postQueryBuilder = context.parseInnerQueryBuilder(); } else if (context.parseFieldMatcher().match(currentFieldName, _SOURCE_FIELD)) { - fetchSourceContext = FetchSourceContext.parse(parser, context); + fetchSourceContext = FetchSourceContext.parse(context); } else if (context.parseFieldMatcher().match(currentFieldName, SCRIPT_FIELDS_FIELD)) { scriptFields = new ArrayList<>(); while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { - scriptFields.add(new ScriptField(parser, context)); + scriptFields.add(new ScriptField(context)); } } else if (context.parseFieldMatcher().match(currentFieldName, INDICES_BOOST_FIELD)) { indexBoost = new ObjectFloatHashMap(); @@ -1047,11 +1048,11 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ } } } else if (context.parseFieldMatcher().match(currentFieldName, AGGREGATIONS_FIELD)) { - aggregations = aggParsers.parseAggregators(parser, context); + aggregations = aggParsers.parseAggregators(context); } else if (context.parseFieldMatcher().match(currentFieldName, HIGHLIGHT_FIELD)) { highlightBuilder = HighlightBuilder.fromXContent(context); } else if (context.parseFieldMatcher().match(currentFieldName, INNER_HITS_FIELD)) { - innerHitsBuilder = InnerHitsBuilder.fromXContent(parser, context); + innerHitsBuilder = InnerHitsBuilder.fromXContent(context); } else if (context.parseFieldMatcher().match(currentFieldName, SUGGEST_FIELD)) { suggestBuilder = SuggestBuilder.fromXContent(context, suggesters); } else if (context.parseFieldMatcher().match(currentFieldName, SORT_FIELD)) { @@ -1103,7 +1104,7 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ } } } else if (context.parseFieldMatcher().match(currentFieldName, _SOURCE_FIELD)) { - fetchSourceContext = FetchSourceContext.parse(parser, context); + fetchSourceContext = FetchSourceContext.parse(context); } else if (context.parseFieldMatcher().match(currentFieldName, SEARCH_AFTER)) { searchAfterBuilder = SearchAfterBuilder.PROTOTYPE.fromXContent(parser, context.parseFieldMatcher()); } else { @@ -1290,8 +1291,9 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ out.writeBoolean(ignoreFailure); } - public ScriptField(XContentParser parser, QueryParseContext context) throws IOException { + public ScriptField(QueryParseContext context) throws IOException { boolean ignoreFailure = false; + XContentParser parser = context.parser(); String scriptFieldName = parser.currentName(); Script script = null; @@ -1373,6 +1375,7 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ } } + @Override public int hashCode() { return Objects.hash(aggregations, explain, fetchSourceContext, fieldDataFields, fieldNames, from, highlightBuilder, indexBoost, innerHitsBuilder, minScore, postQueryBuilder, queryBuilder, rescoreBuilders, scriptFields, diff --git a/core/src/main/java/org/elasticsearch/search/fetch/source/FetchSourceContext.java b/core/src/main/java/org/elasticsearch/search/fetch/source/FetchSourceContext.java index 0d8a57729ff..891a2f09ec6 100644 --- a/core/src/main/java/org/elasticsearch/search/fetch/source/FetchSourceContext.java +++ b/core/src/main/java/org/elasticsearch/search/fetch/source/FetchSourceContext.java @@ -50,9 +50,9 @@ public class FetchSourceContext implements Streamable, ToXContent { private String[] includes; private String[] excludes; - public static FetchSourceContext parse(XContentParser parser, QueryParseContext context) throws IOException { + public static FetchSourceContext parse(QueryParseContext context) throws IOException { FetchSourceContext fetchSourceContext = new FetchSourceContext(); - fetchSourceContext.fromXContent(parser, context); + fetchSourceContext.fromXContent(context); return fetchSourceContext; } @@ -147,7 +147,8 @@ public class FetchSourceContext implements Streamable, ToXContent { return null; } - public void fromXContent(XContentParser parser, QueryParseContext context) throws IOException { + public void fromXContent(QueryParseContext context) throws IOException { + XContentParser parser = context.parser(); XContentParser.Token token = parser.currentToken(); boolean fetchSource = true; String[] includes = Strings.EMPTY_ARRAY; diff --git a/core/src/main/java/org/elasticsearch/search/highlight/HighlightBuilder.java b/core/src/main/java/org/elasticsearch/search/highlight/HighlightBuilder.java index 5eb32863f6f..d24d3f67a5d 100644 --- a/core/src/main/java/org/elasticsearch/search/highlight/HighlightBuilder.java +++ b/core/src/main/java/org/elasticsearch/search/highlight/HighlightBuilder.java @@ -21,18 +21,12 @@ package org.elasticsearch.search.highlight; import org.apache.lucene.search.Query; import org.apache.lucene.search.vectorhighlight.SimpleBoundaryScanner; -import org.elasticsearch.common.ParsingException; -import org.elasticsearch.common.io.stream.StreamInput; -import org.elasticsearch.common.io.stream.StreamOutput; -import org.elasticsearch.common.io.stream.Writeable; -import org.elasticsearch.ExceptionsHelper; import org.elasticsearch.common.ParseField; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.io.stream.Writeable; import org.elasticsearch.common.xcontent.ObjectParser; import org.elasticsearch.common.xcontent.ObjectParser.NamedObjectParser; -import org.elasticsearch.common.xcontent.ToXContent; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.query.QueryBuilder; diff --git a/core/src/main/java/org/elasticsearch/search/sort/SortBuilder.java b/core/src/main/java/org/elasticsearch/search/sort/SortBuilder.java index 9814ee102d7..4bd708d9af9 100644 --- a/core/src/main/java/org/elasticsearch/search/sort/SortBuilder.java +++ b/core/src/main/java/org/elasticsearch/search/sort/SortBuilder.java @@ -93,7 +93,7 @@ public abstract class SortBuilder> extends ToXContentTo if (token == XContentParser.Token.START_ARRAY) { while ((token = parser.nextToken()) != XContentParser.Token.END_ARRAY) { if (token == XContentParser.Token.START_OBJECT) { - parseCompoundSortField(parser, context, sortFields); + parseCompoundSortField(context, sortFields); } else if (token == XContentParser.Token.VALUE_STRING) { String fieldName = parser.text(); sortFields.add(fieldOrScoreSort(fieldName)); @@ -106,7 +106,7 @@ public abstract class SortBuilder> extends ToXContentTo String fieldName = parser.text(); sortFields.add(fieldOrScoreSort(fieldName)); } else if (token == XContentParser.Token.START_OBJECT) { - parseCompoundSortField(parser, context, sortFields); + parseCompoundSortField(context, sortFields); } else { throw new IllegalArgumentException("malformed sort format, either start with array, object, or an actual string"); } @@ -121,9 +121,10 @@ public abstract class SortBuilder> extends ToXContentTo } } - private static void parseCompoundSortField(XContentParser parser, QueryParseContext context, List> sortFields) + private static void parseCompoundSortField(QueryParseContext context, List> sortFields) throws IOException { XContentParser.Token token; + XContentParser parser = context.parser(); while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { if (token == XContentParser.Token.FIELD_NAME) { String fieldName = parser.currentName(); diff --git a/core/src/test/java/org/elasticsearch/index/query/functionscore/FunctionScoreQueryBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/functionscore/FunctionScoreQueryBuilderTests.java index bbbc069d477..ed5ee94c8ef 100644 --- a/core/src/test/java/org/elasticsearch/index/query/functionscore/FunctionScoreQueryBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/functionscore/FunctionScoreQueryBuilderTests.java @@ -35,7 +35,6 @@ import org.elasticsearch.common.lucene.search.function.FiltersFunctionScoreQuery import org.elasticsearch.common.lucene.search.function.FunctionScoreQuery; import org.elasticsearch.common.lucene.search.function.WeightFactorFunction; import org.elasticsearch.common.unit.DistanceUnit; -import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.index.query.AbstractQueryBuilder; import org.elasticsearch.index.query.AbstractQueryTestCase; @@ -725,9 +724,9 @@ public class FunctionScoreQueryBuilderTests extends AbstractQueryTestCase> assertSame(XContentParser.Token.FIELD_NAME, parser.nextToken()); assertEquals(testAgg.type.name(), parser.currentName()); assertSame(XContentParser.Token.START_OBJECT, parser.nextToken()); - AggregatorBuilder newAgg = aggParsers.parser(testAgg.getType(), parser).parse(testAgg.name, parser, parseContext); + AggregatorBuilder newAgg = aggParsers.parser(testAgg.getType(), parser).parse(testAgg.name, parseContext); assertSame(XContentParser.Token.END_OBJECT, parser.currentToken()); assertSame(XContentParser.Token.END_OBJECT, parser.nextToken()); assertSame(XContentParser.Token.END_OBJECT, parser.nextToken()); diff --git a/core/src/test/java/org/elasticsearch/search/aggregations/BasePipelineAggregationTestCase.java b/core/src/test/java/org/elasticsearch/search/aggregations/BasePipelineAggregationTestCase.java index a5bef24d5b6..a3d4ff46e42 100644 --- a/core/src/test/java/org/elasticsearch/search/aggregations/BasePipelineAggregationTestCase.java +++ b/core/src/test/java/org/elasticsearch/search/aggregations/BasePipelineAggregationTestCase.java @@ -237,8 +237,8 @@ public abstract class BasePipelineAggregationTestCase newAgg = aggParsers.pipelineParser(testAgg.getWriteableName(), parser).parse(testAgg.name(), parser, - parseContext); + PipelineAggregatorBuilder newAgg = aggParsers.pipelineParser(testAgg.getWriteableName(), parser) + .parse(testAgg.name(), parseContext); assertSame(XContentParser.Token.END_OBJECT, parser.currentToken()); assertSame(XContentParser.Token.END_OBJECT, parser.nextToken()); assertSame(XContentParser.Token.END_OBJECT, parser.nextToken()); diff --git a/core/src/test/java/org/elasticsearch/search/aggregations/bucket/geogrid/GeoHashGridParserTests.java b/core/src/test/java/org/elasticsearch/search/aggregations/bucket/geogrid/GeoHashGridParserTests.java index 4ffa8604aa3..b47227ceb0a 100644 --- a/core/src/test/java/org/elasticsearch/search/aggregations/bucket/geogrid/GeoHashGridParserTests.java +++ b/core/src/test/java/org/elasticsearch/search/aggregations/bucket/geogrid/GeoHashGridParserTests.java @@ -37,7 +37,7 @@ public class GeoHashGridParserTests extends ESTestCase { assertSame(XContentParser.Token.START_OBJECT, token); GeoHashGridParser parser = new GeoHashGridParser(); // can create a factory - assertNotNull(parser.parse("geohash_grid", stParser, parseContext)); + assertNotNull(parser.parse("geohash_grid", parseContext)); } public void testParseValidFromStrings() throws Exception { @@ -51,7 +51,7 @@ public class GeoHashGridParserTests extends ESTestCase { assertSame(XContentParser.Token.START_OBJECT, token); GeoHashGridParser parser = new GeoHashGridParser(); // can create a factory - assertNotNull(parser.parse("geohash_grid", stParser, parseContext)); + assertNotNull(parser.parse("geohash_grid", parseContext)); } public void testParseErrorOnNonIntPrecision() throws Exception { @@ -63,7 +63,7 @@ public class GeoHashGridParserTests extends ESTestCase { assertSame(XContentParser.Token.START_OBJECT, token); GeoHashGridParser parser = new GeoHashGridParser(); try { - parser.parse("geohash_grid", stParser, parseContext); + parser.parse("geohash_grid", parseContext); fail(); } catch (NumberFormatException ex) { assertEquals("For input string: \"2.0\"", ex.getMessage()); @@ -79,7 +79,7 @@ public class GeoHashGridParserTests extends ESTestCase { assertSame(XContentParser.Token.START_OBJECT, token); GeoHashGridParser parser = new GeoHashGridParser(); try { - parser.parse("geohash_grid", stParser, parseContext); + parser.parse("geohash_grid", parseContext); fail(); } catch (ParsingException ex) { assertEquals("Unexpected token VALUE_BOOLEAN [precision] in [geohash_grid].", ex.getMessage()); @@ -95,7 +95,7 @@ public class GeoHashGridParserTests extends ESTestCase { assertSame(XContentParser.Token.START_OBJECT, token); GeoHashGridParser parser = new GeoHashGridParser(); try { - parser.parse("geohash_grid", stParser, parseContext); + parser.parse("geohash_grid", parseContext); fail(); } catch (IllegalArgumentException ex) { assertEquals("Invalid geohash aggregation precision of 13. Must be between 1 and 12.", ex.getMessage()); diff --git a/core/src/test/java/org/elasticsearch/search/aggregations/bucket/significant/SignificanceHeuristicTests.java b/core/src/test/java/org/elasticsearch/search/aggregations/bucket/significant/SignificanceHeuristicTests.java index efec7c92879..14b408ca407 100644 --- a/core/src/test/java/org/elasticsearch/search/aggregations/bucket/significant/SignificanceHeuristicTests.java +++ b/core/src/test/java/org/elasticsearch/search/aggregations/bucket/significant/SignificanceHeuristicTests.java @@ -253,7 +253,7 @@ public class SignificanceHeuristicTests extends ESTestCase { parseContext.reset(stParser); parseContext.parseFieldMatcher(ParseFieldMatcher.STRICT); stParser.nextToken(); - new SignificantTermsParser(heuristicParserMapper, registry).parse("testagg", stParser, parseContext); + new SignificantTermsParser(heuristicParserMapper, registry).parse("testagg", parseContext); fail(); } catch (ElasticsearchParseException e) { assertTrue(e.getMessage().contains(expectedError)); @@ -277,7 +277,7 @@ public class SignificanceHeuristicTests extends ESTestCase { parseContext.parseFieldMatcher(ParseFieldMatcher.STRICT); stParser.nextToken(); SignificantTermsAggregatorBuilder aggregatorFactory = (SignificantTermsAggregatorBuilder) new SignificantTermsParser( - heuristicParserMapper, registry).parse("testagg", stParser, parseContext); + heuristicParserMapper, registry).parse("testagg", parseContext); stParser.nextToken(); assertThat(aggregatorFactory.getBucketCountThresholds().getMinDocCount(), equalTo(200L)); assertThat(stParser.currentToken(), equalTo(null)); diff --git a/core/src/test/java/org/elasticsearch/search/aggregations/metrics/TopHitsTests.java b/core/src/test/java/org/elasticsearch/search/aggregations/metrics/TopHitsTests.java index 05ea6148a56..bd84853d93c 100644 --- a/core/src/test/java/org/elasticsearch/search/aggregations/metrics/TopHitsTests.java +++ b/core/src/test/java/org/elasticsearch/search/aggregations/metrics/TopHitsTests.java @@ -177,7 +177,7 @@ public class TopHitsTests extends BaseAggregationTestCase newAgg = aggParsers.pipelineParser(expected.getWriteableName(), parser).parse(expected.name(), parser, + PipelineAggregatorBuilder newAgg = aggParsers.pipelineParser(expected.getWriteableName(), parser).parse(expected.name(), parseContext); assertSame(XContentParser.Token.END_OBJECT, parser.currentToken()); assertSame(XContentParser.Token.END_OBJECT, parser.nextToken()); diff --git a/core/src/test/java/org/elasticsearch/search/builder/SearchSourceBuilderTests.java b/core/src/test/java/org/elasticsearch/search/builder/SearchSourceBuilderTests.java index 2d00010eb8b..698111e0299 100644 --- a/core/src/test/java/org/elasticsearch/search/builder/SearchSourceBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/search/builder/SearchSourceBuilderTests.java @@ -454,7 +454,7 @@ public class SearchSourceBuilderTests extends ESTestCase { if (randomBoolean()) { parser.nextToken(); // sometimes we move it on the START_OBJECT to test the embedded case } - SearchSourceBuilder newBuilder = SearchSourceBuilder.fromXContent(parser, parseContext, aggParsers, suggesters); + SearchSourceBuilder newBuilder = SearchSourceBuilder.fromXContent(parseContext, aggParsers, suggesters); assertNull(parser.nextToken()); assertEquals(testBuilder, newBuilder); assertEquals(testBuilder.hashCode(), newBuilder.hashCode()); @@ -521,7 +521,7 @@ public class SearchSourceBuilderTests extends ESTestCase { { String restContent = " { \"_source\": { \"includes\": \"include\", \"excludes\": \"*.field2\"}}"; try (XContentParser parser = XContentFactory.xContent(restContent).createParser(restContent)) { - SearchSourceBuilder searchSourceBuilder = SearchSourceBuilder.fromXContent(parser, createParseContext(parser), + SearchSourceBuilder searchSourceBuilder = SearchSourceBuilder.fromXContent(createParseContext(parser), aggParsers, suggesters); assertArrayEquals(new String[]{"*.field2"}, searchSourceBuilder.fetchSource().excludes()); assertArrayEquals(new String[]{"include"}, searchSourceBuilder.fetchSource().includes()); @@ -530,7 +530,7 @@ public class SearchSourceBuilderTests extends ESTestCase { { String restContent = " { \"_source\": false}"; try (XContentParser parser = XContentFactory.xContent(restContent).createParser(restContent)) { - SearchSourceBuilder searchSourceBuilder = SearchSourceBuilder.fromXContent(parser, createParseContext(parser), + SearchSourceBuilder searchSourceBuilder = SearchSourceBuilder.fromXContent(createParseContext(parser), aggParsers, suggesters); assertArrayEquals(new String[]{}, searchSourceBuilder.fetchSource().excludes()); assertArrayEquals(new String[]{}, searchSourceBuilder.fetchSource().includes()); @@ -543,7 +543,7 @@ public class SearchSourceBuilderTests extends ESTestCase { { String restContent = " { \"sort\": \"foo\"}"; try (XContentParser parser = XContentFactory.xContent(restContent).createParser(restContent)) { - SearchSourceBuilder searchSourceBuilder = SearchSourceBuilder.fromXContent(parser, createParseContext(parser), + SearchSourceBuilder searchSourceBuilder = SearchSourceBuilder.fromXContent(createParseContext(parser), aggParsers, suggesters); assertEquals(1, searchSourceBuilder.sorts().size()); assertEquals(new FieldSortBuilder("foo"), searchSourceBuilder.sorts().get(0)); @@ -559,7 +559,7 @@ public class SearchSourceBuilderTests extends ESTestCase { " \"_score\"\n" + " ]}"; try (XContentParser parser = XContentFactory.xContent(restContent).createParser(restContent)) { - SearchSourceBuilder searchSourceBuilder = SearchSourceBuilder.fromXContent(parser, createParseContext(parser), + SearchSourceBuilder searchSourceBuilder = SearchSourceBuilder.fromXContent(createParseContext(parser), aggParsers, suggesters); assertEquals(5, searchSourceBuilder.sorts().size()); assertEquals(new FieldSortBuilder("post_date"), searchSourceBuilder.sorts().get(0)); diff --git a/modules/reindex/src/main/java/org/elasticsearch/index/reindex/RestReindexAction.java b/modules/reindex/src/main/java/org/elasticsearch/index/reindex/RestReindexAction.java index f78d4e282d3..8f6fe71d46e 100644 --- a/modules/reindex/src/main/java/org/elasticsearch/index/reindex/RestReindexAction.java +++ b/modules/reindex/src/main/java/org/elasticsearch/index/reindex/RestReindexAction.java @@ -19,6 +19,14 @@ package org.elasticsearch.index.reindex; +import static org.elasticsearch.common.unit.TimeValue.parseTimeValue; +import static org.elasticsearch.rest.RestRequest.Method.POST; +import static org.elasticsearch.rest.RestStatus.BAD_REQUEST; + +import java.io.IOException; +import java.util.List; +import java.util.Map; + import org.elasticsearch.action.WriteConsistencyLevel; import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.search.SearchRequest; @@ -45,14 +53,6 @@ import org.elasticsearch.script.Script; import org.elasticsearch.search.aggregations.AggregatorParsers; import org.elasticsearch.search.suggest.Suggesters; -import java.io.IOException; -import java.util.List; -import java.util.Map; - -import static org.elasticsearch.common.unit.TimeValue.parseTimeValue; -import static org.elasticsearch.rest.RestRequest.Method.POST; -import static org.elasticsearch.rest.RestStatus.BAD_REQUEST; - /** * Expose IndexBySearchRequest over rest. */ @@ -77,7 +77,7 @@ public class RestReindexAction extends AbstractBaseReindexRestHandler destParser = new ObjectParser<>("dest");