diff --git a/server/src/main/java/org/elasticsearch/search/SearchModule.java b/server/src/main/java/org/elasticsearch/search/SearchModule.java index 270732ffa76d4..e107b84f6a655 100644 --- a/server/src/main/java/org/elasticsearch/search/SearchModule.java +++ b/server/src/main/java/org/elasticsearch/search/SearchModule.java @@ -430,7 +430,9 @@ private void registerAggregations(List plugins) { HistogramAggregationBuilder::parse).addResultReader(InternalHistogram::new) .setAggregatorRegistrar(HistogramAggregationBuilder::registerAggregators)); registerAggregation(new AggregationSpec(DateHistogramAggregationBuilder.NAME, DateHistogramAggregationBuilder::new, - DateHistogramAggregationBuilder::parse).addResultReader(InternalDateHistogram::new)); + DateHistogramAggregationBuilder::parse) + .addResultReader(InternalDateHistogram::new) + .setAggregatorRegistrar(DateHistogramAggregationBuilder::registerAggregators)); registerAggregation(new AggregationSpec(AutoDateHistogramAggregationBuilder.NAME, AutoDateHistogramAggregationBuilder::new, AutoDateHistogramAggregationBuilder::parse).addResultReader(InternalAutoDateHistogram::new)); registerAggregation(new AggregationSpec(GeoDistanceAggregationBuilder.NAME, GeoDistanceAggregationBuilder::new, diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/DateHistogramAggregationBuilder.java b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/DateHistogramAggregationBuilder.java index ede3b55ddc2ce..4b6ee93a753e8 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/DateHistogramAggregationBuilder.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/DateHistogramAggregationBuilder.java @@ -50,6 +50,7 @@ import org.elasticsearch.search.aggregations.support.ValuesSourceAggregatorFactory; import org.elasticsearch.search.aggregations.support.ValuesSourceConfig; import org.elasticsearch.search.aggregations.support.ValuesSourceParserHelper; +import org.elasticsearch.search.aggregations.support.ValuesSourceRegistry; import org.elasticsearch.search.aggregations.support.ValuesSourceType; import java.io.IOException; @@ -120,6 +121,10 @@ public static DateHistogramAggregationBuilder parse(String aggregationName, XCon return PARSER.parse(parser, new DateHistogramAggregationBuilder(aggregationName), null); } + public static void registerAggregators(ValuesSourceRegistry valuesSourceRegistry) { + DateHistogramAggregatorFactory.registerAggregators(valuesSourceRegistry); + } + private DateIntervalWrapper dateHistogramInterval = new DateIntervalWrapper(); private long offset = 0; private ExtendedBounds extendedBounds; diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/DateHistogramAggregationSupplier.java b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/DateHistogramAggregationSupplier.java new file mode 100644 index 0000000000000..fde98b335d3cd --- /dev/null +++ b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/DateHistogramAggregationSupplier.java @@ -0,0 +1,53 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.elasticsearch.search.aggregations.bucket.histogram; + +import org.elasticsearch.common.Nullable; +import org.elasticsearch.common.Rounding; +import org.elasticsearch.search.DocValueFormat; +import org.elasticsearch.search.aggregations.Aggregator; +import org.elasticsearch.search.aggregations.AggregatorFactories; +import org.elasticsearch.search.aggregations.BucketOrder; +import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator; +import org.elasticsearch.search.aggregations.support.AggregatorSupplier; +import org.elasticsearch.search.aggregations.support.ValuesSource; +import org.elasticsearch.search.internal.SearchContext; + +import java.io.IOException; +import java.util.List; +import java.util.Map; + +@FunctionalInterface +public interface DateHistogramAggregationSupplier extends AggregatorSupplier { + Aggregator build(String name, + AggregatorFactories factories, + Rounding rounding, + Rounding shardRounding, + BucketOrder order, + boolean keyed, + long minDocCount, + @Nullable ExtendedBounds extendedBounds, + @Nullable ValuesSource valuesSource, + DocValueFormat formatter, + SearchContext aggregationContext, + Aggregator parent, + List pipelineAggregators, + Map metaData) throws IOException; +} 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 fa00882e0dc16..8240806bb894a 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 @@ -19,25 +19,77 @@ package org.elasticsearch.search.aggregations.bucket.histogram; +import org.elasticsearch.common.Nullable; import org.elasticsearch.common.Rounding; import org.elasticsearch.index.mapper.RangeType; import org.elasticsearch.index.query.QueryShardContext; +import org.elasticsearch.search.DocValueFormat; +import org.elasticsearch.search.aggregations.AggregationExecutionException; import org.elasticsearch.search.aggregations.Aggregator; import org.elasticsearch.search.aggregations.AggregatorFactories; import org.elasticsearch.search.aggregations.AggregatorFactory; import org.elasticsearch.search.aggregations.BucketOrder; import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator; +import org.elasticsearch.search.aggregations.support.AggregatorSupplier; +import org.elasticsearch.search.aggregations.support.CoreValuesSourceType; import org.elasticsearch.search.aggregations.support.ValuesSource; import org.elasticsearch.search.aggregations.support.ValuesSourceAggregatorFactory; import org.elasticsearch.search.aggregations.support.ValuesSourceConfig; +import org.elasticsearch.search.aggregations.support.ValuesSourceRegistry; import org.elasticsearch.search.internal.SearchContext; import java.io.IOException; import java.util.List; import java.util.Map; -public final class DateHistogramAggregatorFactory - extends ValuesSourceAggregatorFactory { +public final class DateHistogramAggregatorFactory extends ValuesSourceAggregatorFactory { + + public static void registerAggregators(ValuesSourceRegistry valuesSourceRegistry) { + valuesSourceRegistry.register(DateHistogramAggregationBuilder.NAME, + List.of(CoreValuesSourceType.DATE, CoreValuesSourceType.NUMERIC, CoreValuesSourceType.BOOLEAN), + (DateHistogramAggregationSupplier) (String name, + AggregatorFactories factories, + Rounding rounding, + Rounding shardRounding, + BucketOrder order, + boolean keyed, + long minDocCount, + @Nullable ExtendedBounds extendedBounds, + @Nullable ValuesSource valuesSource, + DocValueFormat formatter, + SearchContext aggregationContext, + Aggregator parent, + List pipelineAggregators, + Map metaData) -> new DateHistogramAggregator(name, + factories, rounding, shardRounding, order, keyed, minDocCount, extendedBounds, (ValuesSource.Numeric) valuesSource, + formatter, aggregationContext, parent, pipelineAggregators, metaData)); + + valuesSourceRegistry.register(DateHistogramAggregationBuilder.NAME, + CoreValuesSourceType.RANGE, + (DateHistogramAggregationSupplier) (String name, + AggregatorFactories factories, + Rounding rounding, + Rounding shardRounding, + BucketOrder order, + boolean keyed, + long minDocCount, + @Nullable ExtendedBounds extendedBounds, + @Nullable ValuesSource valuesSource, + DocValueFormat formatter, + SearchContext aggregationContext, + Aggregator parent, + List pipelineAggregators, + Map metaData) -> { + + ValuesSource.Range rangeValueSource = (ValuesSource.Range) valuesSource; + if (rangeValueSource.rangeType() != RangeType.DATE) { + throw new IllegalArgumentException("Expected date range type but found range type [" + rangeValueSource.rangeType().name + + "]"); + } + return new DateRangeHistogramAggregator(name, + factories, rounding, shardRounding, order, keyed, minDocCount, extendedBounds, rangeValueSource, formatter, + aggregationContext, parent, pipelineAggregators, metaData); }); + } private final BucketOrder order; private final boolean keyed; @@ -74,36 +126,14 @@ protected Aggregator doCreateInternal(ValuesSource valuesSource, if (collectsFromSingleBucket == false) { return asMultiBucketAggregator(this, searchContext, parent); } - if (valuesSource instanceof ValuesSource.Numeric) { - return createAggregator((ValuesSource.Numeric) valuesSource, searchContext, parent, pipelineAggregators, metaData); - } else if (valuesSource instanceof ValuesSource.Range) { - ValuesSource.Range rangeValueSource = (ValuesSource.Range) valuesSource; - if (rangeValueSource.rangeType() != RangeType.DATE) { - throw new IllegalArgumentException("Expected date range type but found range type [" + rangeValueSource.rangeType().name - + "]"); - } - return createRangeAggregator((ValuesSource.Range) valuesSource, searchContext, parent, pipelineAggregators, metaData); - } - else { - throw new IllegalArgumentException("Expected one of [Date, Range] values source, found [" - + valuesSource.toString() + "]"); + AggregatorSupplier aggregatorSupplier = queryShardContext.getValuesSourceRegistry().getAggregator(config.valueSourceType(), + DateHistogramAggregationBuilder.NAME); + if (aggregatorSupplier instanceof DateHistogramAggregationSupplier == false) { + throw new AggregationExecutionException("Registry miss-match - expected DateHistogramAggregationSupplier, found [" + + aggregatorSupplier.getClass().toString() + "]"); } - } - - private Aggregator createAggregator(ValuesSource.Numeric valuesSource, SearchContext searchContext, - Aggregator parent, List pipelineAggregators, - Map metaData) throws IOException { - return new DateHistogramAggregator(name, factories, rounding, shardRounding, order, keyed, minDocCount, extendedBounds, - valuesSource, config.format(), searchContext, parent, pipelineAggregators, metaData); - } - - private Aggregator createRangeAggregator(ValuesSource.Range valuesSource, - SearchContext searchContext, - Aggregator parent, - List pipelineAggregators, - Map metaData) throws IOException { - return new DateRangeHistogramAggregator(name, factories, rounding, shardRounding, order, keyed, minDocCount, extendedBounds, - valuesSource, config.format(), searchContext, parent, pipelineAggregators, metaData); + return ((DateHistogramAggregationSupplier) aggregatorSupplier).build(name, factories, rounding, shardRounding, order, keyed, + minDocCount, extendedBounds, valuesSource, config.format(), searchContext, parent, pipelineAggregators, metaData); } @Override @@ -111,6 +141,7 @@ protected Aggregator createUnmapped(SearchContext searchContext, Aggregator parent, List pipelineAggregators, Map metaData) throws IOException { - return createAggregator(null, searchContext, parent, pipelineAggregators, metaData); + return new DateHistogramAggregator(name, factories, rounding, shardRounding, order, keyed, minDocCount, extendedBounds, + null, config.format(), searchContext, parent, pipelineAggregators, metaData); } }