Stricter parsing of aggregations.
- Only one aggregation type is allowed per aggregation definition. - Return an error in the parsers when an unknown field is encountered. Close #4464
This commit is contained in:
parent
5bf4e74647
commit
a7cfae4e7a
|
@ -95,6 +95,8 @@ public class AggregatorParsers {
|
||||||
} else if (token == XContentParser.Token.START_OBJECT) {
|
} else if (token == XContentParser.Token.START_OBJECT) {
|
||||||
if ("aggregations".equals(currentFieldName) || "aggs".equals(currentFieldName)) {
|
if ("aggregations".equals(currentFieldName) || "aggs".equals(currentFieldName)) {
|
||||||
subFactories = parseAggregators(parser, context, level+1);
|
subFactories = parseAggregators(parser, context, level+1);
|
||||||
|
} else if (aggregatorType != null) {
|
||||||
|
throw new SearchParseException(context, "Found two aggregation type definitions in [" + aggregationName + "]: [" + aggregatorType + "] and [" + currentFieldName + "]. Only one type is allowed.");
|
||||||
} else {
|
} else {
|
||||||
aggregatorType = currentFieldName;
|
aggregatorType = currentFieldName;
|
||||||
Aggregator.Parser aggregatorParser = parser(aggregatorType);
|
Aggregator.Parser aggregatorParser = parser(aggregatorType);
|
||||||
|
|
|
@ -32,12 +32,12 @@ import org.elasticsearch.index.mapper.core.DateFieldMapper;
|
||||||
import org.elasticsearch.script.SearchScript;
|
import org.elasticsearch.script.SearchScript;
|
||||||
import org.elasticsearch.search.SearchParseException;
|
import org.elasticsearch.search.SearchParseException;
|
||||||
import org.elasticsearch.search.aggregations.Aggregator;
|
import org.elasticsearch.search.aggregations.Aggregator;
|
||||||
|
import org.elasticsearch.search.aggregations.AggregatorFactory;
|
||||||
import org.elasticsearch.search.aggregations.support.FieldContext;
|
import org.elasticsearch.search.aggregations.support.FieldContext;
|
||||||
import org.elasticsearch.search.aggregations.support.ValuesSourceConfig;
|
import org.elasticsearch.search.aggregations.support.ValuesSourceConfig;
|
||||||
import org.elasticsearch.search.aggregations.support.numeric.NumericValuesSource;
|
import org.elasticsearch.search.aggregations.support.numeric.NumericValuesSource;
|
||||||
import org.elasticsearch.search.aggregations.support.numeric.ValueFormatter;
|
import org.elasticsearch.search.aggregations.support.numeric.ValueFormatter;
|
||||||
import org.elasticsearch.search.aggregations.support.numeric.ValueParser;
|
import org.elasticsearch.search.aggregations.support.numeric.ValueParser;
|
||||||
import org.elasticsearch.search.aggregations.AggregatorFactory;
|
|
||||||
import org.elasticsearch.search.internal.SearchContext;
|
import org.elasticsearch.search.internal.SearchContext;
|
||||||
import org.joda.time.DateTimeZone;
|
import org.joda.time.DateTimeZone;
|
||||||
|
|
||||||
|
@ -126,6 +126,8 @@ public class DateHistogramParser implements Aggregator.Parser {
|
||||||
interval = parser.text();
|
interval = parser.text();
|
||||||
} else if ("format".equals(currentFieldName)) {
|
} else if ("format".equals(currentFieldName)) {
|
||||||
format = parser.text();
|
format = parser.text();
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unknown key for a " + token + " in [" + aggregationName + "]: [" + currentFieldName + "].");
|
||||||
}
|
}
|
||||||
} else if (token == XContentParser.Token.VALUE_BOOLEAN) {
|
} else if (token == XContentParser.Token.VALUE_BOOLEAN) {
|
||||||
if ("keyed".equals(currentFieldName)) {
|
if ("keyed".equals(currentFieldName)) {
|
||||||
|
@ -134,6 +136,8 @@ public class DateHistogramParser implements Aggregator.Parser {
|
||||||
computeEmptyBuckets = parser.booleanValue();
|
computeEmptyBuckets = parser.booleanValue();
|
||||||
} else if ("script_values_sorted".equals(currentFieldName)) {
|
} else if ("script_values_sorted".equals(currentFieldName)) {
|
||||||
assumeSorted = parser.booleanValue();
|
assumeSorted = parser.booleanValue();
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unknown key for a " + token + " in [" + aggregationName + "]: [" + currentFieldName + "].");
|
||||||
}
|
}
|
||||||
} else if (token == XContentParser.Token.START_OBJECT) {
|
} else if (token == XContentParser.Token.START_OBJECT) {
|
||||||
if ("params".equals(currentFieldName)) {
|
if ("params".equals(currentFieldName)) {
|
||||||
|
@ -149,7 +153,11 @@ public class DateHistogramParser implements Aggregator.Parser {
|
||||||
//TODO should we throw an error if the value is not "asc" or "desc"???
|
//TODO should we throw an error if the value is not "asc" or "desc"???
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unknown key for a " + token + " in [" + aggregationName + "]: [" + currentFieldName + "].");
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unexpected token " + token + " in [" + aggregationName + "].");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,10 +25,10 @@ import org.elasticsearch.index.fielddata.IndexFieldData;
|
||||||
import org.elasticsearch.index.mapper.FieldMapper;
|
import org.elasticsearch.index.mapper.FieldMapper;
|
||||||
import org.elasticsearch.search.SearchParseException;
|
import org.elasticsearch.search.SearchParseException;
|
||||||
import org.elasticsearch.search.aggregations.Aggregator;
|
import org.elasticsearch.search.aggregations.Aggregator;
|
||||||
|
import org.elasticsearch.search.aggregations.AggregatorFactory;
|
||||||
import org.elasticsearch.search.aggregations.support.FieldContext;
|
import org.elasticsearch.search.aggregations.support.FieldContext;
|
||||||
import org.elasticsearch.search.aggregations.support.ValuesSourceConfig;
|
import org.elasticsearch.search.aggregations.support.ValuesSourceConfig;
|
||||||
import org.elasticsearch.search.aggregations.support.numeric.NumericValuesSource;
|
import org.elasticsearch.search.aggregations.support.numeric.NumericValuesSource;
|
||||||
import org.elasticsearch.search.aggregations.AggregatorFactory;
|
|
||||||
import org.elasticsearch.search.aggregations.support.numeric.ValueFormatter;
|
import org.elasticsearch.search.aggregations.support.numeric.ValueFormatter;
|
||||||
import org.elasticsearch.search.internal.SearchContext;
|
import org.elasticsearch.search.internal.SearchContext;
|
||||||
|
|
||||||
|
@ -75,10 +75,14 @@ public class HistogramParser implements Aggregator.Parser {
|
||||||
scriptLang = parser.text();
|
scriptLang = parser.text();
|
||||||
} else if ("format".equals(currentFieldName)) {
|
} else if ("format".equals(currentFieldName)) {
|
||||||
format = parser.text();
|
format = parser.text();
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unknown key for a " + token + " in [" + aggregationName + "]: [" + currentFieldName + "].");
|
||||||
}
|
}
|
||||||
} else if (token == XContentParser.Token.VALUE_NUMBER) {
|
} else if (token == XContentParser.Token.VALUE_NUMBER) {
|
||||||
if ("interval".equals(currentFieldName)) {
|
if ("interval".equals(currentFieldName)) {
|
||||||
interval = parser.longValue();
|
interval = parser.longValue();
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unknown key for a " + token + " in [" + aggregationName + "]: [" + currentFieldName + "].");
|
||||||
}
|
}
|
||||||
} else if (token == XContentParser.Token.VALUE_BOOLEAN) {
|
} else if (token == XContentParser.Token.VALUE_BOOLEAN) {
|
||||||
if ("keyed".equals(currentFieldName)) {
|
if ("keyed".equals(currentFieldName)) {
|
||||||
|
@ -87,6 +91,8 @@ public class HistogramParser implements Aggregator.Parser {
|
||||||
emptyBuckets = parser.booleanValue();
|
emptyBuckets = parser.booleanValue();
|
||||||
} else if ("script_values_sorted".equals(currentFieldName)) {
|
} else if ("script_values_sorted".equals(currentFieldName)) {
|
||||||
assumeSorted = parser.booleanValue();
|
assumeSorted = parser.booleanValue();
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unknown key for a " + token + " in [" + aggregationName + "]: [" + currentFieldName + "].");
|
||||||
}
|
}
|
||||||
} else if (token == XContentParser.Token.START_OBJECT) {
|
} else if (token == XContentParser.Token.START_OBJECT) {
|
||||||
if ("params".equals(currentFieldName)) {
|
if ("params".equals(currentFieldName)) {
|
||||||
|
@ -102,7 +108,11 @@ public class HistogramParser implements Aggregator.Parser {
|
||||||
//TODO should we throw an error if the value is not "asc" or "desc"???
|
//TODO should we throw an error if the value is not "asc" or "desc"???
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unknown key for a " + token + " in [" + aggregationName + "]: [" + currentFieldName + "].");
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unexpected token " + token + " in [" + aggregationName + "].");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,11 +21,12 @@ package org.elasticsearch.search.aggregations.bucket.missing;
|
||||||
|
|
||||||
import org.elasticsearch.common.xcontent.XContentParser;
|
import org.elasticsearch.common.xcontent.XContentParser;
|
||||||
import org.elasticsearch.index.mapper.FieldMapper;
|
import org.elasticsearch.index.mapper.FieldMapper;
|
||||||
|
import org.elasticsearch.search.SearchParseException;
|
||||||
import org.elasticsearch.search.aggregations.Aggregator;
|
import org.elasticsearch.search.aggregations.Aggregator;
|
||||||
|
import org.elasticsearch.search.aggregations.AggregatorFactory;
|
||||||
import org.elasticsearch.search.aggregations.support.FieldContext;
|
import org.elasticsearch.search.aggregations.support.FieldContext;
|
||||||
import org.elasticsearch.search.aggregations.support.ValuesSource;
|
import org.elasticsearch.search.aggregations.support.ValuesSource;
|
||||||
import org.elasticsearch.search.aggregations.support.ValuesSourceConfig;
|
import org.elasticsearch.search.aggregations.support.ValuesSourceConfig;
|
||||||
import org.elasticsearch.search.aggregations.AggregatorFactory;
|
|
||||||
import org.elasticsearch.search.internal.SearchContext;
|
import org.elasticsearch.search.internal.SearchContext;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -55,7 +56,11 @@ public class MissingParser implements Aggregator.Parser {
|
||||||
} else if (token == XContentParser.Token.VALUE_STRING) {
|
} else if (token == XContentParser.Token.VALUE_STRING) {
|
||||||
if ("field".equals(currentFieldName)) {
|
if ("field".equals(currentFieldName)) {
|
||||||
field = parser.text();
|
field = parser.text();
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unknown key for a " + token + " in [" + aggregationName + "]: [" + currentFieldName + "].");
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unexpected token " + token + " in [" + aggregationName + "].");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -49,7 +49,11 @@ public class NestedParser implements Aggregator.Parser {
|
||||||
} else if (token == XContentParser.Token.VALUE_STRING) {
|
} else if (token == XContentParser.Token.VALUE_STRING) {
|
||||||
if ("path".equals(currentFieldName)) {
|
if ("path".equals(currentFieldName)) {
|
||||||
path = parser.text();
|
path = parser.text();
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unknown key for a " + token + " in [" + aggregationName + "]: [" + currentFieldName + "].");
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unexpected token " + token + " in [" + aggregationName + "].");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,10 +24,10 @@ import org.elasticsearch.index.fielddata.IndexFieldData;
|
||||||
import org.elasticsearch.index.mapper.FieldMapper;
|
import org.elasticsearch.index.mapper.FieldMapper;
|
||||||
import org.elasticsearch.search.SearchParseException;
|
import org.elasticsearch.search.SearchParseException;
|
||||||
import org.elasticsearch.search.aggregations.Aggregator;
|
import org.elasticsearch.search.aggregations.Aggregator;
|
||||||
|
import org.elasticsearch.search.aggregations.AggregatorFactory;
|
||||||
import org.elasticsearch.search.aggregations.support.FieldContext;
|
import org.elasticsearch.search.aggregations.support.FieldContext;
|
||||||
import org.elasticsearch.search.aggregations.support.ValuesSourceConfig;
|
import org.elasticsearch.search.aggregations.support.ValuesSourceConfig;
|
||||||
import org.elasticsearch.search.aggregations.support.numeric.NumericValuesSource;
|
import org.elasticsearch.search.aggregations.support.numeric.NumericValuesSource;
|
||||||
import org.elasticsearch.search.aggregations.AggregatorFactory;
|
|
||||||
import org.elasticsearch.search.internal.SearchContext;
|
import org.elasticsearch.search.internal.SearchContext;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -70,6 +70,8 @@ public class RangeParser implements Aggregator.Parser {
|
||||||
script = parser.text();
|
script = parser.text();
|
||||||
} else if ("lang".equals(currentFieldName)) {
|
} else if ("lang".equals(currentFieldName)) {
|
||||||
scriptLang = parser.text();
|
scriptLang = parser.text();
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unknown key for a " + token + " in [" + aggregationName + "]: [" + currentFieldName + "].");
|
||||||
}
|
}
|
||||||
} else if (token == XContentParser.Token.START_ARRAY) {
|
} else if (token == XContentParser.Token.START_ARRAY) {
|
||||||
if ("ranges".equals(currentFieldName)) {
|
if ("ranges".equals(currentFieldName)) {
|
||||||
|
@ -102,17 +104,25 @@ public class RangeParser implements Aggregator.Parser {
|
||||||
}
|
}
|
||||||
ranges.add(new RangeAggregator.Range(key, from, fromAsStr, to, toAsStr));
|
ranges.add(new RangeAggregator.Range(key, from, fromAsStr, to, toAsStr));
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unknown key for a " + token + " in [" + aggregationName + "]: [" + currentFieldName + "].");
|
||||||
}
|
}
|
||||||
} else if (token == XContentParser.Token.START_OBJECT) {
|
} else if (token == XContentParser.Token.START_OBJECT) {
|
||||||
if ("params".equals(currentFieldName)) {
|
if ("params".equals(currentFieldName)) {
|
||||||
scriptParams = parser.map();
|
scriptParams = parser.map();
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unknown key for a " + token + " in [" + aggregationName + "]: [" + currentFieldName + "].");
|
||||||
}
|
}
|
||||||
} else if (token == XContentParser.Token.VALUE_BOOLEAN) {
|
} else if (token == XContentParser.Token.VALUE_BOOLEAN) {
|
||||||
if ("keyed".equals(currentFieldName)) {
|
if ("keyed".equals(currentFieldName)) {
|
||||||
keyed = parser.booleanValue();
|
keyed = parser.booleanValue();
|
||||||
} else if ("script_values_sorted".equals(currentFieldName)) {
|
} else if ("script_values_sorted".equals(currentFieldName)) {
|
||||||
assumeSorted = parser.booleanValue();
|
assumeSorted = parser.booleanValue();
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unknown key for a " + token + " in [" + aggregationName + "]: [" + currentFieldName + "].");
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unexpected token " + token + " in [" + aggregationName + "].");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -51,7 +51,9 @@ public class DateRangeBuilder extends AbstractRangeBuilder<DateRangeBuilder> {
|
||||||
@Override
|
@Override
|
||||||
protected XContentBuilder doInternalXContent(XContentBuilder builder, Params params) throws IOException {
|
protected XContentBuilder doInternalXContent(XContentBuilder builder, Params params) throws IOException {
|
||||||
super.doInternalXContent(builder, params);
|
super.doInternalXContent(builder, params);
|
||||||
builder.field("format", format);
|
if (format != null) {
|
||||||
|
builder.field("format", format);
|
||||||
|
}
|
||||||
return builder;
|
return builder;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,13 +26,13 @@ import org.elasticsearch.index.mapper.core.DateFieldMapper;
|
||||||
import org.elasticsearch.search.SearchParseException;
|
import org.elasticsearch.search.SearchParseException;
|
||||||
import org.elasticsearch.search.aggregations.AggregationExecutionException;
|
import org.elasticsearch.search.aggregations.AggregationExecutionException;
|
||||||
import org.elasticsearch.search.aggregations.Aggregator;
|
import org.elasticsearch.search.aggregations.Aggregator;
|
||||||
|
import org.elasticsearch.search.aggregations.AggregatorFactory;
|
||||||
import org.elasticsearch.search.aggregations.bucket.range.RangeAggregator;
|
import org.elasticsearch.search.aggregations.bucket.range.RangeAggregator;
|
||||||
import org.elasticsearch.search.aggregations.support.FieldContext;
|
import org.elasticsearch.search.aggregations.support.FieldContext;
|
||||||
import org.elasticsearch.search.aggregations.support.ValuesSourceConfig;
|
import org.elasticsearch.search.aggregations.support.ValuesSourceConfig;
|
||||||
import org.elasticsearch.search.aggregations.support.numeric.NumericValuesSource;
|
import org.elasticsearch.search.aggregations.support.numeric.NumericValuesSource;
|
||||||
import org.elasticsearch.search.aggregations.support.numeric.ValueFormatter;
|
import org.elasticsearch.search.aggregations.support.numeric.ValueFormatter;
|
||||||
import org.elasticsearch.search.aggregations.support.numeric.ValueParser;
|
import org.elasticsearch.search.aggregations.support.numeric.ValueParser;
|
||||||
import org.elasticsearch.search.aggregations.AggregatorFactory;
|
|
||||||
import org.elasticsearch.search.internal.SearchContext;
|
import org.elasticsearch.search.internal.SearchContext;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -78,6 +78,8 @@ public class DateRangeParser implements Aggregator.Parser {
|
||||||
scriptLang = parser.text();
|
scriptLang = parser.text();
|
||||||
} else if ("format".equals(currentFieldName)) {
|
} else if ("format".equals(currentFieldName)) {
|
||||||
format = parser.text();
|
format = parser.text();
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unknown key for a " + token + " in [" + aggregationName + "]: [" + currentFieldName + "].");
|
||||||
}
|
}
|
||||||
} else if (token == XContentParser.Token.START_ARRAY) {
|
} else if (token == XContentParser.Token.START_ARRAY) {
|
||||||
if ("ranges".equals(currentFieldName)) {
|
if ("ranges".equals(currentFieldName)) {
|
||||||
|
@ -97,6 +99,8 @@ public class DateRangeParser implements Aggregator.Parser {
|
||||||
from = parser.doubleValue();
|
from = parser.doubleValue();
|
||||||
} else if ("to".equals(toOrFromOrKey)) {
|
} else if ("to".equals(toOrFromOrKey)) {
|
||||||
to = parser.doubleValue();
|
to = parser.doubleValue();
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unknown key for a " + token + " in [" + aggregationName + "]: [" + currentFieldName + "].");
|
||||||
}
|
}
|
||||||
} else if (token == XContentParser.Token.VALUE_STRING) {
|
} else if (token == XContentParser.Token.VALUE_STRING) {
|
||||||
if ("from".equals(toOrFromOrKey)) {
|
if ("from".equals(toOrFromOrKey)) {
|
||||||
|
@ -105,6 +109,8 @@ public class DateRangeParser implements Aggregator.Parser {
|
||||||
toAsStr = parser.text();
|
toAsStr = parser.text();
|
||||||
} else if ("key".equals(toOrFromOrKey)) {
|
} else if ("key".equals(toOrFromOrKey)) {
|
||||||
key = parser.text();
|
key = parser.text();
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unknown key for a " + token + " in [" + aggregationName + "]: [" + currentFieldName + "].");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -114,13 +120,19 @@ public class DateRangeParser implements Aggregator.Parser {
|
||||||
} else if (token == XContentParser.Token.START_OBJECT) {
|
} else if (token == XContentParser.Token.START_OBJECT) {
|
||||||
if ("params".equals(currentFieldName)) {
|
if ("params".equals(currentFieldName)) {
|
||||||
scriptParams = parser.map();
|
scriptParams = parser.map();
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unknown key for a " + token + " in [" + aggregationName + "]: [" + currentFieldName + "].");
|
||||||
}
|
}
|
||||||
} else if (token == XContentParser.Token.VALUE_BOOLEAN) {
|
} else if (token == XContentParser.Token.VALUE_BOOLEAN) {
|
||||||
if ("keyed".equals(currentFieldName)) {
|
if ("keyed".equals(currentFieldName)) {
|
||||||
keyed = parser.booleanValue();
|
keyed = parser.booleanValue();
|
||||||
} else if ("script_values_sorted".equals(currentFieldName)) {
|
} else if ("script_values_sorted".equals(currentFieldName)) {
|
||||||
assumeSorted = parser.booleanValue();
|
assumeSorted = parser.booleanValue();
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unknown key for a " + token + " in [" + aggregationName + "]: [" + currentFieldName + "].");
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unexpected token " + token + " in [" + aggregationName + "].");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -27,17 +27,13 @@ import org.elasticsearch.index.fielddata.*;
|
||||||
import org.elasticsearch.index.mapper.FieldMapper;
|
import org.elasticsearch.index.mapper.FieldMapper;
|
||||||
import org.elasticsearch.search.SearchParseException;
|
import org.elasticsearch.search.SearchParseException;
|
||||||
import org.elasticsearch.search.aggregations.Aggregator;
|
import org.elasticsearch.search.aggregations.Aggregator;
|
||||||
|
import org.elasticsearch.search.aggregations.AggregatorFactory;
|
||||||
import org.elasticsearch.search.aggregations.bucket.range.AbstractRangeBase;
|
import org.elasticsearch.search.aggregations.bucket.range.AbstractRangeBase;
|
||||||
import org.elasticsearch.search.aggregations.bucket.range.RangeAggregator;
|
import org.elasticsearch.search.aggregations.bucket.range.RangeAggregator;
|
||||||
import org.elasticsearch.search.aggregations.bucket.range.RangeAggregator.Unmapped;
|
import org.elasticsearch.search.aggregations.bucket.range.RangeAggregator.Unmapped;
|
||||||
import org.elasticsearch.search.aggregations.support.AggregationContext;
|
import org.elasticsearch.search.aggregations.support.*;
|
||||||
import org.elasticsearch.search.aggregations.support.FieldContext;
|
|
||||||
import org.elasticsearch.search.aggregations.support.FieldDataSource;
|
|
||||||
import org.elasticsearch.search.aggregations.support.ValuesSourceConfig;
|
|
||||||
import org.elasticsearch.search.aggregations.support.geopoints.GeoPointValuesSource;
|
import org.elasticsearch.search.aggregations.support.geopoints.GeoPointValuesSource;
|
||||||
import org.elasticsearch.search.aggregations.support.numeric.NumericValuesSource;
|
import org.elasticsearch.search.aggregations.support.numeric.NumericValuesSource;
|
||||||
import org.elasticsearch.search.aggregations.AggregatorFactory;
|
|
||||||
import org.elasticsearch.search.aggregations.support.ValueSourceAggregatorFactory;
|
|
||||||
import org.elasticsearch.search.internal.SearchContext;
|
import org.elasticsearch.search.internal.SearchContext;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -90,10 +86,14 @@ public class GeoDistanceParser implements Aggregator.Parser {
|
||||||
} else if ("point".equals(currentFieldName) || "origin".equals(currentFieldName) || "center".equals(currentFieldName)) {
|
} else if ("point".equals(currentFieldName) || "origin".equals(currentFieldName) || "center".equals(currentFieldName)) {
|
||||||
origin = new GeoPoint();
|
origin = new GeoPoint();
|
||||||
origin.resetFromString(parser.text());
|
origin.resetFromString(parser.text());
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unknown key for a " + token + " in [" + aggregationName + "]: [" + currentFieldName + "].");
|
||||||
}
|
}
|
||||||
} else if (token == XContentParser.Token.VALUE_BOOLEAN) {
|
} else if (token == XContentParser.Token.VALUE_BOOLEAN) {
|
||||||
if ("keyed".equals(currentFieldName)) {
|
if ("keyed".equals(currentFieldName)) {
|
||||||
keyed = parser.booleanValue();
|
keyed = parser.booleanValue();
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unknown key for a " + token + " in [" + aggregationName + "]: [" + currentFieldName + "].");
|
||||||
}
|
}
|
||||||
} else if (token == XContentParser.Token.START_ARRAY) {
|
} else if (token == XContentParser.Token.START_ARRAY) {
|
||||||
if ("ranges".equals(currentFieldName)) {
|
if ("ranges".equals(currentFieldName)) {
|
||||||
|
@ -140,6 +140,8 @@ public class GeoDistanceParser implements Aggregator.Parser {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
origin = new GeoPoint(lat, lon);
|
origin = new GeoPoint(lat, lon);
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unknown key for a " + token + " in [" + aggregationName + "]: [" + currentFieldName + "].");
|
||||||
}
|
}
|
||||||
} else if (token == XContentParser.Token.START_OBJECT) {
|
} else if (token == XContentParser.Token.START_OBJECT) {
|
||||||
if ("point".equals(currentFieldName) || "origin".equals(currentFieldName) || "center".equals(currentFieldName)) {
|
if ("point".equals(currentFieldName) || "origin".equals(currentFieldName) || "center".equals(currentFieldName)) {
|
||||||
|
@ -161,7 +163,11 @@ public class GeoDistanceParser implements Aggregator.Parser {
|
||||||
"missing in geo_distance aggregator [" + aggregationName + "]");
|
"missing in geo_distance aggregator [" + aggregationName + "]");
|
||||||
}
|
}
|
||||||
origin = new GeoPoint(lat, lon);
|
origin = new GeoPoint(lat, lon);
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unknown key for a " + token + " in [" + aggregationName + "]: [" + currentFieldName + "].");
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unexpected token " + token + " in [" + aggregationName + "].");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,13 +26,13 @@ import org.elasticsearch.index.mapper.ip.IpFieldMapper;
|
||||||
import org.elasticsearch.search.SearchParseException;
|
import org.elasticsearch.search.SearchParseException;
|
||||||
import org.elasticsearch.search.aggregations.AggregationExecutionException;
|
import org.elasticsearch.search.aggregations.AggregationExecutionException;
|
||||||
import org.elasticsearch.search.aggregations.Aggregator;
|
import org.elasticsearch.search.aggregations.Aggregator;
|
||||||
|
import org.elasticsearch.search.aggregations.AggregatorFactory;
|
||||||
import org.elasticsearch.search.aggregations.bucket.range.RangeAggregator;
|
import org.elasticsearch.search.aggregations.bucket.range.RangeAggregator;
|
||||||
import org.elasticsearch.search.aggregations.support.FieldContext;
|
import org.elasticsearch.search.aggregations.support.FieldContext;
|
||||||
import org.elasticsearch.search.aggregations.support.ValuesSourceConfig;
|
import org.elasticsearch.search.aggregations.support.ValuesSourceConfig;
|
||||||
import org.elasticsearch.search.aggregations.support.numeric.NumericValuesSource;
|
import org.elasticsearch.search.aggregations.support.numeric.NumericValuesSource;
|
||||||
import org.elasticsearch.search.aggregations.support.numeric.ValueFormatter;
|
import org.elasticsearch.search.aggregations.support.numeric.ValueFormatter;
|
||||||
import org.elasticsearch.search.aggregations.support.numeric.ValueParser;
|
import org.elasticsearch.search.aggregations.support.numeric.ValueParser;
|
||||||
import org.elasticsearch.search.aggregations.AggregatorFactory;
|
|
||||||
import org.elasticsearch.search.internal.SearchContext;
|
import org.elasticsearch.search.internal.SearchContext;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -75,6 +75,8 @@ public class IpRangeParser implements Aggregator.Parser {
|
||||||
script = parser.text();
|
script = parser.text();
|
||||||
} else if ("lang".equals(currentFieldName)) {
|
} else if ("lang".equals(currentFieldName)) {
|
||||||
scriptLang = parser.text();
|
scriptLang = parser.text();
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unknown key for a " + token + " in [" + aggregationName + "]: [" + currentFieldName + "].");
|
||||||
}
|
}
|
||||||
} else if (token == XContentParser.Token.START_ARRAY) {
|
} else if (token == XContentParser.Token.START_ARRAY) {
|
||||||
if ("ranges".equals(currentFieldName)) {
|
if ("ranges".equals(currentFieldName)) {
|
||||||
|
@ -114,17 +116,25 @@ public class IpRangeParser implements Aggregator.Parser {
|
||||||
}
|
}
|
||||||
ranges.add(range);
|
ranges.add(range);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unknown key for a " + token + " in [" + aggregationName + "]: [" + currentFieldName + "].");
|
||||||
}
|
}
|
||||||
} else if (token == XContentParser.Token.START_OBJECT) {
|
} else if (token == XContentParser.Token.START_OBJECT) {
|
||||||
if ("params".equals(currentFieldName)) {
|
if ("params".equals(currentFieldName)) {
|
||||||
scriptParams = parser.map();
|
scriptParams = parser.map();
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unknown key for a " + token + " in [" + aggregationName + "]: [" + currentFieldName + "].");
|
||||||
}
|
}
|
||||||
} else if (token == XContentParser.Token.VALUE_BOOLEAN) {
|
} else if (token == XContentParser.Token.VALUE_BOOLEAN) {
|
||||||
if ("keyed".equals(currentFieldName)) {
|
if ("keyed".equals(currentFieldName)) {
|
||||||
keyed = parser.booleanValue();
|
keyed = parser.booleanValue();
|
||||||
} else if ("script_values_sorted".equals(currentFieldName)) {
|
} else if ("script_values_sorted".equals(currentFieldName)) {
|
||||||
assumeSorted = parser.booleanValue();
|
assumeSorted = parser.booleanValue();
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unknown key for a " + token + " in [" + aggregationName + "]: [" + currentFieldName + "].");
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unexpected token " + token + " in [" + aggregationName + "].");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -97,16 +97,22 @@ public class TermsParser implements Aggregator.Parser {
|
||||||
exclude = parser.text();
|
exclude = parser.text();
|
||||||
} else if ("execution_hint".equals(currentFieldName) || "executionHint".equals(currentFieldName)) {
|
} else if ("execution_hint".equals(currentFieldName) || "executionHint".equals(currentFieldName)) {
|
||||||
executionHint = parser.text();
|
executionHint = parser.text();
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unknown key for a " + token + " in [" + aggregationName + "]: [" + currentFieldName + "].");
|
||||||
}
|
}
|
||||||
} else if (token == XContentParser.Token.VALUE_BOOLEAN) {
|
} else if (token == XContentParser.Token.VALUE_BOOLEAN) {
|
||||||
if ("script_values_unique".equals(currentFieldName)) {
|
if ("script_values_unique".equals(currentFieldName)) {
|
||||||
assumeUnique = parser.booleanValue();
|
assumeUnique = parser.booleanValue();
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unknown key for a " + token + " in [" + aggregationName + "]: [" + currentFieldName + "].");
|
||||||
}
|
}
|
||||||
} else if (token == XContentParser.Token.VALUE_NUMBER) {
|
} else if (token == XContentParser.Token.VALUE_NUMBER) {
|
||||||
if ("size".equals(currentFieldName)) {
|
if ("size".equals(currentFieldName)) {
|
||||||
requiredSize = parser.intValue();
|
requiredSize = parser.intValue();
|
||||||
} else if ("shard_size".equals(currentFieldName) || "shardSize".equals(currentFieldName)) {
|
} else if ("shard_size".equals(currentFieldName) || "shardSize".equals(currentFieldName)) {
|
||||||
shardSize = parser.intValue();
|
shardSize = parser.intValue();
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unknown key for a " + token + " in [" + aggregationName + "]: [" + currentFieldName + "].");
|
||||||
}
|
}
|
||||||
} else if (token == XContentParser.Token.START_OBJECT) {
|
} else if (token == XContentParser.Token.START_OBJECT) {
|
||||||
if ("params".equals(currentFieldName)) {
|
if ("params".equals(currentFieldName)) {
|
||||||
|
@ -124,6 +130,8 @@ public class TermsParser implements Aggregator.Parser {
|
||||||
} else {
|
} else {
|
||||||
throw new SearchParseException(context, "Unknown terms order direction [" + dir + "] in terms aggregation [" + aggregationName + "]");
|
throw new SearchParseException(context, "Unknown terms order direction [" + dir + "] in terms aggregation [" + aggregationName + "]");
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unexpected token " + token + " for [order] in [" + aggregationName + "].");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if ("include".equals(currentFieldName)) {
|
} else if ("include".equals(currentFieldName)) {
|
||||||
|
@ -158,7 +166,11 @@ public class TermsParser implements Aggregator.Parser {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unknown key for a " + token + " in [" + aggregationName + "]: [" + currentFieldName + "].");
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unexpected token " + token + " in [" + aggregationName + "].");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,11 +22,12 @@ package org.elasticsearch.search.aggregations.metrics;
|
||||||
import org.elasticsearch.common.xcontent.XContentParser;
|
import org.elasticsearch.common.xcontent.XContentParser;
|
||||||
import org.elasticsearch.index.fielddata.IndexFieldData;
|
import org.elasticsearch.index.fielddata.IndexFieldData;
|
||||||
import org.elasticsearch.index.mapper.FieldMapper;
|
import org.elasticsearch.index.mapper.FieldMapper;
|
||||||
|
import org.elasticsearch.search.SearchParseException;
|
||||||
import org.elasticsearch.search.aggregations.Aggregator;
|
import org.elasticsearch.search.aggregations.Aggregator;
|
||||||
|
import org.elasticsearch.search.aggregations.AggregatorFactory;
|
||||||
import org.elasticsearch.search.aggregations.support.FieldContext;
|
import org.elasticsearch.search.aggregations.support.FieldContext;
|
||||||
import org.elasticsearch.search.aggregations.support.ValuesSourceConfig;
|
import org.elasticsearch.search.aggregations.support.ValuesSourceConfig;
|
||||||
import org.elasticsearch.search.aggregations.support.numeric.NumericValuesSource;
|
import org.elasticsearch.search.aggregations.support.numeric.NumericValuesSource;
|
||||||
import org.elasticsearch.search.aggregations.AggregatorFactory;
|
|
||||||
import org.elasticsearch.search.internal.SearchContext;
|
import org.elasticsearch.search.internal.SearchContext;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -64,15 +65,23 @@ public abstract class ValuesSourceMetricsAggregatorParser<S extends MetricsAggre
|
||||||
script = parser.text();
|
script = parser.text();
|
||||||
} else if ("lang".equals(currentFieldName)) {
|
} else if ("lang".equals(currentFieldName)) {
|
||||||
scriptLang = parser.text();
|
scriptLang = parser.text();
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unknown key for a " + token + " in [" + aggregationName + "]: [" + currentFieldName + "].");
|
||||||
}
|
}
|
||||||
} else if (token == XContentParser.Token.START_OBJECT) {
|
} else if (token == XContentParser.Token.START_OBJECT) {
|
||||||
if ("params".equals(currentFieldName)) {
|
if ("params".equals(currentFieldName)) {
|
||||||
scriptParams = parser.map();
|
scriptParams = parser.map();
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unknown key for a " + token + " in [" + aggregationName + "]: [" + currentFieldName + "].");
|
||||||
}
|
}
|
||||||
} else if (token == XContentParser.Token.VALUE_BOOLEAN) {
|
} else if (token == XContentParser.Token.VALUE_BOOLEAN) {
|
||||||
if ("script_values_sorted".equals(currentFieldName)) {
|
if ("script_values_sorted".equals(currentFieldName)) {
|
||||||
assumeSorted = parser.booleanValue();
|
assumeSorted = parser.booleanValue();
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unknown key for a " + token + " in [" + aggregationName + "]: [" + currentFieldName + "].");
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unexpected token " + token + " in [" + aggregationName + "].");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,11 +22,12 @@ package org.elasticsearch.search.aggregations.metrics.valuecount;
|
||||||
import org.elasticsearch.common.xcontent.XContentParser;
|
import org.elasticsearch.common.xcontent.XContentParser;
|
||||||
import org.elasticsearch.index.fielddata.IndexFieldData;
|
import org.elasticsearch.index.fielddata.IndexFieldData;
|
||||||
import org.elasticsearch.index.mapper.FieldMapper;
|
import org.elasticsearch.index.mapper.FieldMapper;
|
||||||
|
import org.elasticsearch.search.SearchParseException;
|
||||||
import org.elasticsearch.search.aggregations.Aggregator;
|
import org.elasticsearch.search.aggregations.Aggregator;
|
||||||
|
import org.elasticsearch.search.aggregations.AggregatorFactory;
|
||||||
import org.elasticsearch.search.aggregations.support.FieldContext;
|
import org.elasticsearch.search.aggregations.support.FieldContext;
|
||||||
import org.elasticsearch.search.aggregations.support.ValuesSourceConfig;
|
import org.elasticsearch.search.aggregations.support.ValuesSourceConfig;
|
||||||
import org.elasticsearch.search.aggregations.support.bytes.BytesValuesSource;
|
import org.elasticsearch.search.aggregations.support.bytes.BytesValuesSource;
|
||||||
import org.elasticsearch.search.aggregations.AggregatorFactory;
|
|
||||||
import org.elasticsearch.search.internal.SearchContext;
|
import org.elasticsearch.search.internal.SearchContext;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -56,7 +57,11 @@ public class ValueCountParser implements Aggregator.Parser {
|
||||||
} else if (token == XContentParser.Token.VALUE_STRING) {
|
} else if (token == XContentParser.Token.VALUE_STRING) {
|
||||||
if ("field".equals(currentFieldName)) {
|
if ("field".equals(currentFieldName)) {
|
||||||
field = parser.text();
|
field = parser.text();
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unknown key for a " + token + " in [" + aggregationName + "]: [" + currentFieldName + "].");
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
throw new SearchParseException(context, "Unexpected token " + token + " in [" + aggregationName + "].");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,49 @@
|
||||||
|
/*
|
||||||
|
* Licensed to ElasticSearch and Shay Banon 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;
|
||||||
|
|
||||||
|
import org.elasticsearch.action.search.SearchPhaseExecutionException;
|
||||||
|
import org.elasticsearch.common.xcontent.json.JsonXContent;
|
||||||
|
import org.elasticsearch.test.ElasticsearchIntegrationTest;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class ParsingTests extends ElasticsearchIntegrationTest {
|
||||||
|
|
||||||
|
@Test(expected=SearchPhaseExecutionException.class)
|
||||||
|
public void testTwoTypes() throws Exception {
|
||||||
|
createIndex("idx");
|
||||||
|
client().prepareSearch("idx").setAggregations(JsonXContent.contentBuilder()
|
||||||
|
.startObject()
|
||||||
|
.startObject("in_stock")
|
||||||
|
.startObject("filter")
|
||||||
|
.startObject("range")
|
||||||
|
.startObject("stock")
|
||||||
|
.field("gt", 0)
|
||||||
|
.endObject()
|
||||||
|
.endObject()
|
||||||
|
.endObject()
|
||||||
|
.startObject("terms")
|
||||||
|
.field("field", "stock")
|
||||||
|
.endObject()
|
||||||
|
.endObject()
|
||||||
|
.endObject()).execute().actionGet();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue