From e15e7f7e6e16211c0de0f7a82ab4980e4e0605d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20B=C3=BCscher?= Date: Wed, 13 Apr 2016 22:29:57 +0200 Subject: [PATCH] Remove parser argument from methods where we already pass in a parse context When we pass down both parser and QueryParseContext to a method, we cannot make sure that the parser contained in the context and the parser that is parsed as an argument have the same state. This removes the parser argument from methods where we currently have both the parser and the parse context as arguments and instead retrieves the parse from the context inside the method. --- .../percolate/TransportPercolateAction.java | 2 +- .../index/query/HasChildQueryBuilder.java | 2 +- .../index/query/HasParentQueryBuilder.java | 2 +- .../index/query/NestedQueryBuilder.java | 4 +- .../functionscore/DecayFunctionParser.java | 3 +- .../FieldValueFactorFunctionBuilder.java | 3 +- .../FunctionScoreQueryBuilder.java | 13 +- .../RandomScoreFunctionBuilder.java | 3 +- .../functionscore/ScoreFunctionParser.java | 3 +- .../ScriptScoreFunctionBuilder.java | 5 +- .../index/query/support/InnerHitBuilder.java | 10 +- .../index/query/support/InnerHitsBuilder.java | 6 +- .../action/search/RestMultiSearchAction.java | 2 +- .../rest/action/search/RestSearchAction.java | 2 +- .../elasticsearch/search/SearchService.java | 3 +- .../aggregations/AggregationParseElement.java | 2 +- .../search/aggregations/Aggregator.java | 6 +- .../aggregations/AggregatorParsers.java | 9 +- .../children/ChildrenAggregatorBuilder.java | 4 +- .../bucket/filter/FilterParser.java | 5 +- .../bucket/filters/FiltersParser.java | 3 +- .../bucket/global/GlobalParser.java | 7 +- .../bucket/nested/NestedParser.java | 5 +- .../bucket/nested/ReverseNestedParser.java | 5 +- .../bucket/sampler/SamplerParser.java | 5 +- .../scripted/ScriptedMetricParser.java | 168 ++++++++++++++++++ .../metrics/tophits/TopHitsParser.java | 10 +- .../pipeline/PipelineAggregator.java | 5 +- .../bucketmetrics/BucketMetricsParser.java | 6 +- .../bucketscript/BucketScriptParser.java | 4 +- .../bucketselector/BucketSelectorParser.java | 4 +- .../cumulativesum/CumulativeSumParser.java | 5 +- .../pipeline/derivative/DerivativeParser.java | 5 +- .../pipeline/movavg/MovAvgParser.java | 4 +- .../pipeline/serialdiff/SerialDiffParser.java | 5 +- .../support/AbstractValuesSourceParser.java | 3 +- .../search/builder/SearchSourceBuilder.java | 25 +-- .../fetch/source/FetchSourceContext.java | 7 +- .../search/highlight/HighlightBuilder.java | 6 - .../search/sort/SortBuilder.java | 7 +- .../FunctionScoreQueryBuilderTests.java | 5 +- .../query/support/InnerHitBuilderTests.java | 5 +- .../query/support/InnerHitsBuilderTests.java | 17 +- .../AggregationCollectorTests.java | 2 +- .../aggregations/AggregatorParsingTests.java | 12 +- .../aggregations/BaseAggregationTestCase.java | 2 +- .../BasePipelineAggregationTestCase.java | 4 +- .../geogrid/GeoHashGridParserTests.java | 10 +- .../SignificanceHeuristicTests.java | 4 +- .../aggregations/metrics/TopHitsTests.java | 2 +- .../pipeline/moving/avg/MovAvgTests.java | 4 +- .../builder/SearchSourceBuilderTests.java | 10 +- .../index/reindex/RestReindexAction.java | 18 +- 53 files changed, 314 insertions(+), 159 deletions(-) create mode 100644 core/src/main/java/org/elasticsearch/search/aggregations/metrics/scripted/ScriptedMetricParser.java 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");