19
19
20
20
package org .elasticsearch .search .aggregations .bucket .histogram ;
21
21
22
+ import org .elasticsearch .index .fielddata .IndexNumericFieldData ;
23
+ import org .elasticsearch .index .mapper .RangeFieldMapper ;
22
24
import org .elasticsearch .index .query .QueryShardContext ;
25
+ import org .elasticsearch .search .DocValueFormat ;
26
+ import org .elasticsearch .search .aggregations .AggregationExecutionException ;
23
27
import org .elasticsearch .search .aggregations .Aggregator ;
24
28
import org .elasticsearch .search .aggregations .AggregatorFactories ;
25
29
import org .elasticsearch .search .aggregations .AggregatorFactory ;
26
30
import org .elasticsearch .search .aggregations .BucketOrder ;
27
31
import 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 ;
28
35
import org .elasticsearch .search .aggregations .support .ValuesSource ;
29
36
import org .elasticsearch .search .aggregations .support .ValuesSourceAggregatorFactory ;
30
37
import org .elasticsearch .search .aggregations .support .ValuesSourceConfig ;
38
+ import org .elasticsearch .search .aggregations .support .ValuesSourceRegistry ;
31
39
import org .elasticsearch .search .internal .SearchContext ;
32
40
33
41
import java .io .IOException ;
@@ -46,6 +54,45 @@ public final class HistogramAggregatorFactory extends ValuesSourceAggregatorFact
46
54
private final long minDocCount ;
47
55
private final double minBound , maxBound ;
48
56
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
+
49
96
@ Override
50
97
protected ValuesSource resolveMissingAny (Object missing ) {
51
98
if (missing instanceof Number ) {
@@ -92,23 +139,16 @@ protected Aggregator doCreateInternal(ValuesSource valuesSource,
92
139
if (collectsFromSingleBucket == false ) {
93
140
return asMultiBucketAggregator (this , searchContext , parent );
94
141
}
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 () + "]" );
111
148
}
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 );
112
152
}
113
153
114
154
@ Override
0 commit comments