2020package org .elasticsearch .search .aggregations .metrics ;
2121
2222import org .elasticsearch .index .query .QueryShardContext ;
23+ import org .elasticsearch .search .DocValueFormat ;
24+ import org .elasticsearch .search .aggregations .AggregationExecutionException ;
2325import org .elasticsearch .search .aggregations .Aggregator ;
2426import org .elasticsearch .search .aggregations .AggregatorFactories ;
2527import org .elasticsearch .search .aggregations .AggregatorFactory ;
2628import org .elasticsearch .search .aggregations .pipeline .PipelineAggregator ;
29+ import org .elasticsearch .search .aggregations .support .AggregatorSupplier ;
30+ import org .elasticsearch .search .aggregations .support .CoreValuesSourceType ;
2731import org .elasticsearch .search .aggregations .support .ValuesSource ;
2832import org .elasticsearch .search .aggregations .support .ValuesSourceAggregatorFactory ;
2933import org .elasticsearch .search .aggregations .support .ValuesSourceConfig ;
34+ import org .elasticsearch .search .aggregations .support .ValuesSourceRegistry ;
3035import org .elasticsearch .search .internal .SearchContext ;
3136
3237import java .io .IOException ;
@@ -39,6 +44,22 @@ class PercentileRanksAggregatorFactory extends ValuesSourceAggregatorFactory {
3944 private final PercentilesConfig percentilesConfig ;
4045 private final boolean keyed ;
4146
47+ static void registerAggregators (ValuesSourceRegistry valuesSourceRegistry ) {
48+ valuesSourceRegistry .register (PercentileRanksAggregationBuilder .NAME ,
49+ List .of (CoreValuesSourceType .NUMERIC , CoreValuesSourceType .HISTOGRAM , CoreValuesSourceType .DATE , CoreValuesSourceType .BOOLEAN ),
50+ new PercentilesAggregatorSupplier () {
51+ @ Override
52+ public Aggregator build (String name , ValuesSource valuesSource , SearchContext context , Aggregator parent ,
53+ double [] percents , PercentilesConfig percentilesConfig , boolean keyed , DocValueFormat formatter ,
54+ List <PipelineAggregator > pipelineAggregators , Map <String , Object > metaData ) throws IOException {
55+
56+ return percentilesConfig .createPercentileRanksAggregator (name , valuesSource , context , parent , percents , keyed ,
57+ formatter , pipelineAggregators , metaData );
58+ }
59+ }
60+ );
61+ }
62+
4263 PercentileRanksAggregatorFactory (String name ,
4364 ValuesSourceConfig config ,
4465 double [] percents ,
@@ -71,7 +92,15 @@ protected Aggregator doCreateInternal(ValuesSource valuesSource,
7192 boolean collectsFromSingleBucket ,
7293 List <PipelineAggregator > pipelineAggregators ,
7394 Map <String , Object > metaData ) throws IOException {
74- return percentilesConfig .createPercentileRanksAggregator (name , valuesSource , searchContext , parent , percents , keyed ,
95+ AggregatorSupplier aggregatorSupplier = queryShardContext .getValuesSourceRegistry ().getAggregator (config .valueSourceType (),
96+ PercentileRanksAggregationBuilder .NAME );
97+
98+ if (aggregatorSupplier instanceof PercentilesAggregatorSupplier == false ) {
99+ throw new AggregationExecutionException ("Registry miss-match - expected PercentilesAggregatorSupplier, found [" +
100+ aggregatorSupplier .getClass ().toString () + "]" );
101+ }
102+ PercentilesAggregatorSupplier percentilesAggregatorSupplier = (PercentilesAggregatorSupplier ) aggregatorSupplier ;
103+ return percentilesAggregatorSupplier .build (name , valuesSource , searchContext , parent , percents , percentilesConfig , keyed ,
75104 config .format (), pipelineAggregators , metaData );
76105 }
77106}
0 commit comments