Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[7.x] Removed ValuesSourceRegistry.registerAny() #55846

Merged
merged 1 commit into from
Apr 28, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,13 @@ public class MissingAggregator extends BucketsAggregator implements SingleBucket

private final ValuesSource valuesSource;

public MissingAggregator(String name, AggregatorFactories factories, ValuesSource valuesSource,
SearchContext aggregationContext, Aggregator parent, Map<String, Object> metadata) throws IOException {
public MissingAggregator(
String name,
AggregatorFactories factories,
ValuesSource valuesSource,
SearchContext aggregationContext,
Aggregator parent,
Map<String, Object> metadata) throws IOException {
super(name, factories, aggregationContext, parent, metadata);
this.valuesSource = valuesSource;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,25 +31,13 @@
import org.elasticsearch.search.internal.SearchContext;

import java.io.IOException;
import java.util.Arrays;
import java.util.Map;

public class MissingAggregatorFactory extends ValuesSourceAggregatorFactory {

public static void registerAggregators(ValuesSourceRegistry.Builder builder) {
builder.register(
MissingAggregationBuilder.NAME,
Arrays.asList(
CoreValuesSourceType.NUMERIC,
CoreValuesSourceType.BYTES,
CoreValuesSourceType.GEOPOINT,
CoreValuesSourceType.RANGE,
CoreValuesSourceType.IP,
CoreValuesSourceType.BOOLEAN,
CoreValuesSourceType.DATE
),
(MissingAggregatorSupplier) MissingAggregator::new
);
builder.register(MissingAggregationBuilder.NAME, CoreValuesSourceType.ALL_CORE,
(MissingAggregatorSupplier) MissingAggregator::new);
}

public MissingAggregatorFactory(String name, ValuesSourceConfig config, QueryShardContext queryShardContext,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
/**
* An aggregator that computes approximate counts of unique values.
*/
class CardinalityAggregator extends NumericMetricsAggregator.SingleValue {
public class CardinalityAggregator extends NumericMetricsAggregator.SingleValue {

private final int precision;
private final ValuesSource valuesSource;
Expand All @@ -60,12 +60,13 @@ class CardinalityAggregator extends NumericMetricsAggregator.SingleValue {

private Collector collector;

CardinalityAggregator(String name,
ValuesSource valuesSource,
int precision,
SearchContext context,
Aggregator parent,
Map<String, Object> metadata) throws IOException {
public CardinalityAggregator(
String name,
ValuesSource valuesSource,
int precision,
SearchContext context,
Aggregator parent,
Map<String, Object> metadata) throws IOException {
super(name, context, parent, metadata);
this.valuesSource = valuesSource;
this.precision = precision;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import org.elasticsearch.search.aggregations.AggregatorFactories;
import org.elasticsearch.search.aggregations.AggregatorFactory;
import org.elasticsearch.search.aggregations.support.AggregatorSupplier;
import org.elasticsearch.search.aggregations.support.CoreValuesSourceType;
import org.elasticsearch.search.aggregations.support.ValuesSource;
import org.elasticsearch.search.aggregations.support.ValuesSourceAggregatorFactory;
import org.elasticsearch.search.aggregations.support.ValuesSourceConfig;
Expand All @@ -48,22 +49,9 @@ class CardinalityAggregatorFactory extends ValuesSourceAggregatorFactory {
this.precisionThreshold = precisionThreshold;
}

static void registerAggregators(ValuesSourceRegistry.Builder builder) {
builder.registerAny(CardinalityAggregationBuilder.NAME, cardinalityAggregatorSupplier());
}

private static CardinalityAggregatorSupplier cardinalityAggregatorSupplier(){
return new CardinalityAggregatorSupplier() {
@Override
public Aggregator build(String name,
ValuesSource valuesSource,
int precision,
SearchContext context,
Aggregator parent,
Map<String, Object> metadata) throws IOException {
return new CardinalityAggregator(name, valuesSource, precision, context, parent, metadata);
}
};
public static void registerAggregators(ValuesSourceRegistry.Builder builder) {
builder.register(CardinalityAggregationBuilder.NAME, CoreValuesSourceType.ALL_CORE,
(CardinalityAggregatorSupplier) CardinalityAggregator::new);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,15 +41,19 @@
* This aggregator works in a multi-bucket mode, that is, when serves as a sub-aggregator, a single aggregator instance aggregates the
* counts for all buckets owned by the parent aggregator)
*/
class ValueCountAggregator extends NumericMetricsAggregator.SingleValue {
public class ValueCountAggregator extends NumericMetricsAggregator.SingleValue {

final ValuesSource valuesSource;

// a count per bucket
LongArray counts;

ValueCountAggregator(String name, ValuesSource valuesSource,
SearchContext aggregationContext, Aggregator parent, Map<String, Object> metadata) throws IOException {
public ValueCountAggregator(
String name,
ValuesSource valuesSource,
SearchContext aggregationContext,
Aggregator parent,
Map<String, Object> metadata) throws IOException {
super(name, aggregationContext, parent, metadata);
this.valuesSource = valuesSource;
if (valuesSource != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import org.elasticsearch.search.aggregations.AggregatorFactories;
import org.elasticsearch.search.aggregations.AggregatorFactory;
import org.elasticsearch.search.aggregations.support.AggregatorSupplier;
import org.elasticsearch.search.aggregations.support.CoreValuesSourceType;
import org.elasticsearch.search.aggregations.support.ValuesSource;
import org.elasticsearch.search.aggregations.support.ValuesSourceAggregatorFactory;
import org.elasticsearch.search.aggregations.support.ValuesSourceConfig;
Expand All @@ -37,17 +38,8 @@
class ValueCountAggregatorFactory extends ValuesSourceAggregatorFactory {

public static void registerAggregators(ValuesSourceRegistry.Builder builder) {
builder.registerAny(ValueCountAggregationBuilder.NAME,
new ValueCountAggregatorSupplier() {
@Override
public Aggregator build(String name,
ValuesSource valuesSource,
SearchContext aggregationContext,
Aggregator parent,
Map<String, Object> metadata) throws IOException {
return new ValueCountAggregator(name, valuesSource, aggregationContext, parent, metadata);
}
});
builder.register(ValueCountAggregationBuilder.NAME, CoreValuesSourceType.ALL_CORE,
(ValueCountAggregatorSupplier) ValueCountAggregator::new);
}

ValueCountAggregatorFactory(String name, ValuesSourceConfig config, QueryShardContext queryShardContext,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,16 @@

import java.time.ZoneId;
import java.time.ZoneOffset;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import java.util.function.LongSupplier;

/**
* {@link CoreValuesSourceType} holds the {@link ValuesSourceType} implementations for the core aggregations package.
*/
public enum CoreValuesSourceType implements ValuesSourceType {

NUMERIC() {
@Override
public ValuesSource getEmpty() {
Expand Down Expand Up @@ -285,4 +288,6 @@ public String value() {
return name().toLowerCase(Locale.ROOT);
}

/** List containing all members of the enumeration. */
public static List<ValuesSourceType> ALL_CORE = Arrays.asList(CoreValuesSourceType.values());
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Predicate;

/**
* {@link ValuesSourceRegistry} holds the mapping from {@link ValuesSourceType}s to {@link AggregatorSupplier}s. DO NOT directly
Expand All @@ -43,75 +42,38 @@
*/
public class ValuesSourceRegistry {
public static class Builder {
private final Map<String, List<Map.Entry<Predicate<ValuesSourceType>, AggregatorSupplier>>> aggregatorRegistry = new HashMap<>();
/**
* Register a ValuesSource to Aggregator mapping.
*
* @param aggregationName The name of the family of aggregations, typically found via
* {@link ValuesSourceAggregationBuilder#getType()}
* @param appliesTo A predicate which accepts the resolved {@link ValuesSourceType} and decides if the given aggregator can
* be applied to that type.
* @param aggregatorSupplier An Aggregation-specific specialization of AggregatorSupplier which will construct the mapped aggregator
*/
public synchronized void register(String aggregationName, Predicate<ValuesSourceType> appliesTo,
AggregatorSupplier aggregatorSupplier) {
AbstractMap.SimpleEntry newSupplier = new AbstractMap.SimpleEntry<>(appliesTo, aggregatorSupplier);
if (aggregatorRegistry.containsKey(aggregationName)) {
aggregatorRegistry.get(aggregationName).add(newSupplier);
} else {
List<Map.Entry<Predicate<ValuesSourceType>, AggregatorSupplier>> supplierList = new ArrayList<>();
supplierList.add(newSupplier);
aggregatorRegistry.put(aggregationName, supplierList);
}
}
private final Map<String, List<Map.Entry<ValuesSourceType, AggregatorSupplier>>> aggregatorRegistry = new HashMap<>();

/**
* Register a ValuesSource to Aggregator mapping. This version provides a convenience method for mappings that only apply to a
* single {@link ValuesSourceType}, to allow passing in the type and auto-wrapping it in a predicate
*
* @param aggregationName The name of the family of aggregations, typically found via
* {@link ValuesSourceAggregationBuilder#getType()}
* @param valuesSourceType The ValuesSourceType this mapping applies to.
* Register a ValuesSource to Aggregator mapping. This method registers mappings that only apply to a
* single {@link ValuesSourceType}
* @param aggregationName The name of the family of aggregations, typically found via
* {@link ValuesSourceAggregationBuilder#getType()}
* @param valuesSourceType The ValuesSourceType this mapping applies to.
* @param aggregatorSupplier An Aggregation-specific specialization of AggregatorSupplier which will construct the mapped aggregator
* from the aggregation standard set of parameters
*/
public void register(String aggregationName, ValuesSourceType valuesSourceType, AggregatorSupplier aggregatorSupplier) {
register(aggregationName, (candidate) -> valuesSourceType.equals(candidate), aggregatorSupplier);
public synchronized void register(String aggregationName, ValuesSourceType valuesSourceType,
AggregatorSupplier aggregatorSupplier) {
if (aggregatorRegistry.containsKey(aggregationName) == false) {
aggregatorRegistry.put(aggregationName, new ArrayList<>());
}
aggregatorRegistry.get(aggregationName).add(new AbstractMap.SimpleEntry<>(valuesSourceType, aggregatorSupplier));
}

/**
* Register a ValuesSource to Aggregator mapping. This version provides a convenience method for mappings that only apply to a
* known list of {@link ValuesSourceType}, to allow passing in the type and auto-wrapping it in a predicate
*
* @param aggregationName The name of the family of aggregations, typically found via
* {@link ValuesSourceAggregationBuilder#getType()}
* @param valuesSourceTypes The ValuesSourceTypes this mapping applies to.
* Register a ValuesSource to Aggregator mapping. This version provides a convenience method for mappings that apply to a
* known list of {@link ValuesSourceType}
* @param aggregationName The name of the family of aggregations, typically found via
* {@link ValuesSourceAggregationBuilder#getType()}
* @param valuesSourceTypes The ValuesSourceTypes this mapping applies to.
* @param aggregatorSupplier An Aggregation-specific specialization of AggregatorSupplier which will construct the mapped aggregator
* from the aggregation standard set of parameters
*/
public void register(String aggregationName, List<ValuesSourceType> valuesSourceTypes, AggregatorSupplier aggregatorSupplier) {
register(aggregationName, (candidate) -> {
for (ValuesSourceType valuesSourceType : valuesSourceTypes) {
if (valuesSourceType.equals(candidate)) {
return true;
}
}
return false;
}, aggregatorSupplier);
}

/**
* Register an aggregator that applies to any values source type. This is a convenience method for aggregations that do not care at
* all about the types of their inputs. Aggregations using this version of registration should not make any other registrations, as
* the aggregator registered using this function will be applied in all cases.
*
* @param aggregationName The name of the family of aggregations, typically found via
* {@link ValuesSourceAggregationBuilder#getType()}
* @param aggregatorSupplier An Aggregation-specific specialization of AggregatorSupplier which will construct the mapped aggregator
* from the aggregation standard set of parameters.
*/
public void registerAny(String aggregationName, AggregatorSupplier aggregatorSupplier) {
register(aggregationName, (ignored) -> true, aggregatorSupplier);
for (ValuesSourceType valuesSourceType : valuesSourceTypes) {
register(aggregationName, valuesSourceType, aggregatorSupplier);
}
}

public ValuesSourceRegistry build() {
Expand All @@ -120,18 +82,18 @@ public ValuesSourceRegistry build() {
}

/** Maps Aggregation names to (ValuesSourceType, Supplier) pairs, keyed by ValuesSourceType */
private Map<String, List<Map.Entry<Predicate<ValuesSourceType>, AggregatorSupplier>>> aggregatorRegistry;
private Map<String, List<Map.Entry<ValuesSourceType, AggregatorSupplier>>> aggregatorRegistry;

private ValuesSourceRegistry(Map<String, List<Map.Entry<Predicate<ValuesSourceType>, AggregatorSupplier>>> aggregatorRegistry) {
Map<String, List<Map.Entry<Predicate<ValuesSourceType>, AggregatorSupplier>>> tmp = new HashMap<>();
public ValuesSourceRegistry(Map<String, List<Map.Entry<ValuesSourceType, AggregatorSupplier>>> aggregatorRegistry) {
Map<String, List<Map.Entry<ValuesSourceType, AggregatorSupplier>>> tmp = new HashMap<>();
aggregatorRegistry.forEach((key, value) -> tmp.put(key, Collections.unmodifiableList(value)));
this.aggregatorRegistry = Collections.unmodifiableMap(tmp);
}

private AggregatorSupplier findMatchingSuppier(ValuesSourceType valuesSourceType,
List<Map.Entry<Predicate<ValuesSourceType>, AggregatorSupplier>> supportedTypes) {
for (Map.Entry<Predicate<ValuesSourceType>, AggregatorSupplier> candidate : supportedTypes) {
if (candidate.getKey().test(valuesSourceType)) {
List<Map.Entry<ValuesSourceType, AggregatorSupplier>> supportedTypes) {
for (Map.Entry<ValuesSourceType, AggregatorSupplier> candidate : supportedTypes) {
if (candidate.getKey().equals(valuesSourceType)) {
return candidate.getValue();
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,16 @@
import org.elasticsearch.plugins.IngestPlugin;
import org.elasticsearch.plugins.MapperPlugin;
import org.elasticsearch.plugins.SearchPlugin;
import org.elasticsearch.search.aggregations.metrics.CardinalityAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.CardinalityAggregator;
import org.elasticsearch.search.aggregations.metrics.CardinalityAggregatorSupplier;
import org.elasticsearch.search.aggregations.metrics.GeoBoundsAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.GeoBoundsAggregatorSupplier;
import org.elasticsearch.search.aggregations.metrics.GeoCentroidAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.GeoCentroidAggregatorSupplier;
import org.elasticsearch.search.aggregations.metrics.ValueCountAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.ValueCountAggregator;
import org.elasticsearch.search.aggregations.metrics.ValueCountAggregatorSupplier;
import org.elasticsearch.search.aggregations.support.ValuesSourceRegistry;
import org.elasticsearch.xpack.core.XPackPlugin;
import org.elasticsearch.xpack.spatial.index.mapper.GeoShapeWithDocValuesFieldMapper;
Expand Down Expand Up @@ -68,8 +74,12 @@ public List<QuerySpec<?>> getQueries() {

@Override
public List<Consumer<ValuesSourceRegistry.Builder>> getAggregationExtentions() {
return org.elasticsearch.common.collect.List.of(this::registerGeoShapeBoundsAggregator,
this::registerGeoShapeCentroidAggregator);
return org.elasticsearch.common.collect.List.of(
this::registerGeoShapeBoundsAggregator,
this::registerGeoShapeCentroidAggregator,
SpatialPlugin::registerValueCountAggregator,
SpatialPlugin::registerCardinalityAggregator
);
}

@Override
Expand All @@ -88,10 +98,21 @@ public void registerGeoShapeCentroidAggregator(ValuesSourceRegistry.Builder buil
builder.register(GeoCentroidAggregationBuilder.NAME, GeoShapeValuesSourceType.instance(),
(GeoCentroidAggregatorSupplier) (name, aggregationContext, parent, valuesSource, metadata)
-> {
if (getLicenseState().isAllowed(XPackLicenseState.Feature.SPATIAL_GEO_CENTROID)) {
return new GeoShapeCentroidAggregator(name, aggregationContext, parent, (GeoShapeValuesSource) valuesSource, metadata);
}
if (getLicenseState().isAllowed(XPackLicenseState.Feature.SPATIAL_GEO_CENTROID)) {
return new GeoShapeCentroidAggregator(name, aggregationContext, parent, (GeoShapeValuesSource) valuesSource, metadata);
}
throw LicenseUtils.newComplianceException("geo_centroid aggregation on geo_shape fields");
});
}

public static void registerValueCountAggregator(ValuesSourceRegistry.Builder builder) {
builder.register(ValueCountAggregationBuilder.NAME, GeoShapeValuesSourceType.instance(),
(ValueCountAggregatorSupplier) ValueCountAggregator::new
);
}

public static void registerCardinalityAggregator(ValuesSourceRegistry.Builder builder) {
builder.register(CardinalityAggregationBuilder.NAME, GeoShapeValuesSourceType.instance(),
(CardinalityAggregatorSupplier) CardinalityAggregator::new);
}
}