Skip to content

Commit 6c030dc

Browse files
not-napoleonandyb-elasticcsoulios
authored
Additional ValuesSource Work (#54301)
* ValuesSource refactor wire up missing agg (#53511) Part of refactoring ValuesSource in #42949 * ValuesSource refactoring: Wire up ExtendedStats aggregation (#53227) * Javadoc for ValuesSource related work (#53427) Co-authored-by: Andy Bristol <[email protected]> Co-authored-by: Christos Soulios <[email protected]>
1 parent 436aff9 commit 6c030dc

17 files changed

+325
-56
lines changed

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

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -347,41 +347,45 @@ private void registerAggregations(List<SearchPlugin> plugins) {
347347
.addResultReader(InternalSum::new)
348348
.setAggregatorRegistrar(SumAggregationBuilder::registerAggregators));
349349
registerAggregation(new AggregationSpec(MinAggregationBuilder.NAME, MinAggregationBuilder::new, MinAggregationBuilder.PARSER)
350-
.addResultReader(InternalMin::new)
351-
.setAggregatorRegistrar(MinAggregationBuilder::registerAggregators));
350+
.addResultReader(InternalMin::new)
351+
.setAggregatorRegistrar(MinAggregationBuilder::registerAggregators));
352352
registerAggregation(new AggregationSpec(MaxAggregationBuilder.NAME, MaxAggregationBuilder::new, MaxAggregationBuilder.PARSER)
353-
.addResultReader(InternalMax::new)
354-
.setAggregatorRegistrar(MaxAggregationBuilder::registerAggregators));
353+
.addResultReader(InternalMax::new)
354+
.setAggregatorRegistrar(MaxAggregationBuilder::registerAggregators));
355355
registerAggregation(new AggregationSpec(StatsAggregationBuilder.NAME, StatsAggregationBuilder::new, StatsAggregationBuilder.PARSER)
356356
.addResultReader(InternalStats::new)
357357
.setAggregatorRegistrar(StatsAggregationBuilder::registerAggregators));
358358
registerAggregation(new AggregationSpec(ExtendedStatsAggregationBuilder.NAME, ExtendedStatsAggregationBuilder::new,
359-
ExtendedStatsAggregationBuilder.PARSER).addResultReader(InternalExtendedStats::new));
359+
ExtendedStatsAggregationBuilder.PARSER)
360+
.addResultReader(InternalExtendedStats::new)
361+
.setAggregatorRegistrar(ExtendedStatsAggregationBuilder::registerAggregators));
360362
registerAggregation(new AggregationSpec(ValueCountAggregationBuilder.NAME, ValueCountAggregationBuilder::new,
361-
ValueCountAggregationBuilder.PARSER)
362-
.addResultReader(InternalValueCount::new)
363-
.setAggregatorRegistrar(ValueCountAggregationBuilder::registerAggregators));
363+
ValueCountAggregationBuilder.PARSER)
364+
.addResultReader(InternalValueCount::new)
365+
.setAggregatorRegistrar(ValueCountAggregationBuilder::registerAggregators));
364366
registerAggregation(new AggregationSpec(PercentilesAggregationBuilder.NAME, PercentilesAggregationBuilder::new,
365-
PercentilesAggregationBuilder.PARSER)
366-
.addResultReader(InternalTDigestPercentiles.NAME, InternalTDigestPercentiles::new)
367-
.addResultReader(InternalHDRPercentiles.NAME, InternalHDRPercentiles::new)
368-
.setAggregatorRegistrar(PercentilesAggregationBuilder::registerAggregators));
367+
PercentilesAggregationBuilder.PARSER)
368+
.addResultReader(InternalTDigestPercentiles.NAME, InternalTDigestPercentiles::new)
369+
.addResultReader(InternalHDRPercentiles.NAME, InternalHDRPercentiles::new)
370+
.setAggregatorRegistrar(PercentilesAggregationBuilder::registerAggregators));
369371
registerAggregation(new AggregationSpec(PercentileRanksAggregationBuilder.NAME, PercentileRanksAggregationBuilder::new,
370-
PercentileRanksAggregationBuilder.PARSER)
371-
.addResultReader(InternalTDigestPercentileRanks.NAME, InternalTDigestPercentileRanks::new)
372-
.addResultReader(InternalHDRPercentileRanks.NAME, InternalHDRPercentileRanks::new)
373-
.setAggregatorRegistrar(PercentileRanksAggregationBuilder::registerAggregators));
372+
PercentileRanksAggregationBuilder.PARSER)
373+
.addResultReader(InternalTDigestPercentileRanks.NAME, InternalTDigestPercentileRanks::new)
374+
.addResultReader(InternalHDRPercentileRanks.NAME, InternalHDRPercentileRanks::new)
375+
.setAggregatorRegistrar(PercentileRanksAggregationBuilder::registerAggregators));
374376
registerAggregation(new AggregationSpec(MedianAbsoluteDeviationAggregationBuilder.NAME,
375377
MedianAbsoluteDeviationAggregationBuilder::new, MedianAbsoluteDeviationAggregationBuilder.PARSER)
376378
.addResultReader(InternalMedianAbsoluteDeviation::new)
377379
.setAggregatorRegistrar(MedianAbsoluteDeviationAggregationBuilder::registerAggregators));
378380
registerAggregation(new AggregationSpec(CardinalityAggregationBuilder.NAME, CardinalityAggregationBuilder::new,
379-
CardinalityAggregationBuilder.PARSER).addResultReader(InternalCardinality::new)
380-
.setAggregatorRegistrar(CardinalityAggregationBuilder::registerAggregators));
381+
CardinalityAggregationBuilder.PARSER).addResultReader(InternalCardinality::new)
382+
.setAggregatorRegistrar(CardinalityAggregationBuilder::registerAggregators));
381383
registerAggregation(new AggregationSpec(GlobalAggregationBuilder.NAME, GlobalAggregationBuilder::new,
382384
GlobalAggregationBuilder::parse).addResultReader(InternalGlobal::new));
383385
registerAggregation(new AggregationSpec(MissingAggregationBuilder.NAME, MissingAggregationBuilder::new,
384-
MissingAggregationBuilder.PARSER).addResultReader(InternalMissing::new));
386+
MissingAggregationBuilder.PARSER)
387+
.addResultReader(InternalMissing::new)
388+
.setAggregatorRegistrar(MissingAggregationBuilder::registerAggregators));
385389
registerAggregation(new AggregationSpec(FilterAggregationBuilder.NAME, FilterAggregationBuilder::new,
386390
FilterAggregationBuilder::parse).addResultReader(InternalFilter::new));
387391
registerAggregation(new AggregationSpec(FiltersAggregationBuilder.NAME, FiltersAggregationBuilder::new,

server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/HistogramAggregatorFactory.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator;
3030
import org.elasticsearch.search.aggregations.support.AggregatorSupplier;
3131
import org.elasticsearch.search.aggregations.support.CoreValuesSourceType;
32-
import org.elasticsearch.search.aggregations.support.HistogramAggregatorSupplier;
3332
import org.elasticsearch.search.aggregations.support.ValuesSource;
3433
import org.elasticsearch.search.aggregations.support.ValuesSourceAggregatorFactory;
3534
import org.elasticsearch.search.aggregations.support.ValuesSourceConfig;

server/src/main/java/org/elasticsearch/search/aggregations/support/HistogramAggregatorSupplier.java renamed to server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/HistogramAggregatorSupplier.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,16 @@
1616
* specific language governing permissions and limitations
1717
* under the License.
1818
*/
19-
package org.elasticsearch.search.aggregations.support;
19+
package org.elasticsearch.search.aggregations.bucket.histogram;
2020

2121
import org.elasticsearch.common.Nullable;
2222
import org.elasticsearch.search.DocValueFormat;
2323
import org.elasticsearch.search.aggregations.Aggregator;
2424
import org.elasticsearch.search.aggregations.AggregatorFactories;
2525
import org.elasticsearch.search.aggregations.BucketOrder;
2626
import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator;
27+
import org.elasticsearch.search.aggregations.support.AggregatorSupplier;
28+
import org.elasticsearch.search.aggregations.support.ValuesSource;
2729
import org.elasticsearch.search.internal.SearchContext;
2830

2931
import java.io.IOException;

server/src/main/java/org/elasticsearch/search/aggregations/bucket/missing/MissingAggregationBuilder.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.elasticsearch.search.aggregations.support.ValuesSourceAggregationBuilder;
3333
import org.elasticsearch.search.aggregations.support.ValuesSourceAggregatorFactory;
3434
import org.elasticsearch.search.aggregations.support.ValuesSourceConfig;
35+
import org.elasticsearch.search.aggregations.support.ValuesSourceRegistry;
3536
import org.elasticsearch.search.aggregations.support.ValuesSourceType;
3637

3738
import java.io.IOException;
@@ -46,6 +47,10 @@ public class MissingAggregationBuilder extends ValuesSourceAggregationBuilder<Mi
4647
ValuesSourceAggregationBuilder.declareFields(PARSER, true, true, false);
4748
}
4849

50+
public static void registerAggregators(ValuesSourceRegistry valuesSourceRegistry) {
51+
MissingAggregatorFactory.registerAggregators(valuesSourceRegistry);
52+
}
53+
4954
public MissingAggregationBuilder(String name) {
5055
super(name);
5156
}

server/src/main/java/org/elasticsearch/search/aggregations/bucket/missing/MissingAggregatorFactory.java

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,17 @@
2020
package org.elasticsearch.search.aggregations.bucket.missing;
2121

2222
import org.elasticsearch.index.query.QueryShardContext;
23+
import org.elasticsearch.search.aggregations.AggregationExecutionException;
2324
import org.elasticsearch.search.aggregations.Aggregator;
2425
import org.elasticsearch.search.aggregations.AggregatorFactories;
2526
import org.elasticsearch.search.aggregations.AggregatorFactory;
2627
import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator;
28+
import org.elasticsearch.search.aggregations.support.AggregatorSupplier;
29+
import org.elasticsearch.search.aggregations.support.CoreValuesSourceType;
2730
import org.elasticsearch.search.aggregations.support.ValuesSource;
2831
import org.elasticsearch.search.aggregations.support.ValuesSourceAggregatorFactory;
2932
import org.elasticsearch.search.aggregations.support.ValuesSourceConfig;
33+
import org.elasticsearch.search.aggregations.support.ValuesSourceRegistry;
3034
import org.elasticsearch.search.internal.SearchContext;
3135

3236
import java.io.IOException;
@@ -35,6 +39,22 @@
3539

3640
public class MissingAggregatorFactory extends ValuesSourceAggregatorFactory {
3741

42+
public static void registerAggregators(ValuesSourceRegistry valuesSourceRegistry) {
43+
valuesSourceRegistry.register(
44+
MissingAggregationBuilder.NAME,
45+
List.of(
46+
CoreValuesSourceType.NUMERIC,
47+
CoreValuesSourceType.BYTES,
48+
CoreValuesSourceType.GEOPOINT,
49+
CoreValuesSourceType.RANGE,
50+
CoreValuesSourceType.IP,
51+
CoreValuesSourceType.BOOLEAN,
52+
CoreValuesSourceType.DATE
53+
),
54+
(MissingAggregatorSupplier) MissingAggregator::new
55+
);
56+
}
57+
3858
public MissingAggregatorFactory(String name, ValuesSourceConfig config, QueryShardContext queryShardContext,
3959
AggregatorFactory parent, AggregatorFactories.Builder subFactoriesBuilder,
4060
Map<String, Object> metaData) throws IOException {
@@ -50,13 +70,22 @@ protected MissingAggregator createUnmapped(SearchContext searchContext,
5070
}
5171

5272
@Override
53-
protected MissingAggregator doCreateInternal(ValuesSource valuesSource,
73+
protected Aggregator doCreateInternal(ValuesSource valuesSource,
5474
SearchContext searchContext,
5575
Aggregator parent,
5676
boolean collectsFromSingleBucket,
5777
List<PipelineAggregator> pipelineAggregators,
5878
Map<String, Object> metaData) throws IOException {
59-
return new MissingAggregator(name, factories, valuesSource, searchContext, parent, pipelineAggregators, metaData);
79+
80+
final AggregatorSupplier aggregatorSupplier = queryShardContext.getValuesSourceRegistry()
81+
.getAggregator(config.valueSourceType(), MissingAggregationBuilder.NAME);
82+
if (aggregatorSupplier instanceof MissingAggregatorSupplier == false) {
83+
throw new AggregationExecutionException("Registry miss-match - expected MissingAggregatorSupplier, found [" +
84+
aggregatorSupplier.getClass().toString() + "]");
85+
}
86+
87+
return ((MissingAggregatorSupplier) aggregatorSupplier)
88+
.build(name, factories, valuesSource, searchContext, parent, pipelineAggregators, metaData);
6089
}
6190

6291
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
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+
20+
package org.elasticsearch.search.aggregations.bucket.missing;
21+
22+
import org.elasticsearch.common.Nullable;
23+
import org.elasticsearch.search.aggregations.Aggregator;
24+
import org.elasticsearch.search.aggregations.AggregatorFactories;
25+
import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator;
26+
import org.elasticsearch.search.aggregations.support.AggregatorSupplier;
27+
import org.elasticsearch.search.aggregations.support.ValuesSource;
28+
import org.elasticsearch.search.internal.SearchContext;
29+
30+
import java.io.IOException;
31+
import java.util.List;
32+
import java.util.Map;
33+
34+
@FunctionalInterface
35+
public interface MissingAggregatorSupplier extends AggregatorSupplier {
36+
37+
Aggregator build(String name,
38+
AggregatorFactories factories,
39+
@Nullable ValuesSource valuesSource,
40+
SearchContext aggregationContext,
41+
Aggregator parent,
42+
List<PipelineAggregator> pipelineAggregators,
43+
Map<String, Object> metaData) throws IOException;
44+
}

server/src/main/java/org/elasticsearch/search/aggregations/bucket/terms/TermsAggregatorFactory.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@ public class TermsAggregatorFactory extends ValuesSourceAggregatorFactory {
6262
private final TermsAggregator.BucketCountThresholds bucketCountThresholds;
6363
private final boolean showTermDocCountError;
6464

65-
// TODO: Registration should happen on the actual aggregator classes
6665
static void registerAggregators(ValuesSourceRegistry valuesSourceRegistry) {
6766
valuesSourceRegistry.register(TermsAggregationBuilder.NAME,
6867
List.of(CoreValuesSourceType.BYTES, CoreValuesSourceType.IP),

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.elasticsearch.search.aggregations.support.ValuesSource;
3232
import org.elasticsearch.search.aggregations.support.ValuesSourceAggregationBuilder;
3333
import org.elasticsearch.search.aggregations.support.ValuesSourceConfig;
34+
import org.elasticsearch.search.aggregations.support.ValuesSourceRegistry;
3435
import org.elasticsearch.search.aggregations.support.ValuesSourceType;
3536

3637
import java.io.IOException;
@@ -48,6 +49,9 @@ public class ExtendedStatsAggregationBuilder
4849
PARSER.declareDouble(ExtendedStatsAggregationBuilder::sigma, ExtendedStatsAggregator.SIGMA_FIELD);
4950
}
5051

52+
public static void registerAggregators(ValuesSourceRegistry valuesSourceRegistry) {
53+
ExtendedStatsAggregatorFactory.registerAggregators(valuesSourceRegistry);
54+
}
5155
private double sigma = 2.0;
5256

5357
public ExtendedStatsAggregationBuilder(String name) {

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

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,13 @@
2525
import org.elasticsearch.search.aggregations.AggregatorFactories;
2626
import org.elasticsearch.search.aggregations.AggregatorFactory;
2727
import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator;
28+
import org.elasticsearch.search.aggregations.support.AggregatorSupplier;
29+
import org.elasticsearch.search.aggregations.support.CoreValuesSourceType;
2830
import org.elasticsearch.search.aggregations.support.ValuesSource;
2931
import org.elasticsearch.search.aggregations.support.ValuesSource.Numeric;
3032
import org.elasticsearch.search.aggregations.support.ValuesSourceAggregatorFactory;
3133
import org.elasticsearch.search.aggregations.support.ValuesSourceConfig;
34+
import org.elasticsearch.search.aggregations.support.ValuesSourceRegistry;
3235
import org.elasticsearch.search.internal.SearchContext;
3336

3437
import java.io.IOException;
@@ -50,6 +53,12 @@ class ExtendedStatsAggregatorFactory extends ValuesSourceAggregatorFactory {
5053
this.sigma = sigma;
5154
}
5255

56+
static void registerAggregators(ValuesSourceRegistry valuesSourceRegistry) {
57+
valuesSourceRegistry.register(ExtendedStatsAggregationBuilder.NAME,
58+
List.of(CoreValuesSourceType.NUMERIC, CoreValuesSourceType.DATE, CoreValuesSourceType.BOOLEAN),
59+
(ExtendedStatsAggregatorProvider) ExtendedStatsAggregator::new);
60+
}
61+
5362
@Override
5463
protected Aggregator createUnmapped(SearchContext searchContext,
5564
Aggregator parent,
@@ -61,16 +70,19 @@ protected Aggregator createUnmapped(SearchContext searchContext,
6170

6271
@Override
6372
protected Aggregator doCreateInternal(ValuesSource valuesSource,
64-
SearchContext searchContext,
65-
Aggregator parent,
66-
boolean collectsFromSingleBucket,
67-
List<PipelineAggregator> pipelineAggregators,
68-
Map<String, Object> metaData) throws IOException {
69-
if (valuesSource instanceof Numeric == false) {
70-
throw new AggregationExecutionException("ValuesSource type " + valuesSource.toString() + "is not supported for aggregation " +
71-
this.name());
73+
SearchContext searchContext,
74+
Aggregator parent,
75+
boolean collectsFromSingleBucket,
76+
List<PipelineAggregator> pipelineAggregators,
77+
Map<String, Object> metaData) throws IOException {
78+
AggregatorSupplier aggregatorSupplier = queryShardContext.getValuesSourceRegistry().getAggregator(config.valueSourceType(),
79+
ExtendedStatsAggregationBuilder.NAME);
80+
81+
if (aggregatorSupplier instanceof ExtendedStatsAggregatorProvider == false) {
82+
throw new AggregationExecutionException("Registry miss-match - expected ExtendedStatsAggregatorProvider, found [" +
83+
aggregatorSupplier.getClass().toString() + "]");
7284
}
73-
return new ExtendedStatsAggregator(name, (Numeric) valuesSource, config.format(), searchContext,
85+
return ((ExtendedStatsAggregatorProvider) aggregatorSupplier).build(name, (Numeric) valuesSource, config.format(), searchContext,
7486
parent, sigma, pipelineAggregators, metaData);
7587
}
7688
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
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 ExtendedStatsAggregatorProvider extends AggregatorSupplier {
33+
34+
Aggregator build(String name,
35+
ValuesSource.Numeric valuesSource,
36+
DocValueFormat formatter,
37+
SearchContext context,
38+
Aggregator parent,
39+
double sigma,
40+
List<PipelineAggregator> pipelineAggregators,
41+
Map<String, Object> metaData) throws IOException;
42+
}

0 commit comments

Comments
 (0)