Skip to content

Commit a8a35dc

Browse files
authored
Wire Cardinality aggregation to work with the ValuesSourceRegistry (#51337)
1 parent 02c82d8 commit a8a35dc

File tree

4 files changed

+82
-3
lines changed

4 files changed

+82
-3
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,8 @@ private void registerAggregations(List<SearchPlugin> plugins) {
358358
MedianAbsoluteDeviationAggregationBuilder::new, MedianAbsoluteDeviationAggregationBuilder::parse)
359359
.addResultReader(InternalMedianAbsoluteDeviation::new));
360360
registerAggregation(new AggregationSpec(CardinalityAggregationBuilder.NAME, CardinalityAggregationBuilder::new,
361-
CardinalityAggregationBuilder::parse).addResultReader(InternalCardinality::new));
361+
CardinalityAggregationBuilder::parse).addResultReader(InternalCardinality::new)
362+
.setAggregatorRegistrar(CardinalityAggregationBuilder::registerAggregators));
362363
registerAggregation(new AggregationSpec(GlobalAggregationBuilder.NAME, GlobalAggregationBuilder::new,
363364
GlobalAggregationBuilder::parse).addResultReader(InternalGlobal::new));
364365
registerAggregation(new AggregationSpec(MissingAggregationBuilder.NAME, MissingAggregationBuilder::new,

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,13 @@
3535
import org.elasticsearch.search.aggregations.support.ValuesSourceAggregationBuilder;
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;
4142
import java.util.Map;
4243
import java.util.Objects;
44+
import java.util.concurrent.atomic.AtomicBoolean;
4345

4446
public final class CardinalityAggregationBuilder
4547
extends ValuesSourceAggregationBuilder.LeafOnly<ValuesSource, CardinalityAggregationBuilder> {
@@ -61,6 +63,13 @@ public static AggregationBuilder parse(String aggregationName, XContentParser pa
6163
return PARSER.parse(parser, new CardinalityAggregationBuilder(aggregationName), null);
6264
}
6365

66+
private static AtomicBoolean wasRegistered = new AtomicBoolean(false);
67+
public static void registerAggregators(ValuesSourceRegistry valuesSourceRegistry) {
68+
if (wasRegistered.compareAndSet(false, true) == true) {
69+
CardinalityAggregatorFactory.registerAggregators(valuesSourceRegistry);
70+
}
71+
}
72+
6473
private Long precisionThreshold = null;
6574

6675
public CardinalityAggregationBuilder(String name) {

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

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,16 @@
2020
package org.elasticsearch.search.aggregations.metrics;
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;
2729
import org.elasticsearch.search.aggregations.support.ValuesSource;
2830
import org.elasticsearch.search.aggregations.support.ValuesSourceAggregatorFactory;
2931
import org.elasticsearch.search.aggregations.support.ValuesSourceConfig;
32+
import org.elasticsearch.search.aggregations.support.ValuesSourceRegistry;
3033
import org.elasticsearch.search.internal.SearchContext;
3134

3235
import java.io.IOException;
@@ -47,6 +50,25 @@ class CardinalityAggregatorFactory extends ValuesSourceAggregatorFactory {
4750
this.precisionThreshold = precisionThreshold;
4851
}
4952

53+
static void registerAggregators(ValuesSourceRegistry valuesSourceRegistry) {
54+
valuesSourceRegistry.register(CardinalityAggregationBuilder.NAME, (ignored) -> true, cardinalityAggregatorSupplier());
55+
}
56+
57+
private static CardinalityAggregatorSupplier cardinalityAggregatorSupplier(){
58+
return new CardinalityAggregatorSupplier() {
59+
@Override
60+
public Aggregator build(String name,
61+
ValuesSource valuesSource,
62+
int precision,
63+
SearchContext context,
64+
Aggregator parent,
65+
List<PipelineAggregator> pipelineAggregators,
66+
Map<String, Object> metaData) throws IOException {
67+
return new CardinalityAggregator(name, valuesSource, precision, context, parent, pipelineAggregators, metaData);
68+
}
69+
};
70+
}
71+
5072
@Override
5173
protected Aggregator createUnmapped(SearchContext searchContext,
5274
Aggregator parent,
@@ -62,8 +84,14 @@ protected Aggregator doCreateInternal(ValuesSource valuesSource,
6284
boolean collectsFromSingleBucket,
6385
List<PipelineAggregator> pipelineAggregators,
6486
Map<String, Object> metaData) throws IOException {
65-
return new CardinalityAggregator(name, valuesSource, precision(), searchContext, parent, pipelineAggregators,
66-
metaData);
87+
AggregatorSupplier aggregatorSupplier = ValuesSourceRegistry.getInstance().getAggregator(config.valueSourceType(),
88+
CardinalityAggregationBuilder.NAME);
89+
if (aggregatorSupplier instanceof CardinalityAggregatorSupplier == false) {
90+
throw new AggregationExecutionException("Registry miss-match - expected CardinalityAggregatorSupplier, found [" +
91+
aggregatorSupplier.getClass().toString() + "]");
92+
}
93+
CardinalityAggregatorSupplier cardinalityAggregatorSupplier = (CardinalityAggregatorSupplier) aggregatorSupplier;
94+
return cardinalityAggregatorSupplier.build(name, valuesSource, precision(), searchContext, parent, pipelineAggregators, metaData);
6795
}
6896

6997
private int precision() {
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+
20+
package org.elasticsearch.search.aggregations.metrics;
21+
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 CardinalityAggregatorSupplier extends AggregatorSupplier {
33+
Aggregator build(String name,
34+
ValuesSource valuesSource,
35+
int precision,
36+
SearchContext context,
37+
Aggregator parent,
38+
List<PipelineAggregator> pipelineAggregators,
39+
Map<String, Object> metaData) throws IOException;
40+
41+
}

0 commit comments

Comments
 (0)