Skip to content

Commit d961faa

Browse files
authored
VS refactoring: Wire up median (MAD) aggregation (#52945)
1 parent 0e79fd5 commit d961faa

File tree

5 files changed

+98
-27
lines changed

5 files changed

+98
-27
lines changed

server/src/main/java/org/elasticsearch/search/SearchModule.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -370,8 +370,9 @@ private void registerAggregations(List<SearchPlugin> plugins) {
370370
.addResultReader(InternalTDigestPercentileRanks.NAME, InternalTDigestPercentileRanks::new)
371371
.addResultReader(InternalHDRPercentileRanks.NAME, InternalHDRPercentileRanks::new));
372372
registerAggregation(new AggregationSpec(MedianAbsoluteDeviationAggregationBuilder.NAME,
373-
MedianAbsoluteDeviationAggregationBuilder::new, MedianAbsoluteDeviationAggregationBuilder::parse)
374-
.addResultReader(InternalMedianAbsoluteDeviation::new));
373+
MedianAbsoluteDeviationAggregationBuilder::new, MedianAbsoluteDeviationAggregationBuilder::parse)
374+
.addResultReader(InternalMedianAbsoluteDeviation::new)
375+
.setAggregatorRegistrar(MedianAbsoluteDeviationAggregationBuilder::registerAggregators));
375376
registerAggregation(new AggregationSpec(CardinalityAggregationBuilder.NAME, CardinalityAggregationBuilder::new,
376377
CardinalityAggregationBuilder::parse).addResultReader(InternalCardinality::new)
377378
.setAggregatorRegistrar(CardinalityAggregationBuilder::registerAggregators));

server/src/main/java/org/elasticsearch/search/aggregations/metrics/MedianAbsoluteDeviationAggregationBuilder.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.elasticsearch.search.aggregations.support.ValuesSourceAggregatorFactory;
3636
import org.elasticsearch.search.aggregations.support.ValuesSourceConfig;
3737
import org.elasticsearch.search.aggregations.support.ValuesSourceParserHelper;
38+
import org.elasticsearch.search.aggregations.support.ValuesSourceRegistry;
3839
import org.elasticsearch.search.aggregations.support.ValuesSourceType;
3940

4041
import java.io.IOException;
@@ -59,6 +60,10 @@ public static MedianAbsoluteDeviationAggregationBuilder parse(String aggregation
5960
return PARSER.parse(parser, new MedianAbsoluteDeviationAggregationBuilder(aggregationName), null);
6061
}
6162

63+
public static void registerAggregators(ValuesSourceRegistry valuesSourceRegistry) {
64+
MedianAbsoluteDeviationAggregatorFactory.registerAggregators(valuesSourceRegistry);
65+
}
66+
6267
private double compression = 1000d;
6368

6469
public MedianAbsoluteDeviationAggregationBuilder(String name) {

server/src/main/java/org/elasticsearch/search/aggregations/metrics/MedianAbsoluteDeviationAggregatorFactory.java

Lines changed: 47 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,18 @@
2020
package org.elasticsearch.search.aggregations.metrics;
2121

2222
import org.elasticsearch.index.query.QueryShardContext;
23+
import org.elasticsearch.search.DocValueFormat;
2324
import org.elasticsearch.search.aggregations.AggregationExecutionException;
2425
import org.elasticsearch.search.aggregations.Aggregator;
2526
import org.elasticsearch.search.aggregations.AggregatorFactories;
2627
import org.elasticsearch.search.aggregations.AggregatorFactory;
2728
import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator;
29+
import org.elasticsearch.search.aggregations.support.AggregatorSupplier;
30+
import org.elasticsearch.search.aggregations.support.CoreValuesSourceType;
2831
import org.elasticsearch.search.aggregations.support.ValuesSource;
2932
import org.elasticsearch.search.aggregations.support.ValuesSourceAggregatorFactory;
3033
import org.elasticsearch.search.aggregations.support.ValuesSourceConfig;
34+
import org.elasticsearch.search.aggregations.support.ValuesSourceRegistry;
3135
import org.elasticsearch.search.internal.SearchContext;
3236

3337
import java.io.IOException;
@@ -39,22 +43,49 @@ public class MedianAbsoluteDeviationAggregatorFactory extends ValuesSourceAggreg
3943
private final double compression;
4044

4145
MedianAbsoluteDeviationAggregatorFactory(String name,
42-
ValuesSourceConfig config,
43-
QueryShardContext queryShardContext,
44-
AggregatorFactory parent,
45-
AggregatorFactories.Builder subFactoriesBuilder,
46-
Map<String, Object> metaData,
47-
double compression) throws IOException {
46+
ValuesSourceConfig config,
47+
QueryShardContext queryShardContext,
48+
AggregatorFactory parent,
49+
AggregatorFactories.Builder subFactoriesBuilder,
50+
Map<String, Object> metaData,
51+
double compression) throws IOException {
4852

4953
super(name, config, queryShardContext, parent, subFactoriesBuilder, metaData);
5054
this.compression = compression;
5155
}
5256

57+
static void registerAggregators(ValuesSourceRegistry valuesSourceRegistry) {
58+
valuesSourceRegistry.register(MedianAbsoluteDeviationAggregationBuilder.NAME,
59+
CoreValuesSourceType.NUMERIC,
60+
new MedianAbsoluteDeviationAggregatorSupplier() {
61+
@Override
62+
public Aggregator build(String name,
63+
ValuesSource valuesSource,
64+
DocValueFormat format,
65+
SearchContext context,
66+
Aggregator parent,
67+
List<PipelineAggregator> pipelineAggregators,
68+
Map<String, Object> metaData,
69+
double compression) throws IOException {
70+
return new MedianAbsoluteDeviationAggregator(
71+
name,
72+
context,
73+
parent,
74+
pipelineAggregators,
75+
metaData,
76+
(ValuesSource.Numeric) valuesSource,
77+
format,
78+
compression
79+
);
80+
}
81+
});
82+
}
83+
5384
@Override
5485
protected Aggregator createUnmapped(SearchContext searchContext,
55-
Aggregator parent,
56-
List<PipelineAggregator> pipelineAggregators,
57-
Map<String, Object> metaData) throws IOException {
86+
Aggregator parent,
87+
List<PipelineAggregator> pipelineAggregators,
88+
Map<String, Object> metaData) throws IOException {
5889

5990
return new MedianAbsoluteDeviationAggregator(
6091
name,
@@ -75,20 +106,14 @@ protected Aggregator doCreateInternal(ValuesSource valuesSource,
75106
boolean collectsFromSingleBucket,
76107
List<PipelineAggregator> pipelineAggregators,
77108
Map<String, Object> metaData) throws IOException {
109+
AggregatorSupplier aggregatorSupplier = queryShardContext.getValuesSourceRegistry().getAggregator(config.valueSourceType(),
110+
MedianAbsoluteDeviationAggregationBuilder.NAME);
78111

79-
if (valuesSource instanceof ValuesSource.Numeric == false) {
80-
throw new AggregationExecutionException("ValuesSource type " + valuesSource.toString() + "is not supported for aggregation " +
81-
this.name());
112+
if (aggregatorSupplier instanceof MedianAbsoluteDeviationAggregatorSupplier == false) {
113+
throw new AggregationExecutionException("Registry miss-match - expected MedianAbsoluteDeviationAggregatorSupplier, found [" +
114+
aggregatorSupplier.getClass().toString() + "]");
82115
}
83-
return new MedianAbsoluteDeviationAggregator(
84-
name,
85-
searchContext,
86-
parent,
87-
pipelineAggregators,
88-
metaData,
89-
(ValuesSource.Numeric) valuesSource,
90-
config.format(),
91-
compression
92-
);
116+
return ((MedianAbsoluteDeviationAggregatorSupplier) aggregatorSupplier).build(name, valuesSource, config.format(),
117+
searchContext, parent, pipelineAggregators, metaData, compression);
93118
}
94119
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
* Licensed to Elasticsearch under one or more contributor
3+
* license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright
5+
* ownership. Elasticsearch licenses this file to you under
6+
* the Apache License, Version 2.0 (the "License"); you may
7+
* not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
package org.elasticsearch.search.aggregations.metrics;
20+
21+
import org.elasticsearch.search.DocValueFormat;
22+
import org.elasticsearch.search.aggregations.Aggregator;
23+
import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator;
24+
import org.elasticsearch.search.aggregations.support.AggregatorSupplier;
25+
import org.elasticsearch.search.aggregations.support.ValuesSource;
26+
import org.elasticsearch.search.internal.SearchContext;
27+
28+
import java.io.IOException;
29+
import java.util.List;
30+
import java.util.Map;
31+
32+
public interface MedianAbsoluteDeviationAggregatorSupplier extends AggregatorSupplier {
33+
Aggregator build(String name,
34+
ValuesSource valuesSource,
35+
DocValueFormat format,
36+
SearchContext context,
37+
Aggregator parent,
38+
List<PipelineAggregator> pipelineAggregators,
39+
Map<String, Object> metaData,
40+
double compression) throws IOException;
41+
}

server/src/main/java/org/elasticsearch/search/aggregations/metrics/MetricAggregatorSupplier.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,10 @@
3030
import java.util.Map;
3131

3232
public interface MetricAggregatorSupplier extends AggregatorSupplier {
33-
3433
Aggregator build(String name,
3534
ValuesSource valuesSource,
36-
DocValueFormat formatter,
37-
SearchContext searchContext,
35+
DocValueFormat format,
36+
SearchContext context,
3837
Aggregator parent,
3938
List<PipelineAggregator> pipelineAggregators,
4039
Map<String, Object> metaData) throws IOException;

0 commit comments

Comments
 (0)