diff --git a/distribution/archives/integ-test-zip/src/test/java/org/elasticsearch/test/rest/NodeRestUsageIT.java b/distribution/archives/integ-test-zip/src/test/java/org/elasticsearch/test/rest/NodeRestUsageIT.java index de8bcdd9d6b4f..516bdb78a8c4d 100644 --- a/distribution/archives/integ-test-zip/src/test/java/org/elasticsearch/test/rest/NodeRestUsageIT.java +++ b/distribution/archives/integ-test-zip/src/test/java/org/elasticsearch/test/rest/NodeRestUsageIT.java @@ -180,10 +180,10 @@ public void testAggregationUsage() throws IOException { Map> afterCombinedAggsUsage = getTotalUsage(nodesMap); - assertDiff(beforeCombinedAggsUsage, afterCombinedAggsUsage, "terms", "numeric", 1L); + assertDiff(beforeCombinedAggsUsage, afterCombinedAggsUsage, "terms", "long", 1L); assertDiff(beforeCombinedAggsUsage, afterCombinedAggsUsage, "terms", "date", 1L); assertDiff(beforeCombinedAggsUsage, afterCombinedAggsUsage, "terms", "keyword", 2L); - assertDiff(beforeCombinedAggsUsage, afterCombinedAggsUsage, "avg", "numeric", 3L); + assertDiff(beforeCombinedAggsUsage, afterCombinedAggsUsage, "avg", "long", 3L); } private void assertDiff( diff --git a/modules/aggs-matrix-stats/src/main/java/org/elasticsearch/search/aggregations/matrix/ArrayValuesSourceAggregationBuilder.java b/modules/aggs-matrix-stats/src/main/java/org/elasticsearch/search/aggregations/matrix/ArrayValuesSourceAggregationBuilder.java index 1d945d1265fb9..288a07aed09a2 100644 --- a/modules/aggs-matrix-stats/src/main/java/org/elasticsearch/search/aggregations/matrix/ArrayValuesSourceAggregationBuilder.java +++ b/modules/aggs-matrix-stats/src/main/java/org/elasticsearch/search/aggregations/matrix/ArrayValuesSourceAggregationBuilder.java @@ -201,7 +201,7 @@ protected Map resolveConfig(AggregationContext conte for (String field : fields) { ValuesSourceConfig config = ValuesSourceConfig.resolveUnregistered( context, - userValueTypeHint, + userValueTypeHint == null ? null : userValueTypeHint.getValuesSourceType(), field, null, missingMap.get(field), diff --git a/modules/aggs-matrix-stats/src/main/java/org/elasticsearch/search/aggregations/matrix/ArrayValuesSourceParser.java b/modules/aggs-matrix-stats/src/main/java/org/elasticsearch/search/aggregations/matrix/ArrayValuesSourceParser.java index 68daf3e8dbb6d..c4ca9b2663918 100644 --- a/modules/aggs-matrix-stats/src/main/java/org/elasticsearch/search/aggregations/matrix/ArrayValuesSourceParser.java +++ b/modules/aggs-matrix-stats/src/main/java/org/elasticsearch/search/aggregations/matrix/ArrayValuesSourceParser.java @@ -31,8 +31,9 @@ public abstract class ArrayValuesSourceParser implement public abstract static class NumericValuesSourceParser extends ArrayValuesSourceParser { + // TODO: Long Support? IDK what we should do here. protected NumericValuesSourceParser(boolean formattable) { - super(formattable, CoreValuesSourceType.NUMERIC, ValueType.NUMERIC); + super(formattable, CoreValuesSourceType.DOUBLE, ValueType.NUMERIC); } } diff --git a/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/bucket/terms/StringTermsIT.java b/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/bucket/terms/StringTermsIT.java index 3735537c3fa36..06ad6eb3295a9 100644 --- a/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/bucket/terms/StringTermsIT.java +++ b/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/bucket/terms/StringTermsIT.java @@ -33,7 +33,6 @@ import org.elasticsearch.search.aggregations.support.ValueType; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.test.ESIntegTestCase; -import org.elasticsearch.xcontent.XContentParseException; import org.elasticsearch.xcontent.XContentParser; import org.elasticsearch.xcontent.json.JsonXContent; import org.junit.After; @@ -1389,16 +1388,20 @@ public void testScriptWithValueType() throws Exception { assertThat(terms.getBuckets().size(), equalTo(1)); } - String invalidValueType = source.replaceAll("\"value_type\":\"n.*\"", "\"value_type\":\"foobar\""); + String invalidValueType = source.replaceAll("\"value_type\":\"n.*?\"", "\"value_type\":\"foobar\""); try (XContentParser parser = createParser(JsonXContent.jsonXContent, invalidValueType)) { - XContentParseException ex = expectThrows( - XContentParseException.class, + SearchPhaseExecutionException ex = expectThrows( + SearchPhaseExecutionException.class, () -> client().prepareSearch("idx").setSource(SearchSourceBuilder.fromXContent(parser)).get() ); - assertThat(ex.getCause(), instanceOf(IllegalArgumentException.class)); + + assertThat(ex.getCause(), instanceOf(ElasticsearchException.class)); assertThat(ex.getCause().getMessage(), containsString("Unknown value type [foobar]")); + assertThat(ex.getCause().getCause(), instanceOf(IllegalArgumentException.class)); + assertThat(ex.getCause().getCause().getMessage(), containsString("Unknown value type [foobar]")); + } } diff --git a/server/src/main/java/org/elasticsearch/index/fielddata/DoubleScriptFieldData.java b/server/src/main/java/org/elasticsearch/index/fielddata/DoubleScriptFieldData.java index 287e041e0764d..162b1936b7c81 100644 --- a/server/src/main/java/org/elasticsearch/index/fielddata/DoubleScriptFieldData.java +++ b/server/src/main/java/org/elasticsearch/index/fielddata/DoubleScriptFieldData.java @@ -58,7 +58,7 @@ public String getFieldName() { @Override public ValuesSourceType getValuesSourceType() { - return CoreValuesSourceType.NUMERIC; + return CoreValuesSourceType.DOUBLE; } @Override diff --git a/server/src/main/java/org/elasticsearch/index/fielddata/IndexNumericFieldData.java b/server/src/main/java/org/elasticsearch/index/fielddata/IndexNumericFieldData.java index dce94649e0088..445905a04aa32 100644 --- a/server/src/main/java/org/elasticsearch/index/fielddata/IndexNumericFieldData.java +++ b/server/src/main/java/org/elasticsearch/index/fielddata/IndexNumericFieldData.java @@ -39,15 +39,15 @@ public abstract class IndexNumericFieldData implements IndexFieldData getAggregations() { return emptyList(); } + /** + * The new {@link ValuesSourceType}s added by this plugin + */ + default List getValuesSourceTypes() { + return emptyList(); + } + /** * Allows plugins to register new aggregations using aggregation names that are already defined * in Core, as long as the new aggregations target different ValuesSourceTypes diff --git a/server/src/main/java/org/elasticsearch/search/SearchModule.java b/server/src/main/java/org/elasticsearch/search/SearchModule.java index f7858e536edf9..23d10a9695058 100644 --- a/server/src/main/java/org/elasticsearch/search/SearchModule.java +++ b/server/src/main/java/org/elasticsearch/search/SearchModule.java @@ -207,7 +207,9 @@ import org.elasticsearch.search.aggregations.pipeline.SerialDiffPipelineAggregationBuilder; import org.elasticsearch.search.aggregations.pipeline.StatsBucketPipelineAggregationBuilder; import org.elasticsearch.search.aggregations.pipeline.SumBucketPipelineAggregationBuilder; +import org.elasticsearch.search.aggregations.support.CoreValuesSourceType; import org.elasticsearch.search.aggregations.support.ValuesSourceRegistry; +import org.elasticsearch.search.aggregations.support.ValuesSourceType; import org.elasticsearch.search.fetch.FetchPhase; import org.elasticsearch.search.fetch.FetchSubPhase; import org.elasticsearch.search.fetch.subphase.ExplainPhase; @@ -343,6 +345,10 @@ public Map getHighlighters() { private ValuesSourceRegistry registerAggregations(List plugins) { ValuesSourceRegistry.Builder builder = new ValuesSourceRegistry.Builder(); + for (ValuesSourceType coreVST : CoreValuesSourceType.values()) { + builder.registerValuesSourceType(coreVST); + } + registerAggregation( new AggregationSpec(AvgAggregationBuilder.NAME, AvgAggregationBuilder::new, AvgAggregationBuilder.PARSER).addResultReader( InternalAvg::new @@ -645,6 +651,9 @@ private ValuesSourceRegistry registerAggregations(List plugins) { ); } + // Before registering plugin aggregations, register plugin values sources + registerFromPlugin(plugins, SearchPlugin::getValuesSourceTypes, builder::registerValuesSourceType); + registerFromPlugin(plugins, SearchPlugin::getAggregations, (agg) -> this.registerAggregation(agg, builder)); // after aggs have been registered, see if there are any new VSTypes that need to be linked to core fields diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/composite/CompositeValuesSourceBuilder.java b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/composite/CompositeValuesSourceBuilder.java index 980fa1ca45517..b5fdddd00689a 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/composite/CompositeValuesSourceBuilder.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/composite/CompositeValuesSourceBuilder.java @@ -35,7 +35,7 @@ public abstract class CompositeValuesSourceBuilder, T> void declareValuesSource objectParser.declareBoolean(VB::missingBucket, new ParseField("missing_bucket")); objectParser.declareString(VB::missingOrder, new ParseField("missing_order")); - objectParser.declareField(VB::userValuetypeHint, p -> { - ValueType valueType = ValueType.lenientParse(p.text()); - return valueType; - }, new ParseField("value_type"), ObjectParser.ValueType.STRING); + objectParser.declareField(VB::userValuetypeHint, XContentParser::text, new ParseField("value_type"), ObjectParser.ValueType.STRING); objectParser.declareField( VB::script, diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/composite/DateHistogramValuesSourceBuilder.java b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/composite/DateHistogramValuesSourceBuilder.java index 7468af95b053c..de46a5dab1014 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/composite/DateHistogramValuesSourceBuilder.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/composite/DateHistogramValuesSourceBuilder.java @@ -231,7 +231,7 @@ public DateHistogramValuesSourceBuilder offset(long offset) { public static void register(ValuesSourceRegistry.Builder builder) { builder.register( REGISTRY_KEY, - List.of(CoreValuesSourceType.DATE, CoreValuesSourceType.NUMERIC), + List.of(CoreValuesSourceType.DATE, CoreValuesSourceType.DOUBLE, CoreValuesSourceType.LONG), (valuesSourceConfig, rounding, name, hasScript, format, missingBucket, missingOrder, order) -> { ValuesSource.Numeric numeric = (ValuesSource.Numeric) valuesSourceConfig.getValuesSource(); // TODO once composite is plugged in to the values source registry or at least understands Date values source types use it diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/composite/HistogramValuesSourceBuilder.java b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/composite/HistogramValuesSourceBuilder.java index cdd4906058c84..517450918d3e5 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/composite/HistogramValuesSourceBuilder.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/composite/HistogramValuesSourceBuilder.java @@ -68,7 +68,7 @@ static HistogramValuesSourceBuilder parse(String name, XContentParser parser) th public static void register(ValuesSourceRegistry.Builder builder) { builder.register( REGISTRY_KEY, - List.of(CoreValuesSourceType.DATE, CoreValuesSourceType.NUMERIC), + List.of(CoreValuesSourceType.DATE, CoreValuesSourceType.DOUBLE, CoreValuesSourceType.LONG), (valuesSourceConfig, interval, name, hasScript, format, missingBucket, missingOrder, order) -> { ValuesSource.Numeric numeric = (ValuesSource.Numeric) valuesSourceConfig.getValuesSource(); final HistogramValuesSource vs = new HistogramValuesSource(numeric, interval); @@ -166,7 +166,7 @@ public HistogramValuesSourceBuilder interval(double interval) { @Override protected ValuesSourceType getDefaultValuesSourceType() { - return CoreValuesSourceType.NUMERIC; + return CoreValuesSourceType.DOUBLE; } @Override diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/composite/TermsValuesSourceBuilder.java b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/composite/TermsValuesSourceBuilder.java index dcbaed78ba063..e7c800ec33b4f 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/composite/TermsValuesSourceBuilder.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/composite/TermsValuesSourceBuilder.java @@ -87,7 +87,7 @@ public String type() { static void register(ValuesSourceRegistry.Builder builder) { builder.register( REGISTRY_KEY, - List.of(CoreValuesSourceType.DATE, CoreValuesSourceType.NUMERIC, CoreValuesSourceType.BOOLEAN), + List.of(CoreValuesSourceType.DATE, CoreValuesSourceType.DOUBLE, CoreValuesSourceType.LONG, CoreValuesSourceType.BOOLEAN), (valuesSourceConfig, name, hasScript, format, missingBucket, missingOrder, order) -> { final DocValueFormat docValueFormat; if (format == null && valuesSourceConfig.valueSourceType() == CoreValuesSourceType.DATE) { diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/AutoDateHistogramAggregatorFactory.java b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/AutoDateHistogramAggregatorFactory.java index a19ed7bf7fede..2b7f5d8c8f1df 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/AutoDateHistogramAggregatorFactory.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/AutoDateHistogramAggregatorFactory.java @@ -32,7 +32,7 @@ public final class AutoDateHistogramAggregatorFactory extends ValuesSourceAggreg public static void registerAggregators(ValuesSourceRegistry.Builder builder) { builder.register( AutoDateHistogramAggregationBuilder.REGISTRY_KEY, - List.of(CoreValuesSourceType.DATE, CoreValuesSourceType.NUMERIC), + List.of(CoreValuesSourceType.DATE, CoreValuesSourceType.DOUBLE, CoreValuesSourceType.LONG), AutoDateHistogramAggregator::build, true ); diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/DateHistogramAggregatorFactory.java b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/DateHistogramAggregatorFactory.java index 60aec42f26b3b..a9fa55112b785 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/DateHistogramAggregatorFactory.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/DateHistogramAggregatorFactory.java @@ -32,7 +32,7 @@ public final class DateHistogramAggregatorFactory extends ValuesSourceAggregator public static void registerAggregators(ValuesSourceRegistry.Builder builder) { builder.register( DateHistogramAggregationBuilder.REGISTRY_KEY, - List.of(CoreValuesSourceType.DATE, CoreValuesSourceType.NUMERIC), + List.of(CoreValuesSourceType.DATE, CoreValuesSourceType.DOUBLE, CoreValuesSourceType.LONG), DateHistogramAggregator::build, true ); diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/HistogramAggregationBuilder.java b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/HistogramAggregationBuilder.java index 7e29e8d2dd11e..b10f20ed0cd83 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/HistogramAggregationBuilder.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/HistogramAggregationBuilder.java @@ -103,7 +103,7 @@ public static void registerAggregators(ValuesSourceRegistry.Builder builder) { @Override protected ValuesSourceType defaultValueSourceType() { - return CoreValuesSourceType.NUMERIC; + return CoreValuesSourceType.DOUBLE; } /** Create a new builder with the given name. */ diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/HistogramAggregatorFactory.java b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/HistogramAggregatorFactory.java index 873cfa33648dc..45620868f6fed 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/HistogramAggregatorFactory.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/HistogramAggregatorFactory.java @@ -42,7 +42,7 @@ static void registerAggregators(ValuesSourceRegistry.Builder builder) { builder.register( HistogramAggregationBuilder.REGISTRY_KEY, - List.of(CoreValuesSourceType.NUMERIC, CoreValuesSourceType.DATE, CoreValuesSourceType.BOOLEAN), + List.of(CoreValuesSourceType.DOUBLE, CoreValuesSourceType.LONG, CoreValuesSourceType.DATE, CoreValuesSourceType.BOOLEAN), NumericHistogramAggregator::new, true ); diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/VariableWidthHistogramAggregationBuilder.java b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/VariableWidthHistogramAggregationBuilder.java index 6cd3425934b22..698eede320249 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/VariableWidthHistogramAggregationBuilder.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/VariableWidthHistogramAggregationBuilder.java @@ -84,7 +84,7 @@ protected VariableWidthHistogramAggregationBuilder( @Override protected ValuesSourceType defaultValueSourceType() { - return CoreValuesSourceType.NUMERIC; + return CoreValuesSourceType.DOUBLE; } public VariableWidthHistogramAggregationBuilder setNumBuckets(int numBuckets) { diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/VariableWidthHistogramAggregatorFactory.java b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/VariableWidthHistogramAggregatorFactory.java index 17214e67ea2f8..84fd241644304 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/VariableWidthHistogramAggregatorFactory.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/VariableWidthHistogramAggregatorFactory.java @@ -19,6 +19,7 @@ import org.elasticsearch.search.aggregations.support.ValuesSourceRegistry; import java.io.IOException; +import java.util.List; import java.util.Map; public class VariableWidthHistogramAggregatorFactory extends ValuesSourceAggregatorFactory { @@ -26,7 +27,7 @@ public class VariableWidthHistogramAggregatorFactory extends ValuesSourceAggrega public static void registerAggregators(ValuesSourceRegistry.Builder builder) { builder.register( VariableWidthHistogramAggregationBuilder.REGISTRY_KEY, - CoreValuesSourceType.NUMERIC, + List.of(CoreValuesSourceType.DOUBLE, CoreValuesSourceType.LONG), VariableWidthHistogramAggregator::new, true ); diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/range/DateRangeAggregationBuilder.java b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/range/DateRangeAggregationBuilder.java index d78aa5dde1611..002c8d9c63314 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/range/DateRangeAggregationBuilder.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/range/DateRangeAggregationBuilder.java @@ -55,7 +55,12 @@ public class DateRangeAggregationBuilder extends AbstractRangeBuilder> { public ValuesSourceType getValueSourceType() { - return CoreValuesSourceType.NUMERIC; + return CoreValuesSourceType.DOUBLE; } public ValueType getValueType() { diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/range/RangeAggregationBuilder.java b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/range/RangeAggregationBuilder.java index e3c3c56729600..523a8a3b703c2 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/range/RangeAggregationBuilder.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/range/RangeAggregationBuilder.java @@ -48,7 +48,7 @@ public class RangeAggregationBuilder extends AbstractRangeBuilder metricNames() { @Override protected ValuesSourceType defaultValueSourceType() { - return CoreValuesSourceType.NUMERIC; + return CoreValuesSourceType.DOUBLE; } @Override diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/metrics/ExtendedStatsAggregatorFactory.java b/server/src/main/java/org/elasticsearch/search/aggregations/metrics/ExtendedStatsAggregatorFactory.java index 23292bf67db16..892a99abdc804 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/metrics/ExtendedStatsAggregatorFactory.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/metrics/ExtendedStatsAggregatorFactory.java @@ -45,7 +45,7 @@ class ExtendedStatsAggregatorFactory extends ValuesSourceAggregatorFactory { static void registerAggregators(ValuesSourceRegistry.Builder builder) { builder.register( ExtendedStatsAggregationBuilder.REGISTRY_KEY, - List.of(CoreValuesSourceType.NUMERIC, CoreValuesSourceType.DATE, CoreValuesSourceType.BOOLEAN), + List.of(CoreValuesSourceType.DOUBLE, CoreValuesSourceType.LONG, CoreValuesSourceType.DATE, CoreValuesSourceType.BOOLEAN), ExtendedStatsAggregator::new, true ); diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/metrics/MaxAggregationBuilder.java b/server/src/main/java/org/elasticsearch/search/aggregations/metrics/MaxAggregationBuilder.java index 4c79c427404b0..103db061c6ebf 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/metrics/MaxAggregationBuilder.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/metrics/MaxAggregationBuilder.java @@ -58,7 +58,7 @@ protected MaxAggregationBuilder( @Override protected ValuesSourceType defaultValueSourceType() { - return CoreValuesSourceType.NUMERIC; + return CoreValuesSourceType.DOUBLE; } @Override diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/metrics/MaxAggregatorFactory.java b/server/src/main/java/org/elasticsearch/search/aggregations/metrics/MaxAggregatorFactory.java index 4effad4e687d2..5a0c60b4e1809 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/metrics/MaxAggregatorFactory.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/metrics/MaxAggregatorFactory.java @@ -29,7 +29,7 @@ class MaxAggregatorFactory extends ValuesSourceAggregatorFactory { static void registerAggregators(ValuesSourceRegistry.Builder builder) { builder.register( MaxAggregationBuilder.REGISTRY_KEY, - List.of(CoreValuesSourceType.NUMERIC, CoreValuesSourceType.DATE, CoreValuesSourceType.BOOLEAN), + List.of(CoreValuesSourceType.DOUBLE, CoreValuesSourceType.LONG, CoreValuesSourceType.DATE, CoreValuesSourceType.BOOLEAN), MaxAggregator::new, true ); diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/metrics/MedianAbsoluteDeviationAggregationBuilder.java b/server/src/main/java/org/elasticsearch/search/aggregations/metrics/MedianAbsoluteDeviationAggregationBuilder.java index e43c61400cb35..d4534938a9d88 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/metrics/MedianAbsoluteDeviationAggregationBuilder.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/metrics/MedianAbsoluteDeviationAggregationBuilder.java @@ -100,7 +100,7 @@ protected AggregationBuilder shallowCopy(AggregatorFactories.Builder factoriesBu @Override protected ValuesSourceType defaultValueSourceType() { - return CoreValuesSourceType.NUMERIC; + return CoreValuesSourceType.DOUBLE; } @Override diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/metrics/MedianAbsoluteDeviationAggregatorFactory.java b/server/src/main/java/org/elasticsearch/search/aggregations/metrics/MedianAbsoluteDeviationAggregatorFactory.java index 80082d83b2c88..b0ddcc0915095 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/metrics/MedianAbsoluteDeviationAggregatorFactory.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/metrics/MedianAbsoluteDeviationAggregatorFactory.java @@ -19,6 +19,7 @@ import org.elasticsearch.search.aggregations.support.ValuesSourceRegistry; import java.io.IOException; +import java.util.List; import java.util.Map; public class MedianAbsoluteDeviationAggregatorFactory extends ValuesSourceAggregatorFactory { @@ -45,7 +46,7 @@ public class MedianAbsoluteDeviationAggregatorFactory extends ValuesSourceAggreg static void registerAggregators(ValuesSourceRegistry.Builder builder) { builder.register( MedianAbsoluteDeviationAggregationBuilder.REGISTRY_KEY, - CoreValuesSourceType.NUMERIC, + List.of(CoreValuesSourceType.DOUBLE, CoreValuesSourceType.LONG), MedianAbsoluteDeviationAggregator::new, true ); diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/metrics/MinAggregationBuilder.java b/server/src/main/java/org/elasticsearch/search/aggregations/metrics/MinAggregationBuilder.java index 6c47fd5364846..b4ba067aeb178 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/metrics/MinAggregationBuilder.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/metrics/MinAggregationBuilder.java @@ -70,7 +70,7 @@ public MinAggregationBuilder(StreamInput in) throws IOException { @Override protected ValuesSourceType defaultValueSourceType() { - return CoreValuesSourceType.NUMERIC; + return CoreValuesSourceType.DOUBLE; } @Override diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/metrics/MinAggregatorFactory.java b/server/src/main/java/org/elasticsearch/search/aggregations/metrics/MinAggregatorFactory.java index c6e7f5eee0890..3d472e325be44 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/metrics/MinAggregatorFactory.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/metrics/MinAggregatorFactory.java @@ -29,7 +29,7 @@ class MinAggregatorFactory extends ValuesSourceAggregatorFactory { static void registerAggregators(ValuesSourceRegistry.Builder builder) { builder.register( MinAggregationBuilder.REGISTRY_KEY, - List.of(CoreValuesSourceType.NUMERIC, CoreValuesSourceType.DATE, CoreValuesSourceType.BOOLEAN), + List.of(CoreValuesSourceType.DOUBLE, CoreValuesSourceType.LONG, CoreValuesSourceType.DATE, CoreValuesSourceType.BOOLEAN), MinAggregator::new, true ); diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/metrics/PercentileRanksAggregationBuilder.java b/server/src/main/java/org/elasticsearch/search/aggregations/metrics/PercentileRanksAggregationBuilder.java index b0addd861c578..67030606283a5 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/metrics/PercentileRanksAggregationBuilder.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/metrics/PercentileRanksAggregationBuilder.java @@ -69,7 +69,7 @@ protected AggregationBuilder shallowCopy(AggregatorFactories.Builder factoriesBu @Override protected ValuesSourceType defaultValueSourceType() { - return CoreValuesSourceType.NUMERIC; + return CoreValuesSourceType.DOUBLE; } /** diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/metrics/PercentileRanksAggregatorFactory.java b/server/src/main/java/org/elasticsearch/search/aggregations/metrics/PercentileRanksAggregatorFactory.java index 058ebce142e18..9baeef461f459 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/metrics/PercentileRanksAggregatorFactory.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/metrics/PercentileRanksAggregatorFactory.java @@ -32,7 +32,7 @@ class PercentileRanksAggregatorFactory extends ValuesSourceAggregatorFactory { static void registerAggregators(ValuesSourceRegistry.Builder builder) { builder.register( PercentileRanksAggregationBuilder.REGISTRY_KEY, - List.of(CoreValuesSourceType.NUMERIC, CoreValuesSourceType.DATE, CoreValuesSourceType.BOOLEAN), + List.of(CoreValuesSourceType.DOUBLE, CoreValuesSourceType.LONG, CoreValuesSourceType.DATE, CoreValuesSourceType.BOOLEAN), (name, valuesSource, context, parent, percents, percentilesConfig, keyed, formatter, metadata) -> percentilesConfig .createPercentileRanksAggregator(name, valuesSource, context, parent, percents, keyed, formatter, metadata), true diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/metrics/PercentilesAggregationBuilder.java b/server/src/main/java/org/elasticsearch/search/aggregations/metrics/PercentilesAggregationBuilder.java index f3604e41e59fc..0f45451cd57b1 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/metrics/PercentilesAggregationBuilder.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/metrics/PercentilesAggregationBuilder.java @@ -74,7 +74,7 @@ protected AggregationBuilder shallowCopy(AggregatorFactories.Builder factoriesBu @Override protected ValuesSourceType defaultValueSourceType() { - return CoreValuesSourceType.NUMERIC; + return CoreValuesSourceType.DOUBLE; } /** diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/metrics/PercentilesAggregatorFactory.java b/server/src/main/java/org/elasticsearch/search/aggregations/metrics/PercentilesAggregatorFactory.java index b28b33cc462e0..67cd99909f364 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/metrics/PercentilesAggregatorFactory.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/metrics/PercentilesAggregatorFactory.java @@ -36,7 +36,7 @@ class PercentilesAggregatorFactory extends ValuesSourceAggregatorFactory { static void registerAggregators(ValuesSourceRegistry.Builder builder) { builder.register( PercentilesAggregationBuilder.REGISTRY_KEY, - List.of(CoreValuesSourceType.NUMERIC, CoreValuesSourceType.DATE, CoreValuesSourceType.BOOLEAN), + List.of(CoreValuesSourceType.DOUBLE, CoreValuesSourceType.LONG, CoreValuesSourceType.DATE, CoreValuesSourceType.BOOLEAN), (name, valuesSource, context, parent, percents, percentilesConfig, keyed, formatter, metadata) -> percentilesConfig .createPercentilesAggregator(name, valuesSource, context, parent, percents, keyed, formatter, metadata), true diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/metrics/StatsAggregationBuilder.java b/server/src/main/java/org/elasticsearch/search/aggregations/metrics/StatsAggregationBuilder.java index 64e54f37b2f02..c0921ec94bd51 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/metrics/StatsAggregationBuilder.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/metrics/StatsAggregationBuilder.java @@ -77,7 +77,7 @@ public Set metricNames() { @Override protected ValuesSourceType defaultValueSourceType() { - return CoreValuesSourceType.NUMERIC; + return CoreValuesSourceType.DOUBLE; } @Override diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/metrics/StatsAggregatorFactory.java b/server/src/main/java/org/elasticsearch/search/aggregations/metrics/StatsAggregatorFactory.java index 2d311c9e05408..5cb8f986d5680 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/metrics/StatsAggregatorFactory.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/metrics/StatsAggregatorFactory.java @@ -43,7 +43,7 @@ class StatsAggregatorFactory extends ValuesSourceAggregatorFactory { static void registerAggregators(ValuesSourceRegistry.Builder builder) { builder.register( StatsAggregationBuilder.REGISTRY_KEY, - List.of(CoreValuesSourceType.NUMERIC, CoreValuesSourceType.DATE, CoreValuesSourceType.BOOLEAN), + List.of(CoreValuesSourceType.DOUBLE, CoreValuesSourceType.LONG, CoreValuesSourceType.DATE, CoreValuesSourceType.BOOLEAN), StatsAggregator::new, true ); diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/metrics/SumAggregationBuilder.java b/server/src/main/java/org/elasticsearch/search/aggregations/metrics/SumAggregationBuilder.java index 9bc74f57cee0b..e329ebcedc60e 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/metrics/SumAggregationBuilder.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/metrics/SumAggregationBuilder.java @@ -70,7 +70,7 @@ public SumAggregationBuilder(StreamInput in) throws IOException { @Override protected ValuesSourceType defaultValueSourceType() { - return CoreValuesSourceType.NUMERIC; + return CoreValuesSourceType.DOUBLE; } @Override diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/metrics/SumAggregatorFactory.java b/server/src/main/java/org/elasticsearch/search/aggregations/metrics/SumAggregatorFactory.java index a14764a5ca25e..d5af6790e5392 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/metrics/SumAggregatorFactory.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/metrics/SumAggregatorFactory.java @@ -43,7 +43,7 @@ class SumAggregatorFactory extends ValuesSourceAggregatorFactory { static void registerAggregators(ValuesSourceRegistry.Builder builder) { builder.register( SumAggregationBuilder.REGISTRY_KEY, - List.of(CoreValuesSourceType.NUMERIC, CoreValuesSourceType.DATE, CoreValuesSourceType.BOOLEAN), + List.of(CoreValuesSourceType.DOUBLE, CoreValuesSourceType.LONG, CoreValuesSourceType.DATE, CoreValuesSourceType.BOOLEAN), SumAggregator::new, true ); diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/metrics/WeightedAvgAggregationBuilder.java b/server/src/main/java/org/elasticsearch/search/aggregations/metrics/WeightedAvgAggregationBuilder.java index fe6997ad35fde..b0118fdd78924 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/metrics/WeightedAvgAggregationBuilder.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/metrics/WeightedAvgAggregationBuilder.java @@ -21,7 +21,6 @@ import org.elasticsearch.search.aggregations.support.MultiValuesSourceAggregatorFactory; import org.elasticsearch.search.aggregations.support.MultiValuesSourceFieldConfig; import org.elasticsearch.search.aggregations.support.MultiValuesSourceParseHelper; -import org.elasticsearch.search.aggregations.support.ValueType; import org.elasticsearch.search.aggregations.support.ValuesSourceConfig; import org.elasticsearch.search.aggregations.support.ValuesSourceRegistry; import org.elasticsearch.search.aggregations.support.ValuesSourceType; @@ -44,13 +43,13 @@ public class WeightedAvgAggregationBuilder extends MultiValuesSourceAggregationB WeightedAvgAggregationBuilder::new ); static { - MultiValuesSourceParseHelper.declareCommon(PARSER, true, ValueType.NUMERIC); + MultiValuesSourceParseHelper.declareCommon(PARSER, true); MultiValuesSourceParseHelper.declareField(VALUE_FIELD.getPreferredName(), PARSER, true, false, false, false); MultiValuesSourceParseHelper.declareField(WEIGHT_FIELD.getPreferredName(), PARSER, true, false, false, false); } public static void registerUsage(ValuesSourceRegistry.Builder builder) { - builder.registerUsage(NAME, CoreValuesSourceType.NUMERIC); + builder.registerUsage(NAME, CoreValuesSourceType.DOUBLE); } public WeightedAvgAggregationBuilder(String name) { @@ -87,7 +86,7 @@ protected AggregationBuilder shallowCopy(Builder factoriesBuilder, Map alternateNames() { + return List.of("float", "numeric", "number"); + } + }, + LONG() { + @Override + public ValuesSource getEmpty() { + return ValuesSource.Numeric.EMPTY; + } + + @Override + public ValuesSource getScript(AggregationScript.LeafFactory script) { + return new ValuesSource.Numeric.Script(script, false); + } + + @Override + public ValuesSource getField(FieldContext fieldContext, AggregationScript.LeafFactory script, AggregationContext context) { + + if ((fieldContext.indexFieldData() instanceof IndexNumericFieldData) == false) { + throw new IllegalArgumentException( + "Expected numeric type on field [" + fieldContext.field() + "], but got [" + fieldContext.fieldType().typeName() + "]" + ); + } + + ValuesSource.Numeric dataSource = new ValuesSource.Numeric.FieldData((IndexNumericFieldData) fieldContext.indexFieldData()); + if (script != null) { + // Value script case + dataSource = new ValuesSource.Numeric.WithScript(dataSource, script); + } + return dataSource; + } + + @Override + public ValuesSource replaceMissing( + ValuesSource valuesSource, + Object rawMissing, + DocValueFormat docValueFormat, + AggregationContext context + ) { + Number missing; + if (rawMissing instanceof Number) { + missing = (Number) rawMissing; + } else { + missing = docValueFormat.parseDouble(rawMissing.toString(), false, context::nowInMillis); + } + return MissingValues.replaceMissing((ValuesSource.Numeric) valuesSource, missing); + } + + @Override + public DocValueFormat getFormatter(String format, ZoneId tz) { + /* TODO: this silently ignores a timezone argument, whereas NumberFieldType#docValueFormat throws if given a time zone. + Before we can solve this, we need to resolve https://github.com/elastic/elasticsearch/issues/47469 which deals + with the fact that the same formatter is used for input and output values. We want to support a use case in SQL + (and elsewhere) that allows for passing a long value milliseconds since epoch into date aggregations. In that case, + the timezone is sensible as part of the bucket key format. + */ + if (format == null) { + return DocValueFormat.RAW; + } else { + return new DocValueFormat.Decimal(format); + } + + } + + @Override + public Collection alternateNames() { + return List.of("byte", "short", "integer"); + } }, KEYWORD() { @Override @@ -111,7 +182,7 @@ public ValuesSource getEmpty() { } @Override - public ValuesSource getScript(AggregationScript.LeafFactory script, ValueType scriptValueType) { + public ValuesSource getScript(AggregationScript.LeafFactory script) { return new ValuesSource.Bytes.Script(script); } @@ -145,6 +216,11 @@ public ValuesSource replaceMissing( return MissingValues.replaceMissing((ValuesSource.Bytes) valuesSource, missing); } } + + @Override + public Collection alternateNames() { + return List.of("string"); + } }, GEOPOINT() { @Override @@ -153,7 +229,7 @@ public ValuesSource getEmpty() { } @Override - public ValuesSource getScript(AggregationScript.LeafFactory script, ValueType scriptValueType) { + public ValuesSource getScript(AggregationScript.LeafFactory script) { throw new AggregationExecutionException("value source of type [" + this.value() + "] is not supported by scripts"); } @@ -184,6 +260,11 @@ public ValuesSource replaceMissing( public DocValueFormat getFormatter(String format, ZoneId tz) { return DocValueFormat.GEOHASH; } + + @Override + public Collection alternateNames() { + return List.of("geo_point"); + } }, RANGE() { @Override @@ -192,7 +273,7 @@ public ValuesSource getEmpty() { } @Override - public ValuesSource getScript(AggregationScript.LeafFactory script, ValueType scriptValueType) { + public ValuesSource getScript(AggregationScript.LeafFactory script) { throw new AggregationExecutionException("value source of type [" + this.value() + "] is not supported by scripts"); } @@ -224,8 +305,8 @@ public ValuesSource getEmpty() { } @Override - public ValuesSource getScript(AggregationScript.LeafFactory script, ValueType scriptValueType) { - return KEYWORD.getScript(script, scriptValueType); + public ValuesSource getScript(AggregationScript.LeafFactory script) { + return KEYWORD.getScript(script); } @Override @@ -251,12 +332,12 @@ public DocValueFormat getFormatter(String format, ZoneId tz) { DATE() { @Override public ValuesSource getEmpty() { - return NUMERIC.getEmpty(); + return DOUBLE.getEmpty(); } @Override - public ValuesSource getScript(AggregationScript.LeafFactory script, ValueType scriptValueType) { - return NUMERIC.getScript(script, scriptValueType); + public ValuesSource getScript(AggregationScript.LeafFactory script) { + return DOUBLE.getScript(script); } @Override @@ -355,7 +436,7 @@ public ValuesSource replaceMissing( DocValueFormat docValueFormat, AggregationContext context ) { - return NUMERIC.replaceMissing(valuesSource, rawMissing, docValueFormat, context); + return DOUBLE.replaceMissing(valuesSource, rawMissing, docValueFormat, context); } @Override @@ -372,17 +453,17 @@ public DocValueFormat getFormatter(String format, ZoneId tz) { BOOLEAN() { @Override public ValuesSource getEmpty() { - return NUMERIC.getEmpty(); + return DOUBLE.getEmpty(); } @Override - public ValuesSource getScript(AggregationScript.LeafFactory script, ValueType scriptValueType) { - return NUMERIC.getScript(script, scriptValueType); + public ValuesSource getScript(AggregationScript.LeafFactory script) { + return DOUBLE.getScript(script); } @Override public ValuesSource getField(FieldContext fieldContext, AggregationScript.LeafFactory script, AggregationContext context) { - return NUMERIC.getField(fieldContext, script, context); + return DOUBLE.getField(fieldContext, script, context); } @Override @@ -392,7 +473,7 @@ public ValuesSource replaceMissing( DocValueFormat docValueFormat, AggregationContext context ) { - return NUMERIC.replaceMissing(valuesSource, rawMissing, docValueFormat, context); + return DOUBLE.replaceMissing(valuesSource, rawMissing, docValueFormat, context); } @Override diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/support/MultiValuesSourceAggregationBuilder.java b/server/src/main/java/org/elasticsearch/search/aggregations/support/MultiValuesSourceAggregationBuilder.java index 034b23f7585fb..264fade17c9da 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/support/MultiValuesSourceAggregationBuilder.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/support/MultiValuesSourceAggregationBuilder.java @@ -7,6 +7,7 @@ */ package org.elasticsearch.search.aggregations.support; +import org.elasticsearch.Version; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.core.Nullable; @@ -64,7 +65,7 @@ public AB subAggregations(Builder subFactories) { } private Map fields = new HashMap<>(); - private ValueType userValueTypeHint = null; + private String userValueTypeHint = null; private String format = null; protected MultiValuesSourceAggregationBuilder(String name) { @@ -97,14 +98,23 @@ protected MultiValuesSourceAggregationBuilder(StreamInput in) throws IOException @SuppressWarnings("unchecked") private void read(StreamInput in) throws IOException { fields = in.readMap(StreamInput::readString, MultiValuesSourceFieldConfig::new); - userValueTypeHint = in.readOptionalWriteable(ValueType::readFromStream); + if (in.getVersion().before(Version.V_8_1_0)) { + ValueType valueType = in.readOptionalWriteable(ValueType::readFromStream); + this.userValueTypeHint = valueType == null ? null : valueType.getPreferredName(); + } else { + this.userValueTypeHint = in.readOptionalString(); + } format = in.readOptionalString(); } @Override protected final void doWriteTo(StreamOutput out) throws IOException { out.writeMap(fields, StreamOutput::writeString, (o, value) -> value.writeTo(o)); - out.writeOptionalWriteable(userValueTypeHint); + if (out.getVersion().before(Version.V_8_1_0)) { + out.writeOptionalWriteable(userValueTypeHint == null ? null : ValueType.lenientParse(userValueTypeHint)); + } else { + out.writeOptionalString(userValueTypeHint); + } out.writeOptionalString(format); innerWriteTo(out); } @@ -127,7 +137,7 @@ protected AB field(String propertyName, MultiValuesSourceFieldConfig config) { * Sets the {@link ValueType} for the value produced by this aggregation */ @SuppressWarnings("unchecked") - public AB userValueTypeHint(ValueType valueType) { + public AB userValueTypeHint(String valueType) { if (valueType == null) { throw new IllegalArgumentException("[userValueTypeHint] must not be null: [" + name + "]"); } @@ -163,10 +173,11 @@ protected final MultiValuesSourceAggregatorFactory doBuild( ) throws IOException { Map configs = new HashMap<>(fields.size()); Map filters = new HashMap<>(fields.size()); + final ValuesSourceType resolvedTypeHint = context.getValuesSourceRegistry().resolveTypeHint(userValueTypeHint); fields.forEach((key, value) -> { ValuesSourceConfig config = ValuesSourceConfig.resolveUnregistered( context, - userValueTypeHint, + resolvedTypeHint, value.getFieldName(), value.getScript(), value.getMissing(), @@ -177,21 +188,21 @@ protected final MultiValuesSourceAggregatorFactory doBuild( configs.put(key, config); filters.put(key, value.getFilter()); }); - DocValueFormat docValueFormat = resolveFormat(format, userValueTypeHint, defaultValueSourceType()); + DocValueFormat docValueFormat = resolveFormat(format, resolvedTypeHint, defaultValueSourceType()); return innerBuild(context, configs, filters, docValueFormat, parent, subFactoriesBuilder); } public static DocValueFormat resolveFormat( @Nullable String format, - @Nullable ValueType valueType, + @Nullable ValuesSourceType valueType, ValuesSourceType defaultValuesSourceType ) { if (valueType == null) { // If the user didn't send a hint, all we can do is fall back to the default return defaultValuesSourceType.getFormatter(format, null); } - DocValueFormat valueFormat = valueType.defaultFormat; + DocValueFormat valueFormat = valueType.getFormatter(format, null); if (valueFormat instanceof DocValueFormat.Decimal && format != null) { valueFormat = new DocValueFormat.Decimal(format); } @@ -219,7 +230,7 @@ public final XContentBuilder internalXContent(XContentBuilder builder, Params pa builder.field(CommonFields.FORMAT.getPreferredName(), format); } if (userValueTypeHint != null) { - builder.field(CommonFields.VALUE_TYPE.getPreferredName(), userValueTypeHint.getPreferredName()); + builder.field(CommonFields.VALUE_TYPE.getPreferredName(), userValueTypeHint); } doXContentBody(builder, params); builder.endObject(); diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/support/MultiValuesSourceFieldConfig.java b/server/src/main/java/org/elasticsearch/search/aggregations/support/MultiValuesSourceFieldConfig.java index 2033cdacb6f46..cdb64df1186db 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/support/MultiValuesSourceFieldConfig.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/support/MultiValuesSourceFieldConfig.java @@ -37,7 +37,7 @@ public class MultiValuesSourceFieldConfig implements Writeable, ToXContentObject // supported only if filtered == true private final QueryBuilder filter; // supported only if heterogeneous == true - private final ValueType userValueTypeHint; + private final String userValueTypeHint; private final String format; private static final String NAME = "field_config"; @@ -104,7 +104,7 @@ public static ObjectParser parserBu if (heterogeneous) { parser.declareField( MultiValuesSourceFieldConfig.Builder::setUserValueTypeHint, - p -> ValueType.lenientParse(p.text()), + XContentParser::text, ValueType.VALUE_TYPE, ObjectParser.ValueType.STRING ); @@ -125,7 +125,7 @@ protected MultiValuesSourceFieldConfig( Script script, ZoneId timeZone, QueryBuilder filter, - ValueType userValueTypeHint, + String userValueTypeHint, String format ) { this.fieldName = fieldName; @@ -152,7 +152,12 @@ public MultiValuesSourceFieldConfig(StreamInput in) throws IOException { this.filter = null; } if (in.getVersion().onOrAfter(Version.V_7_12_0)) { - this.userValueTypeHint = in.readOptionalWriteable(ValueType::readFromStream); + if (in.getVersion().before(Version.V_8_1_0)) { + ValueType valueType = in.readOptionalWriteable(ValueType::readFromStream); + this.userValueTypeHint = valueType == null ? null : valueType.getPreferredName(); + } else { + this.userValueTypeHint = in.readOptionalString(); + } this.format = in.readOptionalString(); } else { this.userValueTypeHint = null; @@ -180,7 +185,7 @@ public QueryBuilder getFilter() { return filter; } - public ValueType getUserValueTypeHint() { + public String getUserValueTypeHint() { return userValueTypeHint; } @@ -202,7 +207,11 @@ public void writeTo(StreamOutput out) throws IOException { out.writeOptionalNamedWriteable(filter); } if (out.getVersion().onOrAfter(Version.V_7_12_0)) { - out.writeOptionalWriteable(userValueTypeHint); + if (out.getVersion().before(Version.V_8_1_0)) { + out.writeOptionalWriteable(userValueTypeHint == null ? null : ValueType.lenientParse(userValueTypeHint)); + } else { + out.writeOptionalString(userValueTypeHint); + } out.writeOptionalString(format); } } @@ -227,7 +236,7 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws filter.toXContent(builder, params); } if (userValueTypeHint != null) { - builder.field(AggregationBuilder.CommonFields.VALUE_TYPE.getPreferredName(), userValueTypeHint.getPreferredName()); + builder.field(AggregationBuilder.CommonFields.VALUE_TYPE.getPreferredName(), userValueTypeHint); } if (format != null) { builder.field(AggregationBuilder.CommonFields.FORMAT.getPreferredName(), format); @@ -266,7 +275,7 @@ public static class Builder { private Script script = null; private ZoneId timeZone = null; private QueryBuilder filter = null; - private ValueType userValueTypeHint = null; + private String userValueTypeHint = null; private String format = null; public String getFieldName() { @@ -310,12 +319,18 @@ public Builder setFilter(QueryBuilder filter) { return this; } - public Builder setUserValueTypeHint(ValueType userValueTypeHint) { + public Builder setUserValueTypeHint(String userValueTypeHint) { this.userValueTypeHint = userValueTypeHint; return this; } - public ValueType getUserValueTypeHint() { + @Deprecated + public Builder setUserValueTypeHint(ValueType userValueTypeHint) { + this.userValueTypeHint = userValueTypeHint == null ? null : userValueTypeHint.getPreferredName(); + return this; + } + + public String getUserValueTypeHint() { return userValueTypeHint; } diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/support/MultiValuesSourceParseHelper.java b/server/src/main/java/org/elasticsearch/search/aggregations/support/MultiValuesSourceParseHelper.java index 4fe17985fdc02..1c93d099c1b6b 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/support/MultiValuesSourceParseHelper.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/support/MultiValuesSourceParseHelper.java @@ -8,7 +8,6 @@ package org.elasticsearch.search.aggregations.support; -import org.elasticsearch.common.ParsingException; import org.elasticsearch.xcontent.AbstractObjectParser; import org.elasticsearch.xcontent.ObjectParser; import org.elasticsearch.xcontent.ParseField; @@ -18,26 +17,15 @@ public final class MultiValuesSourceParseHelper { public static void declareCommon( AbstractObjectParser, T> objectParser, - boolean formattable, - ValueType expectedValueType + boolean formattable ) { - objectParser.declareField(MultiValuesSourceAggregationBuilder::userValueTypeHint, p -> { - ValueType valueType = ValueType.lenientParse(p.text()); - if (expectedValueType != null && valueType.isNotA(expectedValueType)) { - throw new ParsingException( - p.getTokenLocation(), - "Aggregation [" - + objectParser.getName() - + "] was configured with an incompatible value type [" - + valueType - + "]. It can only work on value off type [" - + expectedValueType - + "]" - ); - } - return valueType; - }, ValueType.VALUE_TYPE, ObjectParser.ValueType.STRING); + objectParser.declareField( + MultiValuesSourceAggregationBuilder::userValueTypeHint, + XContentParser::text, + ValueType.VALUE_TYPE, + ObjectParser.ValueType.STRING + ); if (formattable) { objectParser.declareField( diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/support/ValueType.java b/server/src/main/java/org/elasticsearch/search/aggregations/support/ValueType.java index 3a598494b58cf..1188817259020 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/support/ValueType.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/support/ValueType.java @@ -29,9 +29,9 @@ public enum ValueType implements Writeable { STRING((byte) 1, "string", "string", CoreValuesSourceType.KEYWORD, DocValueFormat.RAW), - LONG((byte) 2, "byte|short|integer|long", "long", CoreValuesSourceType.NUMERIC, DocValueFormat.RAW), - DOUBLE((byte) 3, "float|double", "double", CoreValuesSourceType.NUMERIC, DocValueFormat.RAW), - NUMBER((byte) 4, "number", "number", CoreValuesSourceType.NUMERIC, DocValueFormat.RAW), + LONG((byte) 2, "byte|short|integer|long", "long", CoreValuesSourceType.LONG, DocValueFormat.RAW), + DOUBLE((byte) 3, "float|double", "double", CoreValuesSourceType.DOUBLE, DocValueFormat.RAW), + NUMBER((byte) 4, "number", "number", CoreValuesSourceType.DOUBLE, DocValueFormat.RAW), DATE( (byte) 5, "date", @@ -40,7 +40,7 @@ public enum ValueType implements Writeable { new DocValueFormat.DateTime(DateFieldMapper.DEFAULT_DATE_TIME_FORMATTER, ZoneOffset.UTC, DateFieldMapper.Resolution.MILLISECONDS) ), IP((byte) 6, "ip", "ip", CoreValuesSourceType.IP, DocValueFormat.IP), - NUMERIC((byte) 7, "numeric", "numeric", CoreValuesSourceType.NUMERIC, DocValueFormat.RAW), + NUMERIC((byte) 7, "numeric", "numeric", CoreValuesSourceType.DOUBLE, DocValueFormat.RAW), GEOPOINT((byte) 8, "geo_point", "geo_point", CoreValuesSourceType.GEOPOINT, DocValueFormat.GEOHASH), BOOLEAN((byte) 9, "boolean", "boolean", CoreValuesSourceType.BOOLEAN, DocValueFormat.BOOLEAN), RANGE((byte) 10, "range", "range", CoreValuesSourceType.RANGE, DocValueFormat.RAW); diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/support/ValuesSource.java b/server/src/main/java/org/elasticsearch/search/aggregations/support/ValuesSource.java index 4e0e783375a8e..04bb20bafeddf 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/support/ValuesSource.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/support/ValuesSource.java @@ -626,16 +626,16 @@ public SortedNumericDoubleValues doubleValues(LeafReaderContext context) { */ public static class Script extends Numeric { private final AggregationScript.LeafFactory script; - private final ValueType scriptValueType; + private final boolean isFloatingPoint; - public Script(AggregationScript.LeafFactory script, ValueType scriptValueType) { + public Script(AggregationScript.LeafFactory script, boolean isFloatingPoint) { this.script = script; - this.scriptValueType = scriptValueType; + this.isFloatingPoint = isFloatingPoint; } @Override public boolean isFloatingPoint() { - return scriptValueType != null ? scriptValueType == ValueType.DOUBLE : true; + return isFloatingPoint; } @Override diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/support/ValuesSourceAggregationBuilder.java b/server/src/main/java/org/elasticsearch/search/aggregations/support/ValuesSourceAggregationBuilder.java index 8cbedec6bad8c..2c7eee7f205cf 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/support/ValuesSourceAggregationBuilder.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/support/ValuesSourceAggregationBuilder.java @@ -62,13 +62,12 @@ public static void declareFields( ObjectParser.ValueType.VALUE ); - objectParser.declareField(ValuesSourceAggregationBuilder::userValueTypeHint, p -> { - ValueType type = ValueType.lenientParse(p.text()); - if (type == null) { - throw new IllegalArgumentException("Unknown value type [" + p.text() + "]"); - } - return type; - }, ValueType.VALUE_TYPE, ObjectParser.ValueType.STRING); + objectParser.declareField( + ValuesSourceAggregationBuilder::userValueTypeHint, + XContentParser::text, + ValueType.VALUE_TYPE, + ObjectParser.ValueType.STRING + ); if (formattable) { objectParser.declareField( @@ -189,7 +188,7 @@ public Set metricNames() { private String field = null; private Script script = null; - private ValueType userValueTypeHint = null; + private String userValueTypeHint = null; private String format = null; private Object missing = null; private ZoneId timeZone = null; @@ -235,7 +234,12 @@ private void read(StreamInput in) throws IOException { script = new Script(in); } if (in.readBoolean()) { - userValueTypeHint = ValueType.readFromStream(in); + if (in.getVersion().before(Version.V_8_1_0)) { + // legacy version wrote a ValueType. Convert it to a string + userValueTypeHint = ValueType.readFromStream(in).getPreferredName(); + } else { + userValueTypeHint = in.readString(); + } } format = in.readOptionalString(); missing = in.readGenericValue(); @@ -257,7 +261,17 @@ protected final void doWriteTo(StreamOutput out) throws IOException { boolean hasValueType = userValueTypeHint != null; out.writeBoolean(hasValueType); if (hasValueType) { - userValueTypeHint.writeTo(out); + if (out.getVersion().before(Version.V_8_1_0)) { + // Legacy version writes a ValueType + ValueType toWrite = ValueType.lenientParse(userValueTypeHint); + if (toWrite != null) { + toWrite.writeTo(out); + } else { + throw new IOException("Value_type [" + userValueTypeHint + "] not compatible with pre 8.1 nodes"); + } + } else { + out.writeString(userValueTypeHint); + } } out.writeOptionalString(format); out.writeGenericValue(missing); @@ -327,7 +341,7 @@ public Script script() { * @return - The modified builder instance, for chaining. */ @SuppressWarnings("unchecked") - public AB userValueTypeHint(ValueType valueType) { + public AB userValueTypeHint(String valueType) { if (valueType == null) { // TODO: This is nonsense. We allow the value to be null (via constructor), but don't allow it to be set to null. This means // thing looking to copy settings (like RollupRequestTranslator) need to check if userValueTypeHint is not null, and then @@ -338,7 +352,23 @@ public AB userValueTypeHint(ValueType valueType) { return (AB) this; } - public ValueType userValueTypeHint() { + /** + * We set the value type in tests a lot. This is a convenience method for not having to touch all of those places. + */ + @SuppressWarnings("unchecked") + @Deprecated + public AB userValueTypeHint(ValueType valueType) { + if (valueType == null) { + // TODO: This is nonsense. We allow the value to be null (via constructor), but don't allow it to be set to null. This means + // thing looking to copy settings (like RollupRequestTranslator) need to check if userValueTypeHint is not null, and then + // set it if and only if it is non-null. + throw new IllegalArgumentException("[userValueTypeHint] must not be null: [" + name + "]"); + } + this.userValueTypeHint = valueType.getPreferredName(); + return (AB) this; + } + + public String userValueTypeHint() { return userValueTypeHint; } @@ -444,7 +474,7 @@ protected final ValuesSourceAggregatorFactory doBuild(AggregationContext context protected ValuesSourceConfig resolveConfig(AggregationContext context) { return ValuesSourceConfig.resolve( context, - this.userValueTypeHint, + context.getValuesSourceRegistry().resolveTypeHint(this.userValueTypeHint), field, script, missing, @@ -480,7 +510,7 @@ public final XContentBuilder internalXContent(XContentBuilder builder, Params pa builder.field("time_zone", timeZone.toString()); } if (userValueTypeHint != null) { - builder.field("value_type", userValueTypeHint.getPreferredName()); + builder.field("value_type", userValueTypeHint); } doXContentBody(builder, params); builder.endObject(); diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/support/ValuesSourceConfig.java b/server/src/main/java/org/elasticsearch/search/aggregations/support/ValuesSourceConfig.java index 7483419872ef3..eda47e9bcb7b0 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/support/ValuesSourceConfig.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/support/ValuesSourceConfig.java @@ -47,7 +47,7 @@ public class ValuesSourceConfig { */ public static ValuesSourceConfig resolve( AggregationContext context, - ValueType userValueTypeHint, + ValuesSourceType userValueTypeHint, String field, Script script, Object missing, @@ -87,7 +87,7 @@ public static ValuesSourceConfig resolve( */ public static ValuesSourceConfig resolveUnregistered( AggregationContext context, - ValueType userValueTypeHint, + ValuesSourceType userValueTypeHint, String field, Script script, Object missing, @@ -110,7 +110,7 @@ public static ValuesSourceConfig resolveUnregistered( private static ValuesSourceConfig internalResolve( AggregationContext context, - ValueType userValueTypeHint, + ValuesSourceType userValueTypeHint, String field, Script script, Object missing, @@ -121,13 +121,12 @@ private static ValuesSourceConfig internalResolve( ) { ValuesSourceConfig config; ValuesSourceType valuesSourceType = null; - ValueType scriptValueType = userValueTypeHint; FieldContext fieldContext = null; AggregationScript.LeafFactory aggregationScript = createScript(script, context); // returns null if script is null boolean unmapped = false; if (userValueTypeHint != null) { // If the user gave us a type hint, respect that. - valuesSourceType = userValueTypeHint.getValuesSourceType(); + valuesSourceType = userValueTypeHint; } if (field == null) { if (script == null) { @@ -160,7 +159,6 @@ private static ValuesSourceConfig internalResolve( fieldContext, unmapped, aggregationScript, - scriptValueType, missing, timeZone, docValueFormat, @@ -173,7 +171,7 @@ private static ValuesSourceConfig internalResolve( private interface FieldResolver { ValuesSourceType getValuesSourceType( FieldContext fieldContext, - ValueType userValueTypeHint, + ValuesSourceType userValueTypeHint, ValuesSourceType defaultValuesSourceType ); @@ -181,7 +179,7 @@ ValuesSourceType getValuesSourceType( private static ValuesSourceType getMappingFromRegistry( FieldContext fieldContext, - ValueType userValueTypeHint, + ValuesSourceType userValueTypeHint, ValuesSourceType defaultValuesSourceType ) { return fieldContext.indexFieldData().getValuesSourceType(); @@ -189,12 +187,12 @@ private static ValuesSourceType getMappingFromRegistry( private static ValuesSourceType getLegacyMapping( FieldContext fieldContext, - ValueType userValueTypeHint, + ValuesSourceType userValueTypeHint, ValuesSourceType defaultValuesSourceType ) { IndexFieldData indexFieldData = fieldContext.indexFieldData(); if (indexFieldData instanceof IndexNumericFieldData) { - return CoreValuesSourceType.NUMERIC; + return CoreValuesSourceType.DOUBLE; } else if (indexFieldData instanceof IndexGeoPointFieldData) { return CoreValuesSourceType.GEOPOINT; } else if (fieldContext.fieldType() instanceof RangeFieldMapper.RangeFieldType) { @@ -203,7 +201,7 @@ private static ValuesSourceType getLegacyMapping( if (userValueTypeHint == null) { return defaultValuesSourceType; } else { - return userValueTypeHint.getValuesSourceType(); + return userValueTypeHint; } } } @@ -238,20 +236,19 @@ private static DocValueFormat resolveFormat( public static ValuesSourceConfig resolveFieldOnly(MappedFieldType fieldType, AggregationContext context) { FieldContext fieldContext = context.buildFieldContext(fieldType); ValuesSourceType vstype = fieldContext.indexFieldData().getValuesSourceType(); - return new ValuesSourceConfig(vstype, fieldContext, false, null, null, null, null, null, context); + return new ValuesSourceConfig(vstype, fieldContext, false, null, null, null, null, context); } /** * Convenience method for creating unmapped configs */ public static ValuesSourceConfig resolveUnmapped(ValuesSourceType valuesSourceType, AggregationContext context) { - return new ValuesSourceConfig(valuesSourceType, null, true, null, null, null, null, null, context); + return new ValuesSourceConfig(valuesSourceType, null, true, null, null, null, null, context); } private final ValuesSourceType valuesSourceType; private final FieldContext fieldContext; private final AggregationScript.LeafFactory script; - private final ValueType scriptValueType; private final boolean unmapped; private final DocValueFormat format; private final Object missing; @@ -267,7 +264,6 @@ public ValuesSourceConfig( FieldContext fieldContext, boolean unmapped, AggregationScript.LeafFactory script, - ValueType scriptValueType, Object missing, ZoneId timeZone, DocValueFormat format, @@ -280,7 +276,6 @@ public ValuesSourceConfig( this.fieldContext = fieldContext; this.unmapped = unmapped; this.script = script; - this.scriptValueType = scriptValueType; this.missing = missing; this.timeZone = timeZone; this.format = format == null ? DocValueFormat.RAW : format; @@ -301,7 +296,7 @@ private ValuesSource constructValuesSource(Object missing, DocValueFormat format } else { if (fieldContext() == null) { // Script case - vs = valueSourceType().getScript(script(), scriptValueType()); + vs = valueSourceType().getScript(script()); } else { // Field or Value Script case vs = valueSourceType().getField(fieldContext(), script(), context); @@ -358,10 +353,6 @@ public boolean valid() { return fieldContext != null || script != null || unmapped; } - public ValueType scriptValueType() { - return this.scriptValueType; - } - public Object missing() { return this.missing; } @@ -423,7 +414,7 @@ public boolean alignesWithSearchIndex() { */ public String getDescription() { if (script != null) { - return "Script yielding [" + (scriptValueType != null ? scriptValueType.getPreferredName() : "unknown type") + "]"; + return "Script"; } MappedFieldType fieldType = fieldType(); diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/support/ValuesSourceRegistry.java b/server/src/main/java/org/elasticsearch/search/aggregations/support/ValuesSourceRegistry.java index 3a43f147fefa3..d44e834e096b9 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/support/ValuesSourceRegistry.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/support/ValuesSourceRegistry.java @@ -14,9 +14,11 @@ import java.util.AbstractMap; import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Set; /** * {@link ValuesSourceRegistry} holds the mapping from {@link ValuesSourceType}s to functions for building aggregation components. DO NOT @@ -59,6 +61,8 @@ public int hashCode() { public static class Builder { private final AggregationUsageService.Builder usageServiceBuilder; private Map, List>> aggregatorRegistry = new HashMap<>(); + private Map valueTypeLookup = new HashMap<>(); + private Set duplicateRegistrationCheck = new HashSet<>(); public Builder() { this.usageServiceBuilder = new AggregationUsageService.Builder(); @@ -81,6 +85,15 @@ public void register( T aggregatorSupplier, boolean registerUsage ) { + if (duplicateRegistrationCheck.contains(valuesSourceType) == false) { + throw new IllegalStateException( + "Attempt to register aggregation [" + + aggregatorSupplier.toString() + + "] before registering ValuesSourceType [" + + valuesSourceType.typeName() + + "]" + ); + } if (aggregatorRegistry.containsKey(registryKey) == false) { aggregatorRegistry.put(registryKey, new ArrayList<>()); } @@ -120,8 +133,25 @@ public void registerUsage(String aggregationName) { usageServiceBuilder.registerAggregationUsage(aggregationName); } + public void registerValuesSourceType(ValuesSourceType valuesSourceType) { + if (duplicateRegistrationCheck.contains(valuesSourceType)) { + throw new IllegalStateException("Duplicate registration of ValuesSourceType [" + valuesSourceType.typeName() + "]"); + } + if (valueTypeLookup.containsKey(valuesSourceType.typeName())) { + throw new IllegalStateException("Duplicate type name detected: [" + valuesSourceType.typeName() + "]"); + } + valueTypeLookup.put(valuesSourceType.typeName(), valuesSourceType); + for (String name : valuesSourceType.alternateNames()) { + if (valueTypeLookup.containsKey(name)) { + throw new IllegalStateException("Duplicate type name detected: [" + name + "]"); + } + valueTypeLookup.put(name, valuesSourceType); + } + duplicateRegistrationCheck.add(valuesSourceType); + } + public ValuesSourceRegistry build() { - return new ValuesSourceRegistry(aggregatorRegistry, usageServiceBuilder.build()); + return new ValuesSourceRegistry(aggregatorRegistry, usageServiceBuilder.build(), valueTypeLookup); } } @@ -151,13 +181,17 @@ public ValuesSourceRegistry build() { /** Maps Aggregation names to (ValuesSourceType, Supplier) pairs, keyed by ValuesSourceType */ private final AggregationUsageService usageService; private Map, Map> aggregatorRegistry; + private Map valueTypeLookup; public ValuesSourceRegistry( Map, List>> aggregatorRegistry, - AggregationUsageService usageService + AggregationUsageService usageService, + Map valueTypeLookup ) { this.aggregatorRegistry = copyMap(aggregatorRegistry); this.usageService = usageService; + // TODO: Make an immutable copy blah blah blah + this.valueTypeLookup = valueTypeLookup; } public boolean isRegistered(RegistryKey registryKey) { @@ -181,4 +215,14 @@ public T getAggregator(RegistryKey registryKey, ValuesSourceConfig values public AggregationUsageService getUsageService() { return usageService; } + + public ValuesSourceType resolveTypeHint(String typeHint) { + if (typeHint == null) { + return null; + } + if (valueTypeLookup.containsKey(typeHint)) { + return valueTypeLookup.get(typeHint); + } + throw new IllegalArgumentException("Unknown value type [" + typeHint + "]"); + } } diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/support/ValuesSourceType.java b/server/src/main/java/org/elasticsearch/search/aggregations/support/ValuesSourceType.java index ed7e786b10b34..0ec6538fa0cd9 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/support/ValuesSourceType.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/support/ValuesSourceType.java @@ -12,6 +12,8 @@ import org.elasticsearch.search.DocValueFormat; import java.time.ZoneId; +import java.util.Collection; +import java.util.List; /** * {@link ValuesSourceType} represents a collection of fields that share a common set of operations, for example all numeric fields. @@ -46,10 +48,9 @@ public interface ValuesSourceType { * operating without an underlying field. Scripts operating over fields are handled by the script argument to getField below. * * @param script - The script being wrapped - * @param scriptValueType - The expected output type of the script * @return - Script specialization of the base {@link ValuesSource} */ - ValuesSource getScript(AggregationScript.LeafFactory script, ValueType scriptValueType); + ValuesSource getScript(AggregationScript.LeafFactory script); /** * Return a {@link ValuesSource} wrapping a field for the given type. All {@link ValuesSource}s must implement this method. @@ -88,8 +89,21 @@ default DocValueFormat getFormatter(String format, ZoneId tz) { } /** - * Returns the name of the Values Source Type for stats purposes + * Returns the name of the Values Source Type for stats purposes. This name can also be used for a type hint via the + * {@link ValueType#VALUE_TYPE} field when specifying an aggregation. This can help resolve issues with unmapped fields and similar. + * + * The returned value should be unique. + * * @return the name of the Values Source Type */ String typeName(); + + /** + * Optionally, specify a list of alternative names that can be used in the {@link ValueType#VALUE_TYPE} field to specify this type. + * Generally, new types shouldn't need to define this, but we have some legacy mappings that need to be supported still. + * @return a collection of unique strings that can be used to identify this type + */ + default Collection alternateNames() { + return List.of(); + } } diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/AdaptingAggregatorTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/AdaptingAggregatorTests.java index da74f2d4e0b22..82813a5e5785a 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/AdaptingAggregatorTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/AdaptingAggregatorTests.java @@ -15,7 +15,9 @@ import org.elasticsearch.search.aggregations.bucket.histogram.SizedBucketAggregator; import org.elasticsearch.search.aggregations.metrics.MaxAggregationBuilder; import org.elasticsearch.search.aggregations.support.AggregationContext; +import org.elasticsearch.search.aggregations.support.CoreValuesSourceType; import org.elasticsearch.search.aggregations.support.ValuesSourceRegistry; +import org.elasticsearch.search.aggregations.support.ValuesSourceType; import java.io.IOException; import java.util.List; @@ -35,6 +37,9 @@ public class AdaptingAggregatorTests extends MapperServiceTestCase { public void testParent() throws IOException { MapperService mapperService = createMapperService(mapping(b -> {})); ValuesSourceRegistry.Builder registry = new ValuesSourceRegistry.Builder(); + for (ValuesSourceType vst : CoreValuesSourceType.values()) { + registry.registerValuesSourceType(vst); + } MaxAggregationBuilder.registerAggregators(registry); withAggregationContext(registry.build(), mapperService, List.of(), null, context -> { AggregatorFactories.Builder sub = AggregatorFactories.builder(); diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/bucket/missing/MissingAggregatorTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/bucket/missing/MissingAggregatorTests.java index b96c5e8f0d355..be2c6e8f533d3 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/bucket/missing/MissingAggregatorTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/bucket/missing/MissingAggregatorTests.java @@ -338,7 +338,8 @@ protected AggregationBuilder createAggBuilderForTypeTest(MappedFieldType fieldTy @Override protected List getSupportedValuesSourceTypes() { return List.of( - CoreValuesSourceType.NUMERIC, + CoreValuesSourceType.DOUBLE, + CoreValuesSourceType.LONG, CoreValuesSourceType.KEYWORD, CoreValuesSourceType.GEOPOINT, CoreValuesSourceType.RANGE, diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/bucket/terms/SignificantTermsAggregatorTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/bucket/terms/SignificantTermsAggregatorTests.java index a6c1adcc6f9e9..e469eb3fd889c 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/bucket/terms/SignificantTermsAggregatorTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/bucket/terms/SignificantTermsAggregatorTests.java @@ -77,7 +77,8 @@ protected AggregationBuilder createAggBuilderForTypeTest(MappedFieldType fieldTy @Override protected List getSupportedValuesSourceTypes() { return List.of( - CoreValuesSourceType.NUMERIC, + CoreValuesSourceType.DOUBLE, + CoreValuesSourceType.LONG, CoreValuesSourceType.KEYWORD, CoreValuesSourceType.BOOLEAN, CoreValuesSourceType.DATE, diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/bucket/terms/TermsAggregatorTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/bucket/terms/TermsAggregatorTests.java index 0eb3aba58283c..dd875b1108e05 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/bucket/terms/TermsAggregatorTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/bucket/terms/TermsAggregatorTests.java @@ -194,7 +194,8 @@ protected AggregationBuilder createAggBuilderForTypeTest(MappedFieldType fieldTy @Override protected List getSupportedValuesSourceTypes() { return List.of( - CoreValuesSourceType.NUMERIC, + CoreValuesSourceType.DOUBLE, + CoreValuesSourceType.LONG, CoreValuesSourceType.KEYWORD, CoreValuesSourceType.IP, CoreValuesSourceType.DATE, diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/metrics/AvgAggregatorTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/metrics/AvgAggregatorTests.java index 55a344dd8c1e8..068721bddbb79 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/metrics/AvgAggregatorTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/metrics/AvgAggregatorTests.java @@ -700,7 +700,7 @@ public void testScriptCaching() throws IOException { @Override protected List getSupportedValuesSourceTypes() { - return List.of(CoreValuesSourceType.NUMERIC, CoreValuesSourceType.BOOLEAN, CoreValuesSourceType.DATE); + return List.of(CoreValuesSourceType.DOUBLE, CoreValuesSourceType.LONG, CoreValuesSourceType.BOOLEAN, CoreValuesSourceType.DATE); } @Override diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/metrics/HDRPercentileRanksAggregatorTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/metrics/HDRPercentileRanksAggregatorTests.java index eddc12a095ab0..c817d8a0d54f3 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/metrics/HDRPercentileRanksAggregatorTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/metrics/HDRPercentileRanksAggregatorTests.java @@ -40,7 +40,7 @@ protected AggregationBuilder createAggBuilderForTypeTest(MappedFieldType fieldTy @Override protected List getSupportedValuesSourceTypes() { - return List.of(CoreValuesSourceType.NUMERIC, CoreValuesSourceType.DATE, CoreValuesSourceType.BOOLEAN); + return List.of(CoreValuesSourceType.DOUBLE, CoreValuesSourceType.LONG, CoreValuesSourceType.DATE, CoreValuesSourceType.BOOLEAN); } public void testEmpty() throws IOException { diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/metrics/HDRPercentilesAggregatorTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/metrics/HDRPercentilesAggregatorTests.java index 0a82a569e8c55..8b6552e2f7446 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/metrics/HDRPercentilesAggregatorTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/metrics/HDRPercentilesAggregatorTests.java @@ -53,7 +53,7 @@ protected AggregationBuilder createAggBuilderForTypeTest(MappedFieldType fieldTy @Override protected List getSupportedValuesSourceTypes() { - return List.of(CoreValuesSourceType.NUMERIC, CoreValuesSourceType.DATE, CoreValuesSourceType.BOOLEAN); + return List.of(CoreValuesSourceType.DOUBLE, CoreValuesSourceType.LONG, CoreValuesSourceType.DATE, CoreValuesSourceType.BOOLEAN); } public void testNoDocs() throws IOException { diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/metrics/MaxAggregatorTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/metrics/MaxAggregatorTests.java index 52652893ecc1d..1eff5fc51b824 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/metrics/MaxAggregatorTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/metrics/MaxAggregatorTests.java @@ -153,7 +153,7 @@ protected ScriptService getMockScriptService() { @Override protected List getSupportedValuesSourceTypes() { - return List.of(CoreValuesSourceType.NUMERIC, CoreValuesSourceType.BOOLEAN, CoreValuesSourceType.DATE); + return List.of(CoreValuesSourceType.DOUBLE, CoreValuesSourceType.LONG, CoreValuesSourceType.BOOLEAN, CoreValuesSourceType.DATE); } @Override diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/metrics/MedianAbsoluteDeviationAggregatorTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/metrics/MedianAbsoluteDeviationAggregatorTests.java index 22275cfc4876a..9270c49718866 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/metrics/MedianAbsoluteDeviationAggregatorTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/metrics/MedianAbsoluteDeviationAggregatorTests.java @@ -46,7 +46,6 @@ import java.util.stream.IntStream; import static java.util.Collections.singleton; -import static java.util.Collections.singletonList; import static org.elasticsearch.search.aggregations.metrics.MedianAbsoluteDeviationAggregatorTests.ExactMedianAbsoluteDeviation.calculateMAD; import static org.elasticsearch.search.aggregations.metrics.MedianAbsoluteDeviationAggregatorTests.IsCloseToRelative.closeToRelative; import static org.hamcrest.Matchers.equalTo; @@ -307,7 +306,7 @@ private static double calculateMedian(double[] sample) { @Override protected List getSupportedValuesSourceTypes() { - return singletonList(CoreValuesSourceType.NUMERIC); + return List.of(CoreValuesSourceType.DOUBLE, CoreValuesSourceType.LONG); } @Override diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/metrics/StatsAggregatorTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/metrics/StatsAggregatorTests.java index 05c1667a5cc37..9a9c2af343634 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/metrics/StatsAggregatorTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/metrics/StatsAggregatorTests.java @@ -426,7 +426,7 @@ void add(double value) { @Override protected List getSupportedValuesSourceTypes() { - return List.of(CoreValuesSourceType.NUMERIC, CoreValuesSourceType.BOOLEAN, CoreValuesSourceType.DATE); + return List.of(CoreValuesSourceType.DOUBLE, CoreValuesSourceType.LONG, CoreValuesSourceType.BOOLEAN, CoreValuesSourceType.DATE); } @Override diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/metrics/SumAggregatorTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/metrics/SumAggregatorTests.java index 8cd8358cae043..7564b3a177398 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/metrics/SumAggregatorTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/metrics/SumAggregatorTests.java @@ -384,7 +384,7 @@ private void testAggregation( @Override protected List getSupportedValuesSourceTypes() { - return List.of(CoreValuesSourceType.NUMERIC, CoreValuesSourceType.BOOLEAN, CoreValuesSourceType.DATE); + return List.of(CoreValuesSourceType.DOUBLE, CoreValuesSourceType.LONG, CoreValuesSourceType.BOOLEAN, CoreValuesSourceType.DATE); } @Override diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/metrics/TDigestPercentileRanksAggregatorTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/metrics/TDigestPercentileRanksAggregatorTests.java index 6b99e20f4a399..fbe7f2299e36c 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/metrics/TDigestPercentileRanksAggregatorTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/metrics/TDigestPercentileRanksAggregatorTests.java @@ -40,7 +40,7 @@ protected AggregationBuilder createAggBuilderForTypeTest(MappedFieldType fieldTy @Override protected List getSupportedValuesSourceTypes() { - return List.of(CoreValuesSourceType.NUMERIC, CoreValuesSourceType.DATE, CoreValuesSourceType.BOOLEAN); + return List.of(CoreValuesSourceType.DOUBLE, CoreValuesSourceType.LONG, CoreValuesSourceType.DATE, CoreValuesSourceType.BOOLEAN); } public void testEmpty() throws IOException { diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/metrics/TDigestPercentilesAggregatorTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/metrics/TDigestPercentilesAggregatorTests.java index c50aee1b430b5..bccbb92619af6 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/metrics/TDigestPercentilesAggregatorTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/metrics/TDigestPercentilesAggregatorTests.java @@ -46,7 +46,7 @@ protected AggregationBuilder createAggBuilderForTypeTest(MappedFieldType fieldTy @Override protected List getSupportedValuesSourceTypes() { - return List.of(CoreValuesSourceType.NUMERIC, CoreValuesSourceType.DATE, CoreValuesSourceType.BOOLEAN); + return List.of(CoreValuesSourceType.DOUBLE, CoreValuesSourceType.LONG, CoreValuesSourceType.DATE, CoreValuesSourceType.BOOLEAN); } public void testNoDocs() throws IOException { diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/metrics/ValueCountAggregatorTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/metrics/ValueCountAggregatorTests.java index 63e8b0ce7e651..31d05ef47892a 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/metrics/ValueCountAggregatorTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/metrics/ValueCountAggregatorTests.java @@ -75,7 +75,8 @@ protected AggregationBuilder createAggBuilderForTypeTest(MappedFieldType fieldTy @Override protected List getSupportedValuesSourceTypes() { return List.of( - CoreValuesSourceType.NUMERIC, + CoreValuesSourceType.DOUBLE, + CoreValuesSourceType.LONG, CoreValuesSourceType.KEYWORD, CoreValuesSourceType.GEOPOINT, CoreValuesSourceType.RANGE, diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/support/CoreValuesSourceTypeTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/support/CoreValuesSourceTypeTests.java index 9655a353da8e3..0f8950503c5e6 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/support/CoreValuesSourceTypeTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/support/CoreValuesSourceTypeTests.java @@ -25,7 +25,8 @@ public class CoreValuesSourceTypeTests extends MapperServiceTestCase { public void testFromString() { - assertThat(CoreValuesSourceType.fromString("numeric"), equalTo(CoreValuesSourceType.NUMERIC)); + assertThat(CoreValuesSourceType.fromString("double"), equalTo(CoreValuesSourceType.DOUBLE)); + assertThat(CoreValuesSourceType.fromString("long"), equalTo(CoreValuesSourceType.LONG)); assertThat(CoreValuesSourceType.fromString("keyword"), equalTo(CoreValuesSourceType.KEYWORD)); assertThat(CoreValuesSourceType.fromString("geopoint"), equalTo(CoreValuesSourceType.GEOPOINT)); assertThat(CoreValuesSourceType.fromString("range"), equalTo(CoreValuesSourceType.RANGE)); diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/support/MultiValuesSourceFieldConfigTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/support/MultiValuesSourceFieldConfigTests.java index 7fc07c5e78758..72bab65667b3c 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/support/MultiValuesSourceFieldConfigTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/support/MultiValuesSourceFieldConfigTests.java @@ -49,7 +49,7 @@ protected MultiValuesSourceFieldConfig createTestInstance() { .setTimeZone(timeZone) .setFilter(filter) .setFormat(format) - .setUserValueTypeHint(userValueTypeHint) + .setUserValueTypeHint(userValueTypeHint == null ? null : userValueTypeHint.getPreferredName()) .build(); } diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/support/ValuesSourceConfigTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/support/ValuesSourceConfigTests.java index 027c0a9a3cc26..0d9a17731f56c 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/support/ValuesSourceConfigTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/support/ValuesSourceConfigTests.java @@ -58,13 +58,31 @@ public void testUnmappedKeyword() throws Exception { MapperService mapperService = createMapperService(mapping(b -> {})); withAggregationContext(mapperService, List.of(source(b -> {})), context -> { ValuesSourceConfig config; - config = ValuesSourceConfig.resolve(context, ValueType.STRING, "field", null, null, null, null, CoreValuesSourceType.KEYWORD); + config = ValuesSourceConfig.resolve( + context, + CoreValuesSourceType.KEYWORD, + "field", + null, + null, + null, + null, + CoreValuesSourceType.KEYWORD + ); ValuesSource.Bytes valuesSource = (ValuesSource.Bytes) config.getValuesSource(); assertNotNull(valuesSource); assertFalse(config.hasValues()); assertFalse(config.alignesWithSearchIndex()); - config = ValuesSourceConfig.resolve(context, ValueType.STRING, "field", null, "abc", null, null, CoreValuesSourceType.KEYWORD); + config = ValuesSourceConfig.resolve( + context, + CoreValuesSourceType.KEYWORD, + "field", + null, + "abc", + null, + null, + CoreValuesSourceType.KEYWORD + ); valuesSource = (ValuesSource.Bytes) config.getValuesSource(); LeafReaderContext ctx = context.searcher().getIndexReader().leaves().get(0); SortedBinaryDocValues values = valuesSource.bytesValues(ctx); @@ -115,13 +133,31 @@ public void testUnmappedLong() throws Exception { MapperService mapperService = createMapperService(mapping(b -> {})); withAggregationContext(mapperService, List.of(source(b -> {})), context -> { ValuesSourceConfig config; - config = ValuesSourceConfig.resolve(context, ValueType.NUMBER, "field", null, null, null, null, CoreValuesSourceType.KEYWORD); + config = ValuesSourceConfig.resolve( + context, + CoreValuesSourceType.LONG, + "field", + null, + null, + null, + null, + CoreValuesSourceType.KEYWORD + ); ValuesSource.Numeric valuesSource = (ValuesSource.Numeric) config.getValuesSource(); assertNotNull(valuesSource); assertFalse(config.hasValues()); assertFalse(config.alignesWithSearchIndex()); - config = ValuesSourceConfig.resolve(context, ValueType.NUMBER, "field", null, 42, null, null, CoreValuesSourceType.KEYWORD); + config = ValuesSourceConfig.resolve( + context, + CoreValuesSourceType.LONG, + "field", + null, + 42, + null, + null, + CoreValuesSourceType.KEYWORD + ); valuesSource = (ValuesSource.Numeric) config.getValuesSource(); LeafReaderContext ctx = context.searcher().getIndexReader().leaves().get(0); SortedNumericDocValues values = valuesSource.longValues(ctx); @@ -172,13 +208,31 @@ public void testUnmappedBoolean() throws Exception { MapperService mapperService = createMapperService(mapping(b -> {})); withAggregationContext(mapperService, List.of(source(b -> {})), context -> { ValuesSourceConfig config; - config = ValuesSourceConfig.resolve(context, ValueType.BOOLEAN, "field", null, null, null, null, CoreValuesSourceType.KEYWORD); + config = ValuesSourceConfig.resolve( + context, + CoreValuesSourceType.BOOLEAN, + "field", + null, + null, + null, + null, + CoreValuesSourceType.KEYWORD + ); ValuesSource.Numeric valuesSource = (ValuesSource.Numeric) config.getValuesSource(); assertNotNull(valuesSource); assertFalse(config.hasValues()); assertFalse(config.alignesWithSearchIndex()); - config = ValuesSourceConfig.resolve(context, ValueType.BOOLEAN, "field", null, true, null, null, CoreValuesSourceType.KEYWORD); + config = ValuesSourceConfig.resolve( + context, + CoreValuesSourceType.BOOLEAN, + "field", + null, + true, + null, + null, + CoreValuesSourceType.KEYWORD + ); valuesSource = (ValuesSource.Numeric) config.getValuesSource(); LeafReaderContext ctx = context.searcher().getIndexReader().leaves().get(0); SortedNumericDocValues values = valuesSource.longValues(ctx); @@ -196,7 +250,16 @@ public void testFieldAlias() throws Exception { })); withAggregationContext(mapperService, List.of(source(b -> b.field("field", "value"))), context -> { ValuesSourceConfig config; - config = ValuesSourceConfig.resolve(context, ValueType.STRING, "alias", null, null, null, null, CoreValuesSourceType.KEYWORD); + config = ValuesSourceConfig.resolve( + context, + CoreValuesSourceType.KEYWORD, + "alias", + null, + null, + null, + null, + CoreValuesSourceType.KEYWORD + ); ValuesSource.Bytes valuesSource = (ValuesSource.Bytes) config.getValuesSource(); LeafReaderContext ctx = context.searcher().getIndexReader().leaves().get(0); diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/support/ValuesSourceRegistryTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/support/ValuesSourceRegistryTests.java index 5bbee314d5f22..b9350aaa60109 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/support/ValuesSourceRegistryTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/support/ValuesSourceRegistryTests.java @@ -52,7 +52,7 @@ public void testAggregatorNotFoundException() { "bogus", HistogramAggregatorSupplier.class ); - ValuesSourceRegistry registry = new ValuesSourceRegistry(Map.of(key, List.of()), null); + ValuesSourceRegistry registry = new ValuesSourceRegistry(Map.of(key, List.of()), null, null); expectThrows(IllegalArgumentException.class, () -> registry.getAggregator(key, fieldOnly)); expectThrows(IllegalArgumentException.class, () -> registry.getAggregator(key, scriptOnly)); } diff --git a/test/framework/src/main/java/org/elasticsearch/search/aggregations/AggregatorTestCase.java b/test/framework/src/main/java/org/elasticsearch/search/aggregations/AggregatorTestCase.java index 533e56e6936ef..f360cbbd28134 100644 --- a/test/framework/src/main/java/org/elasticsearch/search/aggregations/AggregatorTestCase.java +++ b/test/framework/src/main/java/org/elasticsearch/search/aggregations/AggregatorTestCase.java @@ -981,7 +981,8 @@ private void writeTestDoc(MappedFieldType fieldType, String fieldName, RandomInd Document doc = new Document(); String json; - if (vst.equals(CoreValuesSourceType.NUMERIC)) { + // NOCOMMI: Break out long and double logic? + if (vst.equals(CoreValuesSourceType.DOUBLE) || vst.equals(CoreValuesSourceType.LONG)) { long v; if (typeName.equals(NumberFieldMapper.NumberType.DOUBLE.typeName())) { double d = Math.abs(randomDouble()); diff --git a/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/AnalyticsPlugin.java b/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/AnalyticsPlugin.java index 1382ac60a2dcf..25f4f36083f73 100644 --- a/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/AnalyticsPlugin.java +++ b/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/AnalyticsPlugin.java @@ -23,6 +23,7 @@ import org.elasticsearch.repositories.RepositoriesService; import org.elasticsearch.script.ScriptService; import org.elasticsearch.search.aggregations.support.ValuesSourceRegistry; +import org.elasticsearch.search.aggregations.support.ValuesSourceType; import org.elasticsearch.threadpool.ThreadPool; import org.elasticsearch.watcher.ResourceWatcherService; import org.elasticsearch.xcontent.NamedXContentRegistry; @@ -30,6 +31,7 @@ import org.elasticsearch.xpack.analytics.action.AnalyticsUsageTransportAction; import org.elasticsearch.xpack.analytics.action.TransportAnalyticsStatsAction; import org.elasticsearch.xpack.analytics.aggregations.AnalyticsAggregatorFactory; +import org.elasticsearch.xpack.analytics.aggregations.support.AnalyticsValuesSourceType; import org.elasticsearch.xpack.analytics.boxplot.BoxplotAggregationBuilder; import org.elasticsearch.xpack.analytics.boxplot.InternalBoxplot; import org.elasticsearch.xpack.analytics.cumulativecardinality.CumulativeCardinalityPipelineAggregationBuilder; @@ -98,6 +100,11 @@ public List getPipelineAggregations() { return pipelineAggs; } + @Override + public List getValuesSourceTypes() { + return Arrays.asList(AnalyticsValuesSourceType.values()); + } + @Override public List getAggregations() { return Arrays.asList( diff --git a/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/aggregations/support/AnalyticsValuesSourceType.java b/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/aggregations/support/AnalyticsValuesSourceType.java index aebb2698b0870..b3eb870551f58 100644 --- a/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/aggregations/support/AnalyticsValuesSourceType.java +++ b/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/aggregations/support/AnalyticsValuesSourceType.java @@ -13,7 +13,6 @@ import org.elasticsearch.search.aggregations.AggregationExecutionException; import org.elasticsearch.search.aggregations.support.AggregationContext; import org.elasticsearch.search.aggregations.support.FieldContext; -import org.elasticsearch.search.aggregations.support.ValueType; import org.elasticsearch.search.aggregations.support.ValuesSource; import org.elasticsearch.search.aggregations.support.ValuesSourceType; @@ -28,7 +27,7 @@ public ValuesSource getEmpty() { } @Override - public ValuesSource getScript(AggregationScript.LeafFactory script, ValueType scriptValueType) { + public ValuesSource getScript(AggregationScript.LeafFactory script) { throw new AggregationExecutionException("value source of type [" + this.value() + "] is not supported by scripts"); } diff --git a/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/boxplot/BoxplotAggregationBuilder.java b/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/boxplot/BoxplotAggregationBuilder.java index 8ad0379815dbd..1531c67eadfc8 100644 --- a/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/boxplot/BoxplotAggregationBuilder.java +++ b/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/boxplot/BoxplotAggregationBuilder.java @@ -93,7 +93,7 @@ protected void innerWriteTo(StreamOutput out) throws IOException { @Override protected ValuesSourceType defaultValueSourceType() { - return CoreValuesSourceType.NUMERIC; + return CoreValuesSourceType.DOUBLE; } /** diff --git a/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/boxplot/BoxplotAggregatorFactory.java b/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/boxplot/BoxplotAggregatorFactory.java index d3bb7f4031836..2bd096bb663ab 100644 --- a/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/boxplot/BoxplotAggregatorFactory.java +++ b/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/boxplot/BoxplotAggregatorFactory.java @@ -30,7 +30,7 @@ public class BoxplotAggregatorFactory extends ValuesSourceAggregatorFactory { static void registerAggregators(ValuesSourceRegistry.Builder builder) { builder.register( BoxplotAggregationBuilder.REGISTRY_KEY, - List.of(CoreValuesSourceType.NUMERIC, AnalyticsValuesSourceType.HISTOGRAM), + List.of(CoreValuesSourceType.DOUBLE, CoreValuesSourceType.LONG, AnalyticsValuesSourceType.HISTOGRAM), BoxplotAggregator::new, true ); diff --git a/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/multiterms/MultiTermsAggregationBuilder.java b/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/multiterms/MultiTermsAggregationBuilder.java index 5e2ec1f9aa813..e9f1a3d9553ad 100644 --- a/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/multiterms/MultiTermsAggregationBuilder.java +++ b/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/multiterms/MultiTermsAggregationBuilder.java @@ -112,10 +112,10 @@ interface MultiTermValuesSupplier { public static void registerAggregators(ValuesSourceRegistry.Builder registry) { registry.registerUsage(NAME); - registry.register(REGISTRY_KEY, List.of(CoreValuesSourceType.NUMERIC), MultiTermsAggregator::buildNumericTermValues, false); + registry.register(REGISTRY_KEY, List.of(CoreValuesSourceType.DOUBLE), MultiTermsAggregator::buildNumericTermValues, false); registry.register( REGISTRY_KEY, - List.of(CoreValuesSourceType.BOOLEAN, CoreValuesSourceType.DATE), + List.of(CoreValuesSourceType.BOOLEAN, CoreValuesSourceType.LONG, CoreValuesSourceType.DATE), MultiTermsAggregator.LongTermValuesSource::new, false ); @@ -374,7 +374,7 @@ protected List resolveConfig(AggregationContext context) { configs.add( ValuesSourceConfig.resolveUnregistered( context, - field.getUserValueTypeHint(), + context.getValuesSourceRegistry().resolveTypeHint(field.getUserValueTypeHint()), field.getFieldName(), field.getScript(), field.getMissing(), diff --git a/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/rate/RateAggregationBuilder.java b/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/rate/RateAggregationBuilder.java index eb1f9815e1875..4f0a11579f3c3 100644 --- a/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/rate/RateAggregationBuilder.java +++ b/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/rate/RateAggregationBuilder.java @@ -94,7 +94,7 @@ public RateAggregationBuilder(StreamInput in) throws IOException { @Override protected ValuesSourceType defaultValueSourceType() { - return CoreValuesSourceType.NUMERIC; + return CoreValuesSourceType.DOUBLE; } @Override @@ -191,7 +191,7 @@ static Rounding.DateTimeUnit parse(String rateUnit) { @Override protected ValuesSourceConfig resolveConfig(AggregationContext context) { if (field() == null && script() == null) { - return new ValuesSourceConfig(CoreValuesSourceType.NUMERIC, null, true, null, null, 1.0, null, DocValueFormat.RAW, context); + return new ValuesSourceConfig(CoreValuesSourceType.DOUBLE, null, true, null, 1.0, null, DocValueFormat.RAW, context); } else { return super.resolveConfig(context); } diff --git a/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/rate/RateAggregatorFactory.java b/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/rate/RateAggregatorFactory.java index e5a243012395b..ff01fdb8c1e72 100644 --- a/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/rate/RateAggregatorFactory.java +++ b/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/rate/RateAggregatorFactory.java @@ -23,6 +23,7 @@ import java.io.IOException; import java.util.Collections; +import java.util.List; import java.util.Map; class RateAggregatorFactory extends ValuesSourceAggregatorFactory { @@ -54,7 +55,7 @@ class RateAggregatorFactory extends ValuesSourceAggregatorFactory { static void registerAggregators(ValuesSourceRegistry.Builder builder) { builder.register( RateAggregationBuilder.REGISTRY_KEY, - Collections.singletonList(CoreValuesSourceType.NUMERIC), + List.of(CoreValuesSourceType.DOUBLE, CoreValuesSourceType.LONG), NumericRateAggregator::new, true ); diff --git a/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/topmetrics/TopMetricsAggregationBuilder.java b/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/topmetrics/TopMetricsAggregationBuilder.java index bdf28c33786fe..8a7992de0e6db 100644 --- a/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/topmetrics/TopMetricsAggregationBuilder.java +++ b/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/topmetrics/TopMetricsAggregationBuilder.java @@ -48,7 +48,12 @@ public class TopMetricsAggregationBuilder extends AbstractAggregationBuilder PARSER = ObjectParser.fromBuilder(NAME, TTestAggregationBuilder::new); static { - MultiValuesSourceParseHelper.declareCommon(PARSER, true, ValueType.NUMERIC); + MultiValuesSourceParseHelper.declareCommon(PARSER, true); MultiValuesSourceParseHelper.declareField(A_FIELD.getPreferredName(), PARSER, true, false, true, false); MultiValuesSourceParseHelper.declareField(B_FIELD.getPreferredName(), PARSER, true, false, true, false); PARSER.declareString(TTestAggregationBuilder::testType, TYPE_FIELD); @@ -56,7 +55,7 @@ public class TTestAggregationBuilder extends MultiValuesSourceAggregationBuilder private int tails = 2; public static void registerUsage(ValuesSourceRegistry.Builder builder) { - builder.registerUsage(NAME, CoreValuesSourceType.NUMERIC); + builder.registerUsage(NAME, CoreValuesSourceType.DOUBLE); } public TTestAggregationBuilder(String name) { @@ -122,7 +121,7 @@ protected void innerWriteTo(StreamOutput out) throws IOException { @Override protected ValuesSourceType defaultValueSourceType() { - return CoreValuesSourceType.NUMERIC; + return CoreValuesSourceType.DOUBLE; } @Override diff --git a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/aggregations/metrics/HDRPreAggregatedPercentileRanksAggregatorTests.java b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/aggregations/metrics/HDRPreAggregatedPercentileRanksAggregatorTests.java index f920e3e78a1d3..8b7912860e8a4 100644 --- a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/aggregations/metrics/HDRPreAggregatedPercentileRanksAggregatorTests.java +++ b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/aggregations/metrics/HDRPreAggregatedPercentileRanksAggregatorTests.java @@ -56,7 +56,8 @@ protected AggregationBuilder createAggBuilderForTypeTest(MappedFieldType fieldTy protected List getSupportedValuesSourceTypes() { // Note: this is the same list as Core, plus Analytics return List.of( - CoreValuesSourceType.NUMERIC, + CoreValuesSourceType.DOUBLE, + CoreValuesSourceType.LONG, CoreValuesSourceType.DATE, CoreValuesSourceType.BOOLEAN, AnalyticsValuesSourceType.HISTOGRAM diff --git a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/aggregations/metrics/HDRPreAggregatedPercentilesAggregatorTests.java b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/aggregations/metrics/HDRPreAggregatedPercentilesAggregatorTests.java index fec2fe1a33a19..9c0528e9e083a 100644 --- a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/aggregations/metrics/HDRPreAggregatedPercentilesAggregatorTests.java +++ b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/aggregations/metrics/HDRPreAggregatedPercentilesAggregatorTests.java @@ -59,7 +59,8 @@ protected AggregationBuilder createAggBuilderForTypeTest(MappedFieldType fieldTy protected List getSupportedValuesSourceTypes() { // Note: this is the same list as Core, plus Analytics return List.of( - CoreValuesSourceType.NUMERIC, + CoreValuesSourceType.DOUBLE, + CoreValuesSourceType.LONG, CoreValuesSourceType.DATE, CoreValuesSourceType.BOOLEAN, AnalyticsValuesSourceType.HISTOGRAM diff --git a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/aggregations/metrics/HistoBackedAvgAggregatorTests.java b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/aggregations/metrics/HistoBackedAvgAggregatorTests.java index d7296aef1b401..8457d00b9bf76 100644 --- a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/aggregations/metrics/HistoBackedAvgAggregatorTests.java +++ b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/aggregations/metrics/HistoBackedAvgAggregatorTests.java @@ -123,7 +123,8 @@ protected List getSearchPlugins() { protected List getSupportedValuesSourceTypes() { // Note: this is the same list as Core, plus Analytics return List.of( - CoreValuesSourceType.NUMERIC, + CoreValuesSourceType.DOUBLE, + CoreValuesSourceType.LONG, CoreValuesSourceType.BOOLEAN, CoreValuesSourceType.DATE, AnalyticsValuesSourceType.HISTOGRAM diff --git a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/aggregations/metrics/HistoBackedMaxAggregatorTests.java b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/aggregations/metrics/HistoBackedMaxAggregatorTests.java index 88ba9e9234799..dfa195470ca85 100644 --- a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/aggregations/metrics/HistoBackedMaxAggregatorTests.java +++ b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/aggregations/metrics/HistoBackedMaxAggregatorTests.java @@ -123,7 +123,8 @@ protected List getSearchPlugins() { protected List getSupportedValuesSourceTypes() { // Note: this is the same list as Core, plus Analytics return List.of( - CoreValuesSourceType.NUMERIC, + CoreValuesSourceType.DOUBLE, + CoreValuesSourceType.LONG, CoreValuesSourceType.BOOLEAN, CoreValuesSourceType.DATE, AnalyticsValuesSourceType.HISTOGRAM diff --git a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/aggregations/metrics/HistoBackedMinAggregatorTests.java b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/aggregations/metrics/HistoBackedMinAggregatorTests.java index 3066225b6f629..0f9ddf3950c2b 100644 --- a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/aggregations/metrics/HistoBackedMinAggregatorTests.java +++ b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/aggregations/metrics/HistoBackedMinAggregatorTests.java @@ -123,7 +123,8 @@ protected List getSearchPlugins() { protected List getSupportedValuesSourceTypes() { // Note: this is the same list as Core, plus Analytics return List.of( - CoreValuesSourceType.NUMERIC, + CoreValuesSourceType.DOUBLE, + CoreValuesSourceType.LONG, CoreValuesSourceType.BOOLEAN, CoreValuesSourceType.DATE, AnalyticsValuesSourceType.HISTOGRAM diff --git a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/aggregations/metrics/HistoBackedSumAggregatorTests.java b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/aggregations/metrics/HistoBackedSumAggregatorTests.java index 52b2119b56242..4ca48e29d9bb7 100644 --- a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/aggregations/metrics/HistoBackedSumAggregatorTests.java +++ b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/aggregations/metrics/HistoBackedSumAggregatorTests.java @@ -123,7 +123,8 @@ protected List getSearchPlugins() { protected List getSupportedValuesSourceTypes() { // Note: this is the same list as Core, plus Analytics return List.of( - CoreValuesSourceType.NUMERIC, + CoreValuesSourceType.DOUBLE, + CoreValuesSourceType.LONG, CoreValuesSourceType.BOOLEAN, CoreValuesSourceType.DATE, AnalyticsValuesSourceType.HISTOGRAM diff --git a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/aggregations/metrics/HistoBackedValueCountAggregatorTests.java b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/aggregations/metrics/HistoBackedValueCountAggregatorTests.java index 039e5f474007b..cd99c5af2ae8f 100644 --- a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/aggregations/metrics/HistoBackedValueCountAggregatorTests.java +++ b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/aggregations/metrics/HistoBackedValueCountAggregatorTests.java @@ -123,7 +123,8 @@ protected List getSearchPlugins() { protected List getSupportedValuesSourceTypes() { // Note: this is the same list as Core, plus Analytics return List.of( - CoreValuesSourceType.NUMERIC, + CoreValuesSourceType.DOUBLE, + CoreValuesSourceType.LONG, CoreValuesSourceType.KEYWORD, CoreValuesSourceType.GEOPOINT, CoreValuesSourceType.RANGE, diff --git a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/aggregations/metrics/TDigestPreAggregatedPercentileRanksAggregatorTests.java b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/aggregations/metrics/TDigestPreAggregatedPercentileRanksAggregatorTests.java index a7662e0358b48..3a62bd0e865d0 100644 --- a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/aggregations/metrics/TDigestPreAggregatedPercentileRanksAggregatorTests.java +++ b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/aggregations/metrics/TDigestPreAggregatedPercentileRanksAggregatorTests.java @@ -54,7 +54,8 @@ protected AggregationBuilder createAggBuilderForTypeTest(MappedFieldType fieldTy protected List getSupportedValuesSourceTypes() { // Note: this is the same list as Core, plus Analytics return List.of( - CoreValuesSourceType.NUMERIC, + CoreValuesSourceType.DOUBLE, + CoreValuesSourceType.LONG, CoreValuesSourceType.DATE, CoreValuesSourceType.BOOLEAN, AnalyticsValuesSourceType.HISTOGRAM diff --git a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/aggregations/metrics/TDigestPreAggregatedPercentilesAggregatorTests.java b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/aggregations/metrics/TDigestPreAggregatedPercentilesAggregatorTests.java index 024212c5d8c64..b62242f9f4aa2 100644 --- a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/aggregations/metrics/TDigestPreAggregatedPercentilesAggregatorTests.java +++ b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/aggregations/metrics/TDigestPreAggregatedPercentilesAggregatorTests.java @@ -55,7 +55,8 @@ protected AggregationBuilder createAggBuilderForTypeTest(MappedFieldType fieldTy protected List getSupportedValuesSourceTypes() { // Note: this is the same list as Core, plus Analytics return List.of( - CoreValuesSourceType.NUMERIC, + CoreValuesSourceType.DOUBLE, + CoreValuesSourceType.LONG, CoreValuesSourceType.DATE, CoreValuesSourceType.BOOLEAN, AnalyticsValuesSourceType.HISTOGRAM diff --git a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/boxplot/BoxplotAggregatorTests.java b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/boxplot/BoxplotAggregatorTests.java index 0ad234c425891..3348aacdb2b7d 100644 --- a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/boxplot/BoxplotAggregatorTests.java +++ b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/boxplot/BoxplotAggregatorTests.java @@ -67,7 +67,7 @@ protected AggregationBuilder createAggBuilderForTypeTest(MappedFieldType fieldTy @Override protected List getSupportedValuesSourceTypes() { - return List.of(CoreValuesSourceType.NUMERIC, AnalyticsValuesSourceType.HISTOGRAM); + return List.of(CoreValuesSourceType.DOUBLE, CoreValuesSourceType.LONG, AnalyticsValuesSourceType.HISTOGRAM); } @Override diff --git a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/multiterms/MultiTermsAggregatorTests.java b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/multiterms/MultiTermsAggregatorTests.java index d14bccd0f6058..4e3a6aa3988ec 100644 --- a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/multiterms/MultiTermsAggregatorTests.java +++ b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/multiterms/MultiTermsAggregatorTests.java @@ -90,7 +90,8 @@ protected AggregationBuilder createAggBuilderForTypeTest(MappedFieldType fieldTy @Override protected List getSupportedValuesSourceTypes() { return List.of( - CoreValuesSourceType.NUMERIC, + CoreValuesSourceType.DOUBLE, + CoreValuesSourceType.LONG, CoreValuesSourceType.DATE, CoreValuesSourceType.BOOLEAN, CoreValuesSourceType.KEYWORD, @@ -330,7 +331,7 @@ public void testScripts() throws IOException { new MultiValuesSourceFieldConfig.Builder().setFieldName(KEYWORD_FIELD).build(), new MultiValuesSourceFieldConfig.Builder().setScript( new Script(ScriptType.INLINE, MockScriptEngine.NAME, ADD_ONE_SCRIPT, Collections.singletonMap("fieldname", INT_FIELD)) - ).setUserValueTypeHint(ValueType.LONG).build(), + ).setUserValueTypeHint(ValueType.LONG.getPreferredName()).build(), new MultiValuesSourceFieldConfig.Builder().setFieldName(INT_FIELD).build() ), null, diff --git a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/topmetrics/TopMetricsAggregatorMetricsTests.java b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/topmetrics/TopMetricsAggregatorMetricsTests.java index 0ab41367b6d50..88fc041a18da7 100644 --- a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/topmetrics/TopMetricsAggregatorMetricsTests.java +++ b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/topmetrics/TopMetricsAggregatorMetricsTests.java @@ -51,12 +51,16 @@ public class TopMetricsAggregatorMetricsTests extends ESTestCase { private static final ValuesSourceRegistry REGISTRY; static { ValuesSourceRegistry.Builder registry = new ValuesSourceRegistry.Builder(); + for (ValuesSourceType vst : CoreValuesSourceType.values()) { + registry.registerValuesSourceType(vst); + } TopMetricsAggregationBuilder.registerAggregators(registry); REGISTRY = registry.build(); } public void testNoNumbers() throws IOException { - assertNoValues(toConfig(null, CoreValuesSourceType.NUMERIC, DocValueFormat.RAW, false)); + assertNoValues(toConfig(null, CoreValuesSourceType.DOUBLE, DocValueFormat.RAW, false)); + assertNoValues(toConfig(null, CoreValuesSourceType.LONG, DocValueFormat.RAW, false)); } public void testNoDates() throws IOException { @@ -203,7 +207,8 @@ private ValuesSourceConfig toConfig(SortedNumericDocValues values) throws IOExce when(source.isFloatingPoint()).thenReturn(false); when(source.longValues(null)).thenReturn(values); if (randomBoolean()) { - return toConfig(source, CoreValuesSourceType.NUMERIC, randomWholeNumberDocValuesFormat(), true); + // TODO: should we have a case for CVST.LONG here? + return toConfig(source, CoreValuesSourceType.DOUBLE, randomWholeNumberDocValuesFormat(), true); } DocValueFormat dateFormatter = new DocValueFormat.DateTime( DateFormatter.forPattern(randomDateFormatterPattern()), @@ -217,12 +222,7 @@ private ValuesSourceConfig toConfig(SortedNumericDoubleValues values) throws IOE ValuesSource.Numeric source = mock(ValuesSource.Numeric.class); when(source.isFloatingPoint()).thenReturn(true); when(source.doubleValues(null)).thenReturn(values); - return toConfig( - source, - CoreValuesSourceType.NUMERIC, - randomFrom(DocValueFormat.RAW, new DocValueFormat.Decimal("####.####")), - true - ); + return toConfig(source, CoreValuesSourceType.DOUBLE, randomFrom(DocValueFormat.RAW, new DocValueFormat.Decimal("####.####")), true); } private ValuesSourceConfig toConfig(SortedSetDocValues values) throws IOException { diff --git a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/ttest/TTestAggregatorTests.java b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/ttest/TTestAggregatorTests.java index 3ef0f4b64a3b4..21e405495bd25 100644 --- a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/ttest/TTestAggregatorTests.java +++ b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/ttest/TTestAggregatorTests.java @@ -110,7 +110,7 @@ protected AggregationBuilder createAggBuilderForTypeTest(MappedFieldType fieldTy @Override protected List getSupportedValuesSourceTypes() { - return List.of(CoreValuesSourceType.NUMERIC, CoreValuesSourceType.BOOLEAN, CoreValuesSourceType.DATE); + return List.of(CoreValuesSourceType.DOUBLE, CoreValuesSourceType.LONG, CoreValuesSourceType.BOOLEAN, CoreValuesSourceType.DATE); } @Override diff --git a/x-pack/plugin/mapper-aggregate-metric/src/main/java/org/elasticsearch/xpack/aggregatemetric/AggregateMetricMapperPlugin.java b/x-pack/plugin/mapper-aggregate-metric/src/main/java/org/elasticsearch/xpack/aggregatemetric/AggregateMetricMapperPlugin.java index e44b65ee2212b..0d3f1346cee1a 100644 --- a/x-pack/plugin/mapper-aggregate-metric/src/main/java/org/elasticsearch/xpack/aggregatemetric/AggregateMetricMapperPlugin.java +++ b/x-pack/plugin/mapper-aggregate-metric/src/main/java/org/elasticsearch/xpack/aggregatemetric/AggregateMetricMapperPlugin.java @@ -15,7 +15,9 @@ import org.elasticsearch.plugins.Plugin; import org.elasticsearch.plugins.SearchPlugin; import org.elasticsearch.search.aggregations.support.ValuesSourceRegistry; +import org.elasticsearch.search.aggregations.support.ValuesSourceType; import org.elasticsearch.xpack.aggregatemetric.aggregations.metrics.AggregateMetricsAggregatorsRegistrar; +import org.elasticsearch.xpack.aggregatemetric.aggregations.support.AggregateMetricsValuesSourceType; import org.elasticsearch.xpack.aggregatemetric.mapper.AggregateDoubleMetricFieldMapper; import org.elasticsearch.xpack.core.action.XPackInfoFeatureAction; import org.elasticsearch.xpack.core.action.XPackUsageFeatureAction; @@ -42,6 +44,11 @@ public Map getMappers() { ); } + @Override + public List getValuesSourceTypes() { + return Arrays.asList(AggregateMetricsValuesSourceType.values()); + } + @Override public List> getAggregationExtentions() { return List.of( diff --git a/x-pack/plugin/mapper-aggregate-metric/src/main/java/org/elasticsearch/xpack/aggregatemetric/aggregations/support/AggregateMetricsValuesSourceType.java b/x-pack/plugin/mapper-aggregate-metric/src/main/java/org/elasticsearch/xpack/aggregatemetric/aggregations/support/AggregateMetricsValuesSourceType.java index dd3f6d694664b..ddf759a31fab7 100644 --- a/x-pack/plugin/mapper-aggregate-metric/src/main/java/org/elasticsearch/xpack/aggregatemetric/aggregations/support/AggregateMetricsValuesSourceType.java +++ b/x-pack/plugin/mapper-aggregate-metric/src/main/java/org/elasticsearch/xpack/aggregatemetric/aggregations/support/AggregateMetricsValuesSourceType.java @@ -12,7 +12,6 @@ import org.elasticsearch.search.aggregations.AggregationExecutionException; import org.elasticsearch.search.aggregations.support.AggregationContext; import org.elasticsearch.search.aggregations.support.FieldContext; -import org.elasticsearch.search.aggregations.support.ValueType; import org.elasticsearch.search.aggregations.support.ValuesSource; import org.elasticsearch.search.aggregations.support.ValuesSourceType; import org.elasticsearch.xpack.aggregatemetric.fielddata.IndexAggregateDoubleMetricFieldData; @@ -28,7 +27,7 @@ public ValuesSource getEmpty() { } @Override - public ValuesSource getScript(AggregationScript.LeafFactory script, ValueType scriptValueType) { + public ValuesSource getScript(AggregationScript.LeafFactory script) { throw new AggregationExecutionException("Value source of type [" + this.value() + "] is not supported by scripts"); } diff --git a/x-pack/plugin/mapper-aggregate-metric/src/test/java/org/elasticsearch/xpack/aggregatemetric/aggregations/metrics/AggregateMetricBackedAvgAggregatorTests.java b/x-pack/plugin/mapper-aggregate-metric/src/test/java/org/elasticsearch/xpack/aggregatemetric/aggregations/metrics/AggregateMetricBackedAvgAggregatorTests.java index 7abe41574c92e..843af8141ba2d 100644 --- a/x-pack/plugin/mapper-aggregate-metric/src/test/java/org/elasticsearch/xpack/aggregatemetric/aggregations/metrics/AggregateMetricBackedAvgAggregatorTests.java +++ b/x-pack/plugin/mapper-aggregate-metric/src/test/java/org/elasticsearch/xpack/aggregatemetric/aggregations/metrics/AggregateMetricBackedAvgAggregatorTests.java @@ -151,7 +151,8 @@ protected AggregationBuilder createAggBuilderForTypeTest(MappedFieldType fieldTy @Override protected List getSupportedValuesSourceTypes() { return List.of( - CoreValuesSourceType.NUMERIC, + CoreValuesSourceType.DOUBLE, + CoreValuesSourceType.LONG, CoreValuesSourceType.DATE, CoreValuesSourceType.BOOLEAN, AggregateMetricsValuesSourceType.AGGREGATE_METRIC diff --git a/x-pack/plugin/mapper-aggregate-metric/src/test/java/org/elasticsearch/xpack/aggregatemetric/aggregations/metrics/AggregateMetricBackedMaxAggregatorTests.java b/x-pack/plugin/mapper-aggregate-metric/src/test/java/org/elasticsearch/xpack/aggregatemetric/aggregations/metrics/AggregateMetricBackedMaxAggregatorTests.java index d4840a8a6a73a..7dbba90e7d72b 100644 --- a/x-pack/plugin/mapper-aggregate-metric/src/test/java/org/elasticsearch/xpack/aggregatemetric/aggregations/metrics/AggregateMetricBackedMaxAggregatorTests.java +++ b/x-pack/plugin/mapper-aggregate-metric/src/test/java/org/elasticsearch/xpack/aggregatemetric/aggregations/metrics/AggregateMetricBackedMaxAggregatorTests.java @@ -151,7 +151,8 @@ protected AggregationBuilder createAggBuilderForTypeTest(MappedFieldType fieldTy @Override protected List getSupportedValuesSourceTypes() { return List.of( - CoreValuesSourceType.NUMERIC, + CoreValuesSourceType.DOUBLE, + CoreValuesSourceType.LONG, CoreValuesSourceType.DATE, CoreValuesSourceType.BOOLEAN, AggregateMetricsValuesSourceType.AGGREGATE_METRIC diff --git a/x-pack/plugin/mapper-aggregate-metric/src/test/java/org/elasticsearch/xpack/aggregatemetric/aggregations/metrics/AggregateMetricBackedMinAggregatorTests.java b/x-pack/plugin/mapper-aggregate-metric/src/test/java/org/elasticsearch/xpack/aggregatemetric/aggregations/metrics/AggregateMetricBackedMinAggregatorTests.java index 4d28508c6b35c..4fbaafe425484 100644 --- a/x-pack/plugin/mapper-aggregate-metric/src/test/java/org/elasticsearch/xpack/aggregatemetric/aggregations/metrics/AggregateMetricBackedMinAggregatorTests.java +++ b/x-pack/plugin/mapper-aggregate-metric/src/test/java/org/elasticsearch/xpack/aggregatemetric/aggregations/metrics/AggregateMetricBackedMinAggregatorTests.java @@ -151,7 +151,8 @@ protected AggregationBuilder createAggBuilderForTypeTest(MappedFieldType fieldTy @Override protected List getSupportedValuesSourceTypes() { return List.of( - CoreValuesSourceType.NUMERIC, + CoreValuesSourceType.DOUBLE, + CoreValuesSourceType.LONG, CoreValuesSourceType.DATE, CoreValuesSourceType.BOOLEAN, AggregateMetricsValuesSourceType.AGGREGATE_METRIC diff --git a/x-pack/plugin/mapper-aggregate-metric/src/test/java/org/elasticsearch/xpack/aggregatemetric/aggregations/metrics/AggregateMetricBackedSumAggregatorTests.java b/x-pack/plugin/mapper-aggregate-metric/src/test/java/org/elasticsearch/xpack/aggregatemetric/aggregations/metrics/AggregateMetricBackedSumAggregatorTests.java index c1c607e051a4f..6699c9941dbcb 100644 --- a/x-pack/plugin/mapper-aggregate-metric/src/test/java/org/elasticsearch/xpack/aggregatemetric/aggregations/metrics/AggregateMetricBackedSumAggregatorTests.java +++ b/x-pack/plugin/mapper-aggregate-metric/src/test/java/org/elasticsearch/xpack/aggregatemetric/aggregations/metrics/AggregateMetricBackedSumAggregatorTests.java @@ -151,7 +151,8 @@ protected AggregationBuilder createAggBuilderForTypeTest(MappedFieldType fieldTy @Override protected List getSupportedValuesSourceTypes() { return List.of( - CoreValuesSourceType.NUMERIC, + CoreValuesSourceType.DOUBLE, + CoreValuesSourceType.LONG, CoreValuesSourceType.DATE, CoreValuesSourceType.BOOLEAN, AggregateMetricsValuesSourceType.AGGREGATE_METRIC diff --git a/x-pack/plugin/mapper-aggregate-metric/src/test/java/org/elasticsearch/xpack/aggregatemetric/aggregations/metrics/AggregateMetricBackedValueCountAggregatorTests.java b/x-pack/plugin/mapper-aggregate-metric/src/test/java/org/elasticsearch/xpack/aggregatemetric/aggregations/metrics/AggregateMetricBackedValueCountAggregatorTests.java index 9fd3a7eb7c4c5..4d0d45460f249 100644 --- a/x-pack/plugin/mapper-aggregate-metric/src/test/java/org/elasticsearch/xpack/aggregatemetric/aggregations/metrics/AggregateMetricBackedValueCountAggregatorTests.java +++ b/x-pack/plugin/mapper-aggregate-metric/src/test/java/org/elasticsearch/xpack/aggregatemetric/aggregations/metrics/AggregateMetricBackedValueCountAggregatorTests.java @@ -150,7 +150,8 @@ protected AggregationBuilder createAggBuilderForTypeTest(MappedFieldType fieldTy @Override protected List getSupportedValuesSourceTypes() { return List.of( - CoreValuesSourceType.NUMERIC, + CoreValuesSourceType.DOUBLE, + CoreValuesSourceType.LONG, CoreValuesSourceType.KEYWORD, CoreValuesSourceType.GEOPOINT, CoreValuesSourceType.RANGE, diff --git a/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/SpatialPlugin.java b/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/SpatialPlugin.java index 064e43e2b9e90..fb2fe448f1eac 100644 --- a/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/SpatialPlugin.java +++ b/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/SpatialPlugin.java @@ -32,6 +32,7 @@ import org.elasticsearch.search.aggregations.metrics.ValueCountAggregationBuilder; import org.elasticsearch.search.aggregations.metrics.ValueCountAggregator; import org.elasticsearch.search.aggregations.support.ValuesSourceRegistry; +import org.elasticsearch.search.aggregations.support.ValuesSourceType; import org.elasticsearch.xcontent.ContextParser; import org.elasticsearch.xpack.core.XPackPlugin; import org.elasticsearch.xpack.core.action.XPackInfoFeatureAction; @@ -121,6 +122,11 @@ public List> getQueries() { return singletonList(new QuerySpec<>(ShapeQueryBuilder.NAME, ShapeQueryBuilder::new, ShapeQueryBuilder::fromXContent)); } + @Override + public List getValuesSourceTypes() { + return List.of(GeoShapeValuesSourceType.GEOSHAPE); + } + @Override public List> getAggregationExtentions() { return List.of( @@ -149,18 +155,13 @@ public Map getProcessors(Processor.Parameters paramet } private static void registerGeoShapeBoundsAggregator(ValuesSourceRegistry.Builder builder) { - builder.register( - GeoBoundsAggregationBuilder.REGISTRY_KEY, - GeoShapeValuesSourceType.instance(), - GeoShapeBoundsAggregator::new, - true - ); + builder.register(GeoBoundsAggregationBuilder.REGISTRY_KEY, GeoShapeValuesSourceType.GEOSHAPE, GeoShapeBoundsAggregator::new, true); } private void registerGeoShapeCentroidAggregator(ValuesSourceRegistry.Builder builder) { builder.register( GeoCentroidAggregationBuilder.REGISTRY_KEY, - GeoShapeValuesSourceType.instance(), + GeoShapeValuesSourceType.GEOSHAPE, (name, valuesSourceConfig, context, parent, metadata) -> { if (GEO_CENTROID_AGG_FEATURE.check(getLicenseState())) { return new GeoShapeCentroidAggregator(name, context, parent, valuesSourceConfig, metadata); @@ -174,7 +175,7 @@ private void registerGeoShapeCentroidAggregator(ValuesSourceRegistry.Builder bui private void registerGeoShapeGridAggregators(ValuesSourceRegistry.Builder builder) { builder.register( GeoHashGridAggregationBuilder.REGISTRY_KEY, - GeoShapeValuesSourceType.instance(), + GeoShapeValuesSourceType.GEOSHAPE, ( name, factories, @@ -217,7 +218,7 @@ private void registerGeoShapeGridAggregators(ValuesSourceRegistry.Builder builde builder.register( GeoTileGridAggregationBuilder.REGISTRY_KEY, - GeoShapeValuesSourceType.instance(), + GeoShapeValuesSourceType.GEOSHAPE, ( name, factories, @@ -260,11 +261,11 @@ private void registerGeoShapeGridAggregators(ValuesSourceRegistry.Builder builde } private static void registerValueCountAggregator(ValuesSourceRegistry.Builder builder) { - builder.register(ValueCountAggregationBuilder.REGISTRY_KEY, GeoShapeValuesSourceType.instance(), ValueCountAggregator::new, true); + builder.register(ValueCountAggregationBuilder.REGISTRY_KEY, GeoShapeValuesSourceType.GEOSHAPE, ValueCountAggregator::new, true); } private static void registerCardinalityAggregator(ValuesSourceRegistry.Builder builder) { - builder.register(CardinalityAggregationBuilder.REGISTRY_KEY, GeoShapeValuesSourceType.instance(), CardinalityAggregator::new, true); + builder.register(CardinalityAggregationBuilder.REGISTRY_KEY, GeoShapeValuesSourceType.GEOSHAPE, CardinalityAggregator::new, true); } private ContextParser checkLicense(ContextParser realParser, LicensedFeature.Momentary feature) { diff --git a/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/fielddata/GeoShapeValues.java b/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/fielddata/GeoShapeValues.java index 781a062c4b065..2e783d38dc4bf 100644 --- a/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/fielddata/GeoShapeValues.java +++ b/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/fielddata/GeoShapeValues.java @@ -41,7 +41,7 @@ public abstract class GeoShapeValues { public static GeoShapeValues EMPTY = new GeoShapeValues() { - private final GeoShapeValuesSourceType DEFAULT_VALUES_SOURCE_TYPE = GeoShapeValuesSourceType.instance(); + private final GeoShapeValuesSourceType DEFAULT_VALUES_SOURCE_TYPE = GeoShapeValuesSourceType.GEOSHAPE; @Override public boolean advanceExact(int doc) { diff --git a/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/fielddata/plain/LatLonShapeDVAtomicShapeFieldData.java b/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/fielddata/plain/LatLonShapeDVAtomicShapeFieldData.java index b41918ffdcc51..7b3a418569973 100644 --- a/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/fielddata/plain/LatLonShapeDVAtomicShapeFieldData.java +++ b/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/fielddata/plain/LatLonShapeDVAtomicShapeFieldData.java @@ -58,7 +58,7 @@ public boolean advanceExact(int doc) throws IOException { @Override public ValuesSourceType valuesSourceType() { - return GeoShapeValuesSourceType.instance(); + return GeoShapeValuesSourceType.GEOSHAPE; } @Override diff --git a/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/mapper/GeoShapeWithDocValuesFieldMapper.java b/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/mapper/GeoShapeWithDocValuesFieldMapper.java index 86669cd871a20..2a9997b75fa48 100644 --- a/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/mapper/GeoShapeWithDocValuesFieldMapper.java +++ b/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/mapper/GeoShapeWithDocValuesFieldMapper.java @@ -173,7 +173,7 @@ public GeoShapeWithDocValuesFieldType( public IndexFieldData.Builder fielddataBuilder(String fullyQualifiedIndexName, Supplier searchLookup) { failIfNoDocValues(); - return new AbstractLatLonShapeIndexFieldData.Builder(name(), GeoShapeValuesSourceType.instance()); + return new AbstractLatLonShapeIndexFieldData.Builder(name(), GeoShapeValuesSourceType.GEOSHAPE); } @Override diff --git a/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/search/aggregations/GeoLineAggregationBuilder.java b/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/search/aggregations/GeoLineAggregationBuilder.java index 4147ae66783fe..e3e2b161cc5e0 100644 --- a/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/search/aggregations/GeoLineAggregationBuilder.java +++ b/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/search/aggregations/GeoLineAggregationBuilder.java @@ -19,7 +19,6 @@ import org.elasticsearch.search.aggregations.support.MultiValuesSourceAggregatorFactory; import org.elasticsearch.search.aggregations.support.MultiValuesSourceFieldConfig; import org.elasticsearch.search.aggregations.support.MultiValuesSourceParseHelper; -import org.elasticsearch.search.aggregations.support.ValueType; import org.elasticsearch.search.aggregations.support.ValuesSourceConfig; import org.elasticsearch.search.aggregations.support.ValuesSourceRegistry; import org.elasticsearch.search.aggregations.support.ValuesSourceType; @@ -48,7 +47,7 @@ public class GeoLineAggregationBuilder extends MultiValuesSourceAggregationBuild GeoLineAggregationBuilder::new ); static { - MultiValuesSourceParseHelper.declareCommon(PARSER, true, ValueType.NUMERIC); + MultiValuesSourceParseHelper.declareCommon(PARSER, true); MultiValuesSourceParseHelper.declareField(POINT_FIELD.getPreferredName(), PARSER, true, false, false, false); MultiValuesSourceParseHelper.declareField(SORT_FIELD.getPreferredName(), PARSER, true, false, false, false); PARSER.declareString((builder, order) -> builder.sortOrder(SortOrder.fromString(order)), ORDER_FIELD); @@ -124,7 +123,7 @@ protected void innerWriteTo(StreamOutput out) throws IOException { @Override protected ValuesSourceType defaultValueSourceType() { - return CoreValuesSourceType.NUMERIC; + return CoreValuesSourceType.DOUBLE; } @Override diff --git a/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/search/aggregations/bucket/geogrid/GeoShapeCellIdSource.java b/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/search/aggregations/bucket/geogrid/GeoShapeCellIdSource.java index cfd1bce97ab24..acf3594c331b2 100644 --- a/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/search/aggregations/bucket/geogrid/GeoShapeCellIdSource.java +++ b/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/search/aggregations/bucket/geogrid/GeoShapeCellIdSource.java @@ -48,7 +48,7 @@ public boolean isFloatingPoint() { public SortedNumericDocValues longValues(LeafReaderContext ctx) { GeoShapeValues geoValues = valuesSource.geoShapeValues(ctx); ValuesSourceType vs = geoValues.valuesSourceType(); - if (GeoShapeValuesSourceType.instance() == vs) { + if (GeoShapeValuesSourceType.GEOSHAPE == vs) { // docValues are geo shapes return new GeoShapeCellValues(geoValues, encoder, circuitBreakerConsumer); } else { diff --git a/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/search/aggregations/support/GeoShapeValuesSourceType.java b/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/search/aggregations/support/GeoShapeValuesSourceType.java index 139f462575349..57f6d0848edd0 100644 --- a/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/search/aggregations/support/GeoShapeValuesSourceType.java +++ b/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/search/aggregations/support/GeoShapeValuesSourceType.java @@ -9,8 +9,6 @@ import org.apache.lucene.index.LeafReaderContext; import org.apache.lucene.util.BytesRef; -import org.elasticsearch.common.io.stream.StreamOutput; -import org.elasticsearch.common.io.stream.Writeable; import org.elasticsearch.index.fielddata.IndexGeoPointFieldData; import org.elasticsearch.index.fielddata.SortedBinaryDocValues; import org.elasticsearch.script.AggregationScript; @@ -18,7 +16,6 @@ import org.elasticsearch.search.aggregations.support.AggregationContext; import org.elasticsearch.search.aggregations.support.FieldContext; import org.elasticsearch.search.aggregations.support.MissingValues; -import org.elasticsearch.search.aggregations.support.ValueType; import org.elasticsearch.search.aggregations.support.ValuesSource; import org.elasticsearch.search.aggregations.support.ValuesSourceType; import org.elasticsearch.xpack.spatial.index.fielddata.GeoShapeValues; @@ -26,100 +23,90 @@ import java.io.IOException; -public class GeoShapeValuesSourceType implements Writeable, ValuesSourceType { - - static GeoShapeValuesSourceType INSTANCE = new GeoShapeValuesSourceType(); - - public static GeoShapeValuesSourceType instance() { - return INSTANCE; - } - - @Override - public ValuesSource getEmpty() { - return GeoShapeValuesSource.EMPTY; - } - - @Override - public ValuesSource getScript(AggregationScript.LeafFactory script, ValueType scriptValueType) { - // TODO (support scripts) - throw new UnsupportedOperationException("geo_shape"); - } - - @Override - public ValuesSource getField(FieldContext fieldContext, AggregationScript.LeafFactory script, AggregationContext context) { - boolean isGeoPoint = fieldContext.indexFieldData() instanceof IndexGeoPointFieldData; - boolean isGeoShape = fieldContext.indexFieldData() instanceof IndexGeoShapeFieldData; - if (isGeoPoint == false && isGeoShape == false) { - throw new IllegalArgumentException( - "Expected geo_point or geo_shape type on field [" - + fieldContext.field() - + "], but got [" - + fieldContext.fieldType().typeName() - + "]" - ); - } - if (isGeoPoint) { - return new ValuesSource.GeoPoint.Fielddata((IndexGeoPointFieldData) fieldContext.indexFieldData()); +public enum GeoShapeValuesSourceType implements ValuesSourceType { + GEOSHAPE { + @Override + public ValuesSource getEmpty() { + return GeoShapeValuesSource.EMPTY; } - return new GeoShapeValuesSource.Fielddata((IndexGeoShapeFieldData) fieldContext.indexFieldData()); - } - - @Override - public ValuesSource replaceMissing( - ValuesSource valuesSource, - Object rawMissing, - DocValueFormat docValueFormat, - AggregationContext context - ) { - GeoShapeValuesSource geoShapeValuesSource = (GeoShapeValuesSource) valuesSource; - final GeoShapeValues.GeoShapeValue missing = GeoShapeValues.GeoShapeValue.missing(rawMissing.toString()); - return new GeoShapeValuesSource() { - @Override - public GeoShapeValues geoShapeValues(LeafReaderContext context) { - GeoShapeValues values = geoShapeValuesSource.geoShapeValues(context); - return new GeoShapeValues() { - private boolean exists; - - @Override - public boolean advanceExact(int doc) throws IOException { - exists = values.advanceExact(doc); - // always return true because we want to return a value even if - // the document does not have a value - return true; - } - - @Override - public ValuesSourceType valuesSourceType() { - return values.valuesSourceType(); - } - - @Override - public GeoShapeValue value() throws IOException { - return exists ? values.value() : missing; - } + @Override + public ValuesSource getScript(AggregationScript.LeafFactory script) { + // TODO (support scripts) + throw new UnsupportedOperationException("geo_shape"); + } - @Override - public String toString() { - return "anon MultiGeoShapeValues of [" + super.toString() + "]"; - } - }; + @Override + public ValuesSource getField(FieldContext fieldContext, AggregationScript.LeafFactory script, AggregationContext context) { + boolean isGeoPoint = fieldContext.indexFieldData() instanceof IndexGeoPointFieldData; + boolean isGeoShape = fieldContext.indexFieldData() instanceof IndexGeoShapeFieldData; + if (isGeoPoint == false && isGeoShape == false) { + throw new IllegalArgumentException( + "Expected geo_point or geo_shape type on field [" + + fieldContext.field() + + "], but got [" + + fieldContext.fieldType().typeName() + + "]" + ); } - - @Override - public SortedBinaryDocValues bytesValues(LeafReaderContext context) throws IOException { - return MissingValues.replaceMissing(geoShapeValuesSource.bytesValues(context), new BytesRef(missing.toString())); + if (isGeoPoint) { + return new ValuesSource.GeoPoint.Fielddata((IndexGeoPointFieldData) fieldContext.indexFieldData()); } - }; - } - - @Override - public String typeName() { - return "geoshape"; - } + return new GeoShapeValuesSource.Fielddata((IndexGeoShapeFieldData) fieldContext.indexFieldData()); + } - @Override - public void writeTo(StreamOutput out) throws IOException { + @Override + public ValuesSource replaceMissing( + ValuesSource valuesSource, + Object rawMissing, + DocValueFormat docValueFormat, + AggregationContext context + ) { + GeoShapeValuesSource geoShapeValuesSource = (GeoShapeValuesSource) valuesSource; + final GeoShapeValues.GeoShapeValue missing = GeoShapeValues.GeoShapeValue.missing(rawMissing.toString()); + return new GeoShapeValuesSource() { + @Override + public GeoShapeValues geoShapeValues(LeafReaderContext context) { + GeoShapeValues values = geoShapeValuesSource.geoShapeValues(context); + return new GeoShapeValues() { + + private boolean exists; + + @Override + public boolean advanceExact(int doc) throws IOException { + exists = values.advanceExact(doc); + // always return true because we want to return a value even if + // the document does not have a value + return true; + } + + @Override + public ValuesSourceType valuesSourceType() { + return values.valuesSourceType(); + } + + @Override + public GeoShapeValue value() throws IOException { + return exists ? values.value() : missing; + } + + @Override + public String toString() { + return "anon MultiGeoShapeValues of [" + super.toString() + "]"; + } + }; + } + + @Override + public SortedBinaryDocValues bytesValues(LeafReaderContext context) throws IOException { + return MissingValues.replaceMissing(geoShapeValuesSource.bytesValues(context), new BytesRef(missing.toString())); + } + }; + } + @Override + public String typeName() { + return "geoshape"; + } } } diff --git a/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/SpatialPluginTests.java b/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/SpatialPluginTests.java index 2ea9a4205ba5a..d263db3a1925c 100644 --- a/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/SpatialPluginTests.java +++ b/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/SpatialPluginTests.java @@ -33,12 +33,13 @@ public void testGeoCentroidLicenseCheck() { for (License.OperationMode operationMode : License.OperationMode.values()) { SpatialPlugin plugin = getPluginWithOperationMode(operationMode); ValuesSourceRegistry.Builder registryBuilder = new ValuesSourceRegistry.Builder(); + registryBuilder.registerValuesSourceType(GeoShapeValuesSourceType.GEOSHAPE); List> registrar = plugin.getAggregationExtentions(); registrar.forEach(c -> c.accept(registryBuilder)); ValuesSourceRegistry registry = registryBuilder.build(); MetricAggregatorSupplier centroidSupplier = registry.getAggregator( GeoCentroidAggregationBuilder.REGISTRY_KEY, - new ValuesSourceConfig(GeoShapeValuesSourceType.instance(), null, true, null, null, null, null, null, null) + new ValuesSourceConfig(GeoShapeValuesSourceType.GEOSHAPE, null, true, null, null, null, null, null) ); if (License.OperationMode.TRIAL != operationMode && License.OperationMode.compare(operationMode, License.OperationMode.GOLD) < 0) { @@ -62,12 +63,13 @@ public void testGeoGridLicenseCheck() { for (License.OperationMode operationMode : License.OperationMode.values()) { SpatialPlugin plugin = getPluginWithOperationMode(operationMode); ValuesSourceRegistry.Builder registryBuilder = new ValuesSourceRegistry.Builder(); + registryBuilder.registerValuesSourceType(GeoShapeValuesSourceType.GEOSHAPE); List> registrar = plugin.getAggregationExtentions(); registrar.forEach(c -> c.accept(registryBuilder)); ValuesSourceRegistry registry = registryBuilder.build(); GeoGridAggregatorSupplier supplier = registry.getAggregator( registryKey, - new ValuesSourceConfig(GeoShapeValuesSourceType.instance(), null, true, null, null, null, null, null, null) + new ValuesSourceConfig(GeoShapeValuesSourceType.GEOSHAPE, null, true, null, null, null, null, null) ); if (License.OperationMode.TRIAL != operationMode && License.OperationMode.compare(operationMode, License.OperationMode.GOLD) < 0) { diff --git a/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/search/aggregations/bucket/geogrid/GeoGridTilerTestCase.java b/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/search/aggregations/bucket/geogrid/GeoGridTilerTestCase.java index 15dd9383e5022..f47edcff8f064 100644 --- a/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/search/aggregations/bucket/geogrid/GeoGridTilerTestCase.java +++ b/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/search/aggregations/bucket/geogrid/GeoGridTilerTestCase.java @@ -265,7 +265,7 @@ public boolean advanceExact(int doc) { @Override public ValuesSourceType valuesSourceType() { - return GeoShapeValuesSourceType.instance(); + return GeoShapeValuesSourceType.GEOSHAPE; } @Override diff --git a/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/search/aggregations/bucket/geogrid/GeoShapeGeoGridTestCase.java b/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/search/aggregations/bucket/geogrid/GeoShapeGeoGridTestCase.java index d448c2a9320c2..bbce0a0f1a343 100644 --- a/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/search/aggregations/bucket/geogrid/GeoShapeGeoGridTestCase.java +++ b/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/search/aggregations/bucket/geogrid/GeoShapeGeoGridTestCase.java @@ -99,7 +99,7 @@ protected List getSearchPlugins() { @Override protected List getSupportedValuesSourceTypes() { - return List.of(GeoShapeValuesSourceType.instance(), CoreValuesSourceType.GEOPOINT); + return List.of(GeoShapeValuesSourceType.GEOSHAPE, CoreValuesSourceType.GEOPOINT); } @Override diff --git a/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/search/aggregations/metrics/GeoShapeBoundsAggregatorTests.java b/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/search/aggregations/metrics/GeoShapeBoundsAggregatorTests.java index afa37276b9b8b..616509fa36c43 100644 --- a/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/search/aggregations/metrics/GeoShapeBoundsAggregatorTests.java +++ b/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/search/aggregations/metrics/GeoShapeBoundsAggregatorTests.java @@ -250,6 +250,6 @@ protected AggregationBuilder createAggBuilderForTypeTest(MappedFieldType fieldTy @Override protected List getSupportedValuesSourceTypes() { - return List.of(CoreValuesSourceType.GEOPOINT, GeoShapeValuesSourceType.instance()); + return List.of(CoreValuesSourceType.GEOPOINT, GeoShapeValuesSourceType.GEOSHAPE); } } diff --git a/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/search/aggregations/metrics/GeoShapeCentroidAggregatorTests.java b/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/search/aggregations/metrics/GeoShapeCentroidAggregatorTests.java index a52cfd1881808..9738e5aa93a0d 100644 --- a/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/search/aggregations/metrics/GeoShapeCentroidAggregatorTests.java +++ b/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/search/aggregations/metrics/GeoShapeCentroidAggregatorTests.java @@ -222,6 +222,6 @@ protected AggregationBuilder createAggBuilderForTypeTest(MappedFieldType fieldTy @Override protected List getSupportedValuesSourceTypes() { - return List.of(CoreValuesSourceType.GEOPOINT, GeoShapeValuesSourceType.instance()); + return List.of(CoreValuesSourceType.GEOPOINT, GeoShapeValuesSourceType.GEOSHAPE); } }