`descendsFromBucketAggregator` was important before we removed `asMultiBucketAggregator` but now that it is gone `collectsFromSingleBucket` is good enough. Relates to #56487 Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com>
This commit is contained in:
parent
775fb5d4cf
commit
67e9d39932
|
@ -28,7 +28,6 @@ import org.elasticsearch.common.lease.Releasable;
|
||||||
import org.elasticsearch.common.xcontent.DeprecationHandler;
|
import org.elasticsearch.common.xcontent.DeprecationHandler;
|
||||||
import org.elasticsearch.common.xcontent.XContentBuilder;
|
import org.elasticsearch.common.xcontent.XContentBuilder;
|
||||||
import org.elasticsearch.common.xcontent.XContentParser;
|
import org.elasticsearch.common.xcontent.XContentParser;
|
||||||
import org.elasticsearch.search.aggregations.bucket.BucketsAggregator;
|
|
||||||
import org.elasticsearch.search.aggregations.support.AggregationPath;
|
import org.elasticsearch.search.aggregations.support.AggregationPath;
|
||||||
import org.elasticsearch.search.internal.SearchContext;
|
import org.elasticsearch.search.internal.SearchContext;
|
||||||
import org.elasticsearch.search.sort.SortOrder;
|
import org.elasticsearch.search.sort.SortOrder;
|
||||||
|
@ -64,19 +63,6 @@ public abstract class Aggregator extends BucketCollector implements Releasable {
|
||||||
AggregationBuilder parse(String aggregationName, XContentParser parser) throws IOException;
|
AggregationBuilder parse(String aggregationName, XContentParser parser) throws IOException;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns whether one of the parents is a {@link BucketsAggregator}.
|
|
||||||
*/
|
|
||||||
public static boolean descendsFromBucketAggregator(Aggregator parent) {
|
|
||||||
while (parent != null) {
|
|
||||||
if (parent instanceof BucketsAggregator) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
parent = parent.parent();
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the name of this aggregator.
|
* Return the name of this aggregator.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -296,15 +296,13 @@ public class SignificantTermsAggregatorFactory extends ValuesSourceAggregatorFac
|
||||||
|
|
||||||
final IncludeExclude.OrdinalsFilter filter = includeExclude == null ? null : includeExclude.convertToOrdinalsFilter(format);
|
final IncludeExclude.OrdinalsFilter filter = includeExclude == null ? null : includeExclude.convertToOrdinalsFilter(format);
|
||||||
boolean remapGlobalOrd = true;
|
boolean remapGlobalOrd = true;
|
||||||
if (Aggregator.descendsFromBucketAggregator(parent) == false &&
|
if (collectsFromSingleBucket && factories == AggregatorFactories.EMPTY && includeExclude == null) {
|
||||||
factories == AggregatorFactories.EMPTY &&
|
/*
|
||||||
includeExclude == null) {
|
|
||||||
/**
|
|
||||||
* We don't need to remap global ords iff this aggregator:
|
* We don't need to remap global ords iff this aggregator:
|
||||||
* - is not a child of a bucket aggregator AND
|
* - collects from a single bucket AND
|
||||||
* - has no include/exclude rules AND
|
* - has no include/exclude rules AND
|
||||||
* - has no sub-aggregator
|
* - has no sub-aggregator
|
||||||
**/
|
*/
|
||||||
remapGlobalOrd = false;
|
remapGlobalOrd = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -351,14 +351,14 @@ public class TermsAggregatorFactory extends ValuesSourceAggregatorFactory {
|
||||||
|
|
||||||
if (factories == AggregatorFactories.EMPTY &&
|
if (factories == AggregatorFactories.EMPTY &&
|
||||||
includeExclude == null &&
|
includeExclude == null &&
|
||||||
Aggregator.descendsFromBucketAggregator(parent) == false &&
|
collectsFromSingleBucket &&
|
||||||
ordinalsValuesSource.supportsGlobalOrdinalsMapping() &&
|
ordinalsValuesSource.supportsGlobalOrdinalsMapping() &&
|
||||||
// we use the static COLLECT_SEGMENT_ORDS to allow tests to force specific optimizations
|
// we use the static COLLECT_SEGMENT_ORDS to allow tests to force specific optimizations
|
||||||
(COLLECT_SEGMENT_ORDS!= null ? COLLECT_SEGMENT_ORDS.booleanValue() : ratio <= 0.5 && maxOrd <= 2048)) {
|
(COLLECT_SEGMENT_ORDS!= null ? COLLECT_SEGMENT_ORDS.booleanValue() : ratio <= 0.5 && maxOrd <= 2048)) {
|
||||||
/**
|
/*
|
||||||
* We can use the low cardinality execution mode iff this aggregator:
|
* We can use the low cardinality execution mode iff this aggregator:
|
||||||
* - has no sub-aggregator AND
|
* - has no sub-aggregator AND
|
||||||
* - is not a child of a bucket aggregator AND
|
* - collects from a single bucket AND
|
||||||
* - has a values source that can map from segment to global ordinals
|
* - has a values source that can map from segment to global ordinals
|
||||||
* - At least we reduce the number of global ordinals look-ups by half (ration <= 0.5) AND
|
* - At least we reduce the number of global ordinals look-ups by half (ration <= 0.5) AND
|
||||||
* - the maximum global ordinal is less than 2048 (LOW_CARDINALITY has additional memory usage,
|
* - the maximum global ordinal is less than 2048 (LOW_CARDINALITY has additional memory usage,
|
||||||
|
@ -382,16 +382,16 @@ public class TermsAggregatorFactory extends ValuesSourceAggregatorFactory {
|
||||||
} else {
|
} else {
|
||||||
remapGlobalOrds = true;
|
remapGlobalOrds = true;
|
||||||
if (includeExclude == null &&
|
if (includeExclude == null &&
|
||||||
Aggregator.descendsFromBucketAggregator(parent) == false &&
|
collectsFromSingleBucket &&
|
||||||
(factories == AggregatorFactories.EMPTY ||
|
(factories == AggregatorFactories.EMPTY ||
|
||||||
(isAggregationSort(order) == false && subAggCollectMode == SubAggCollectionMode.BREADTH_FIRST))) {
|
(isAggregationSort(order) == false && subAggCollectMode == SubAggCollectionMode.BREADTH_FIRST))) {
|
||||||
/**
|
/*
|
||||||
* We don't need to remap global ords iff this aggregator:
|
* We don't need to remap global ords iff this aggregator:
|
||||||
* - has no include/exclude rules AND
|
* - has no include/exclude rules AND
|
||||||
* - is not a child of a bucket aggregator AND
|
* - only collects from a single bucket AND
|
||||||
* - has no sub-aggregator or only sub-aggregator that can be deferred
|
* - has no sub-aggregator or only sub-aggregator that can be deferred
|
||||||
* ({@link SubAggCollectionMode#BREADTH_FIRST}).
|
* ({@link SubAggCollectionMode#BREADTH_FIRST}).
|
||||||
**/
|
*/
|
||||||
remapGlobalOrds = false;
|
remapGlobalOrds = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue