1919
2020package org .elasticsearch .search .aggregations .bucket .histogram ;
2121
22+ import org .elasticsearch .index .fielddata .IndexNumericFieldData ;
23+ import org .elasticsearch .index .mapper .RangeFieldMapper ;
2224import org .elasticsearch .index .query .QueryShardContext ;
25+ import org .elasticsearch .search .DocValueFormat ;
26+ import org .elasticsearch .search .aggregations .AggregationExecutionException ;
2327import org .elasticsearch .search .aggregations .Aggregator ;
2428import org .elasticsearch .search .aggregations .AggregatorFactories ;
2529import org .elasticsearch .search .aggregations .AggregatorFactory ;
2630import org .elasticsearch .search .aggregations .BucketOrder ;
2731import org .elasticsearch .search .aggregations .pipeline .PipelineAggregator ;
32+ import org .elasticsearch .search .aggregations .support .AggregatorSupplier ;
33+ import org .elasticsearch .search .aggregations .support .CoreValuesSourceType ;
34+ import org .elasticsearch .search .aggregations .support .HistogramAggregatorSupplier ;
2835import org .elasticsearch .search .aggregations .support .ValuesSource ;
2936import org .elasticsearch .search .aggregations .support .ValuesSourceAggregatorFactory ;
3037import org .elasticsearch .search .aggregations .support .ValuesSourceConfig ;
38+ import org .elasticsearch .search .aggregations .support .ValuesSourceRegistry ;
3139import org .elasticsearch .search .internal .SearchContext ;
3240
3341import java .io .IOException ;
@@ -46,6 +54,45 @@ public final class HistogramAggregatorFactory extends ValuesSourceAggregatorFact
4654 private final long minDocCount ;
4755 private final double minBound , maxBound ;
4856
57+ // TODO: Registration should happen on the actual aggregator classes, but I don't want to set up the whole dynamic loading thing yet
58+ static {
59+ ValuesSourceRegistry .getInstance ().register (HistogramAggregationBuilder .NAME , CoreValuesSourceType .RANGE ,
60+ new HistogramAggregatorSupplier () {
61+ @ Override
62+ public Aggregator build (String name , AggregatorFactories factories , double interval , double offset ,
63+ BucketOrder order , boolean keyed , long minDocCount , double minBound , double maxBound ,
64+ ValuesSource valuesSource , DocValueFormat formatter , SearchContext context ,
65+ Aggregator parent , List <PipelineAggregator > pipelineAggregators ,
66+ Map <String , Object > metaData ) throws IOException {
67+ ValuesSource .Range rangeValueSource = (ValuesSource .Range ) valuesSource ;
68+ if (rangeValueSource .rangeType ().isNumeric () == false ) {
69+ throw new IllegalArgumentException ("Expected numeric range type but found non-numeric range ["
70+ + rangeValueSource .rangeType ().name + "]" );
71+ }
72+ return new RangeHistogramAggregator (name , factories , interval , offset , order , keyed , minDocCount , minBound ,
73+ maxBound , rangeValueSource , formatter , context , parent , pipelineAggregators , metaData );
74+ }
75+ },
76+ (fieldType , indexFieldData ) -> fieldType instanceof RangeFieldMapper .RangeFieldType
77+ );
78+
79+ ValuesSourceRegistry .getInstance ().register (HistogramAggregationBuilder .NAME , CoreValuesSourceType .NUMERIC ,
80+ new HistogramAggregatorSupplier () {
81+ @ Override
82+ public Aggregator build (String name , AggregatorFactories factories , double interval , double offset ,
83+ BucketOrder order , boolean keyed , long minDocCount , double minBound , double maxBound ,
84+ ValuesSource valuesSource , DocValueFormat formatter , SearchContext context ,
85+ Aggregator parent , List <PipelineAggregator > pipelineAggregators ,
86+ Map <String , Object > metaData ) throws IOException {
87+ return new NumericHistogramAggregator (name , factories , interval , offset , order , keyed , minDocCount , minBound ,
88+ maxBound , (ValuesSource .Numeric ) valuesSource , formatter , context , parent , pipelineAggregators , metaData );
89+ }
90+ },
91+ (fieldType , indexFieldData ) -> indexFieldData instanceof IndexNumericFieldData
92+ );
93+ }
94+
95+
4996 @ Override
5097 protected ValuesSource resolveMissingAny (Object missing ) {
5198 if (missing instanceof Number ) {
@@ -92,23 +139,16 @@ protected Aggregator doCreateInternal(ValuesSource valuesSource,
92139 if (collectsFromSingleBucket == false ) {
93140 return asMultiBucketAggregator (this , searchContext , parent );
94141 }
95- if (valuesSource instanceof ValuesSource .Numeric ) {
96- return new NumericHistogramAggregator (name , factories , interval , offset , order , keyed , minDocCount , minBound , maxBound ,
97- (ValuesSource .Numeric ) valuesSource , config .format (), searchContext , parent , pipelineAggregators , metaData );
98- } else if (valuesSource instanceof ValuesSource .Range ) {
99- ValuesSource .Range rangeValueSource = (ValuesSource .Range ) valuesSource ;
100- if (rangeValueSource .rangeType ().isNumeric () == false ) {
101- throw new IllegalArgumentException ("Expected numeric range type but found non-numeric range ["
102- + rangeValueSource .rangeType ().name + "]" );
103- }
104- return new RangeHistogramAggregator (name , factories , interval , offset , order , keyed , minDocCount , minBound , maxBound ,
105- (ValuesSource .Range ) valuesSource , config .format (), searchContext , parent , pipelineAggregators ,
106- metaData );
107- }
108- else {
109- throw new IllegalArgumentException ("Expected one of [Numeric, Range] values source, found ["
110- + valuesSource .toString () + "]" );
142+
143+ AggregatorSupplier aggregatorSupplier = ValuesSourceRegistry .getInstance ().getAggregator (config .valueSourceType (),
144+ HistogramAggregationBuilder .NAME );
145+ if (aggregatorSupplier instanceof HistogramAggregatorSupplier == false ) {
146+ throw new AggregationExecutionException ("Registry miss-match - expected HistogramAggregatorSupplier, found [" +
147+ aggregatorSupplier .getClass ().toString () + "]" );
111148 }
149+ HistogramAggregatorSupplier histogramAggregatorSupplier = (HistogramAggregatorSupplier ) aggregatorSupplier ;
150+ return histogramAggregatorSupplier .build (name , factories , interval , offset , order , keyed , minDocCount , minBound , maxBound ,
151+ valuesSource , config .format (), searchContext , parent , pipelineAggregators , metaData );
112152 }
113153
114154 @ Override
0 commit comments