Prevents exception being raised when ordering by an aggregation which wasn't collected
If a terms aggregation was ordered by a metric nested in a single bucket aggregator which did not collect any documents (e.g. a filters aggregation which did not match in that term bucket) an ArrayOutOfBoundsException would be thrown when the ordering code tried to retrieve the value for the metric. This fix fixes all numeric metric aggregators so they return their default value when a bucket ordinal is requested which was not collected. Closes #17225
This commit is contained in:
parent
5f24581de3
commit
ff3fd99074
|
@ -94,7 +94,10 @@ public class AvgAggregator extends NumericMetricsAggregator.SingleValue {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double metric(long owningBucketOrd) {
|
public double metric(long owningBucketOrd) {
|
||||||
return valuesSource == null ? Double.NaN : sums.get(owningBucketOrd) / counts.get(owningBucketOrd);
|
if (valuesSource == null || owningBucketOrd >= sums.size()) {
|
||||||
|
return Double.NaN;
|
||||||
|
}
|
||||||
|
return sums.get(owningBucketOrd) / counts.get(owningBucketOrd);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -96,7 +96,10 @@ public class MaxAggregator extends NumericMetricsAggregator.SingleValue {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double metric(long owningBucketOrd) {
|
public double metric(long owningBucketOrd) {
|
||||||
return valuesSource == null ? Double.NEGATIVE_INFINITY : maxes.get(owningBucketOrd);
|
if (valuesSource == null || owningBucketOrd >= maxes.size()) {
|
||||||
|
return Double.NEGATIVE_INFINITY;
|
||||||
|
}
|
||||||
|
return maxes.get(owningBucketOrd);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -95,7 +95,10 @@ public class MinAggregator extends NumericMetricsAggregator.SingleValue {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double metric(long owningBucketOrd) {
|
public double metric(long owningBucketOrd) {
|
||||||
return valuesSource == null ? Double.POSITIVE_INFINITY : mins.get(owningBucketOrd);
|
if (valuesSource == null || owningBucketOrd >= mins.size()) {
|
||||||
|
return Double.POSITIVE_INFINITY;
|
||||||
|
}
|
||||||
|
return mins.get(owningBucketOrd);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -128,12 +128,23 @@ public class StatsAggregator extends NumericMetricsAggregator.MultiValue {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double metric(String name, long owningBucketOrd) {
|
public double metric(String name, long owningBucketOrd) {
|
||||||
|
if (valuesSource == null || owningBucketOrd >= counts.size()) {
|
||||||
switch(InternalStats.Metrics.resolve(name)) {
|
switch(InternalStats.Metrics.resolve(name)) {
|
||||||
case count: return valuesSource == null ? 0 : counts.get(owningBucketOrd);
|
case count: return 0;
|
||||||
case sum: return valuesSource == null ? 0 : sums.get(owningBucketOrd);
|
case sum: return 0;
|
||||||
case min: return valuesSource == null ? Double.POSITIVE_INFINITY : mins.get(owningBucketOrd);
|
case min: return Double.POSITIVE_INFINITY;
|
||||||
case max: return valuesSource == null ? Double.NEGATIVE_INFINITY : maxes.get(owningBucketOrd);
|
case max: return Double.NEGATIVE_INFINITY;
|
||||||
case avg: return valuesSource == null ? Double.NaN : sums.get(owningBucketOrd) / counts.get(owningBucketOrd);
|
case avg: return Double.NaN;
|
||||||
|
default:
|
||||||
|
throw new IllegalArgumentException("Unknown value [" + name + "] in common stats aggregation");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
switch(InternalStats.Metrics.resolve(name)) {
|
||||||
|
case count: return counts.get(owningBucketOrd);
|
||||||
|
case sum: return sums.get(owningBucketOrd);
|
||||||
|
case min: return mins.get(owningBucketOrd);
|
||||||
|
case max: return maxes.get(owningBucketOrd);
|
||||||
|
case avg: return sums.get(owningBucketOrd) / counts.get(owningBucketOrd);
|
||||||
default:
|
default:
|
||||||
throw new IllegalArgumentException("Unknown value [" + name + "] in common stats aggregation");
|
throw new IllegalArgumentException("Unknown value [" + name + "] in common stats aggregation");
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,6 +30,7 @@ import org.elasticsearch.search.aggregations.InternalAggregation;
|
||||||
import org.elasticsearch.search.aggregations.LeafBucketCollector;
|
import org.elasticsearch.search.aggregations.LeafBucketCollector;
|
||||||
import org.elasticsearch.search.aggregations.LeafBucketCollectorBase;
|
import org.elasticsearch.search.aggregations.LeafBucketCollectorBase;
|
||||||
import org.elasticsearch.search.aggregations.metrics.NumericMetricsAggregator;
|
import org.elasticsearch.search.aggregations.metrics.NumericMetricsAggregator;
|
||||||
|
import org.elasticsearch.search.aggregations.metrics.stats.InternalStats;
|
||||||
import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator;
|
import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator;
|
||||||
import org.elasticsearch.search.aggregations.support.AggregationContext;
|
import org.elasticsearch.search.aggregations.support.AggregationContext;
|
||||||
import org.elasticsearch.search.aggregations.support.ValuesSource;
|
import org.elasticsearch.search.aggregations.support.ValuesSource;
|
||||||
|
@ -140,20 +141,34 @@ public class ExtendedStatsAggregator extends NumericMetricsAggregator.MultiValue
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double metric(String name, long owningBucketOrd) {
|
public double metric(String name, long owningBucketOrd) {
|
||||||
|
if (valuesSource == null || owningBucketOrd >= counts.size()) {
|
||||||
switch(InternalExtendedStats.Metrics.resolve(name)) {
|
switch(InternalExtendedStats.Metrics.resolve(name)) {
|
||||||
case count: return valuesSource == null ? 0 : counts.get(owningBucketOrd);
|
case count: return 0;
|
||||||
case sum: return valuesSource == null ? 0 : sums.get(owningBucketOrd);
|
case sum: return 0;
|
||||||
case min: return valuesSource == null ? Double.POSITIVE_INFINITY : mins.get(owningBucketOrd);
|
case min: return Double.POSITIVE_INFINITY;
|
||||||
case max: return valuesSource == null ? Double.NEGATIVE_INFINITY : maxes.get(owningBucketOrd);
|
case max: return Double.NEGATIVE_INFINITY;
|
||||||
case avg: return valuesSource == null ? Double.NaN : sums.get(owningBucketOrd) / counts.get(owningBucketOrd);
|
case avg: return Double.NaN;
|
||||||
case sum_of_squares: return valuesSource == null ? 0 : sumOfSqrs.get(owningBucketOrd);
|
case sum_of_squares: return 0;
|
||||||
case variance: return valuesSource == null ? Double.NaN : variance(owningBucketOrd);
|
case variance: return Double.NaN;
|
||||||
case std_deviation: return valuesSource == null ? Double.NaN : Math.sqrt(variance(owningBucketOrd));
|
case std_deviation: return Double.NaN;
|
||||||
|
case std_upper: return Double.NaN;
|
||||||
|
case std_lower: return Double.NaN;
|
||||||
|
default:
|
||||||
|
throw new IllegalArgumentException("Unknown value [" + name + "] in common stats aggregation");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
switch(InternalExtendedStats.Metrics.resolve(name)) {
|
||||||
|
case count: return counts.get(owningBucketOrd);
|
||||||
|
case sum: return sums.get(owningBucketOrd);
|
||||||
|
case min: return mins.get(owningBucketOrd);
|
||||||
|
case max: return maxes.get(owningBucketOrd);
|
||||||
|
case avg: return sums.get(owningBucketOrd) / counts.get(owningBucketOrd);
|
||||||
|
case sum_of_squares: return sumOfSqrs.get(owningBucketOrd);
|
||||||
|
case variance: return variance(owningBucketOrd);
|
||||||
|
case std_deviation: return Math.sqrt(variance(owningBucketOrd));
|
||||||
case std_upper:
|
case std_upper:
|
||||||
if (valuesSource == null) { return Double.NaN; }
|
|
||||||
return (sums.get(owningBucketOrd) / counts.get(owningBucketOrd)) + (Math.sqrt(variance(owningBucketOrd)) * this.sigma);
|
return (sums.get(owningBucketOrd) / counts.get(owningBucketOrd)) + (Math.sqrt(variance(owningBucketOrd)) * this.sigma);
|
||||||
case std_lower:
|
case std_lower:
|
||||||
if (valuesSource == null) { return Double.NaN; }
|
|
||||||
return (sums.get(owningBucketOrd) / counts.get(owningBucketOrd)) - (Math.sqrt(variance(owningBucketOrd)) * this.sigma);
|
return (sums.get(owningBucketOrd) / counts.get(owningBucketOrd)) - (Math.sqrt(variance(owningBucketOrd)) * this.sigma);
|
||||||
default:
|
default:
|
||||||
throw new IllegalArgumentException("Unknown value [" + name + "] in common stats aggregation");
|
throw new IllegalArgumentException("Unknown value [" + name + "] in common stats aggregation");
|
||||||
|
|
|
@ -87,7 +87,10 @@ public class SumAggregator extends NumericMetricsAggregator.SingleValue {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double metric(long owningBucketOrd) {
|
public double metric(long owningBucketOrd) {
|
||||||
return valuesSource == null ? 0 : sums.get(owningBucketOrd);
|
if (valuesSource == null || owningBucketOrd >= sums.size()) {
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
return sums.get(owningBucketOrd);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -31,8 +31,11 @@ import org.elasticsearch.script.ScriptEngineService;
|
||||||
import org.elasticsearch.script.ScriptModule;
|
import org.elasticsearch.script.ScriptModule;
|
||||||
import org.elasticsearch.script.ScriptService.ScriptType;
|
import org.elasticsearch.script.ScriptService.ScriptType;
|
||||||
import org.elasticsearch.script.SearchScript;
|
import org.elasticsearch.script.SearchScript;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.filter.Filter;
|
||||||
import org.elasticsearch.search.aggregations.bucket.global.Global;
|
import org.elasticsearch.search.aggregations.bucket.global.Global;
|
||||||
import org.elasticsearch.search.aggregations.bucket.histogram.Histogram;
|
import org.elasticsearch.search.aggregations.bucket.histogram.Histogram;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.terms.Terms.Order;
|
||||||
import org.elasticsearch.search.aggregations.metrics.avg.Avg;
|
import org.elasticsearch.search.aggregations.metrics.avg.Avg;
|
||||||
import org.elasticsearch.search.lookup.LeafSearchLookup;
|
import org.elasticsearch.search.lookup.LeafSearchLookup;
|
||||||
import org.elasticsearch.search.lookup.SearchLookup;
|
import org.elasticsearch.search.lookup.SearchLookup;
|
||||||
|
@ -47,9 +50,12 @@ import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
|
import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
|
||||||
|
import static org.elasticsearch.index.query.QueryBuilders.termQuery;
|
||||||
import static org.elasticsearch.search.aggregations.AggregationBuilders.avg;
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.avg;
|
||||||
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.filter;
|
||||||
import static org.elasticsearch.search.aggregations.AggregationBuilders.global;
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.global;
|
||||||
import static org.elasticsearch.search.aggregations.AggregationBuilders.histogram;
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.histogram;
|
||||||
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.terms;
|
||||||
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertHitCount;
|
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertHitCount;
|
||||||
import static org.hamcrest.Matchers.equalTo;
|
import static org.hamcrest.Matchers.equalTo;
|
||||||
import static org.hamcrest.Matchers.is;
|
import static org.hamcrest.Matchers.is;
|
||||||
|
@ -317,6 +323,36 @@ public class AvgIT extends AbstractNumericTestCase {
|
||||||
assertThat(avg.getValue(), equalTo((double) (3+4+4+5+5+6+6+7+7+8+8+9+9+10+10+11+11+12+12+13) / 20));
|
assertThat(avg.getValue(), equalTo((double) (3+4+4+5+5+6+6+7+7+8+8+9+9+10+10+11+11+12+12+13) / 20));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void testOrderByEmptyAggregation() throws Exception {
|
||||||
|
SearchResponse searchResponse = client().prepareSearch("idx").setQuery(matchAllQuery())
|
||||||
|
.addAggregation(terms("terms").field("value").order(Order.compound(Order.aggregation("filter>avg", true)))
|
||||||
|
.subAggregation(filter("filter", termQuery("value", 100)).subAggregation(avg("avg").field("value"))))
|
||||||
|
.get();
|
||||||
|
|
||||||
|
assertHitCount(searchResponse, 10);
|
||||||
|
|
||||||
|
Terms terms = searchResponse.getAggregations().get("terms");
|
||||||
|
assertThat(terms, notNullValue());
|
||||||
|
List<Terms.Bucket> buckets = terms.getBuckets();
|
||||||
|
assertThat(buckets, notNullValue());
|
||||||
|
assertThat(buckets.size(), equalTo(10));
|
||||||
|
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
Terms.Bucket bucket = buckets.get(i);
|
||||||
|
assertThat(bucket, notNullValue());
|
||||||
|
assertThat(bucket.getKeyAsNumber(), equalTo((long) i + 1));
|
||||||
|
assertThat(bucket.getDocCount(), equalTo(1L));
|
||||||
|
Filter filter = bucket.getAggregations().get("filter");
|
||||||
|
assertThat(filter, notNullValue());
|
||||||
|
assertThat(filter.getDocCount(), equalTo(0L));
|
||||||
|
Avg avg = filter.getAggregations().get("avg");
|
||||||
|
assertThat(avg, notNullValue());
|
||||||
|
assertThat(avg.value(), equalTo(Double.NaN));
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Mock plugin for the {@link ExtractFieldScriptEngine}
|
* Mock plugin for the {@link ExtractFieldScriptEngine}
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -31,8 +31,11 @@ import org.elasticsearch.script.ScriptEngineService;
|
||||||
import org.elasticsearch.script.ScriptModule;
|
import org.elasticsearch.script.ScriptModule;
|
||||||
import org.elasticsearch.script.ScriptService.ScriptType;
|
import org.elasticsearch.script.ScriptService.ScriptType;
|
||||||
import org.elasticsearch.script.SearchScript;
|
import org.elasticsearch.script.SearchScript;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.filter.Filter;
|
||||||
import org.elasticsearch.search.aggregations.bucket.global.Global;
|
import org.elasticsearch.search.aggregations.bucket.global.Global;
|
||||||
import org.elasticsearch.search.aggregations.bucket.histogram.Histogram;
|
import org.elasticsearch.search.aggregations.bucket.histogram.Histogram;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.terms.Terms.Order;
|
||||||
import org.elasticsearch.search.aggregations.metrics.sum.Sum;
|
import org.elasticsearch.search.aggregations.metrics.sum.Sum;
|
||||||
import org.elasticsearch.search.lookup.LeafSearchLookup;
|
import org.elasticsearch.search.lookup.LeafSearchLookup;
|
||||||
import org.elasticsearch.search.lookup.SearchLookup;
|
import org.elasticsearch.search.lookup.SearchLookup;
|
||||||
|
@ -47,9 +50,12 @@ import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
|
import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
|
||||||
|
import static org.elasticsearch.index.query.QueryBuilders.termQuery;
|
||||||
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.filter;
|
||||||
import static org.elasticsearch.search.aggregations.AggregationBuilders.global;
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.global;
|
||||||
import static org.elasticsearch.search.aggregations.AggregationBuilders.histogram;
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.histogram;
|
||||||
import static org.elasticsearch.search.aggregations.AggregationBuilders.sum;
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.sum;
|
||||||
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.terms;
|
||||||
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertHitCount;
|
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertHitCount;
|
||||||
import static org.hamcrest.Matchers.equalTo;
|
import static org.hamcrest.Matchers.equalTo;
|
||||||
import static org.hamcrest.Matchers.notNullValue;
|
import static org.hamcrest.Matchers.notNullValue;
|
||||||
|
@ -312,6 +318,36 @@ public class SumIT extends AbstractNumericTestCase {
|
||||||
assertThat(sum.getValue(), equalTo((double) 2 + 3 + 3 + 4 + 4 + 5 + 5 + 6 + 6 + 7 + 7 + 8 + 8 + 9 + 9 + 10 + 10 + 11 + 11 + 12));
|
assertThat(sum.getValue(), equalTo((double) 2 + 3 + 3 + 4 + 4 + 5 + 5 + 6 + 6 + 7 + 7 + 8 + 8 + 9 + 9 + 10 + 10 + 11 + 11 + 12));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void testOrderByEmptyAggregation() throws Exception {
|
||||||
|
SearchResponse searchResponse = client().prepareSearch("idx").setQuery(matchAllQuery())
|
||||||
|
.addAggregation(terms("terms").field("value").order(Order.compound(Order.aggregation("filter>sum", true)))
|
||||||
|
.subAggregation(filter("filter", termQuery("value", 100)).subAggregation(sum("sum").field("value"))))
|
||||||
|
.get();
|
||||||
|
|
||||||
|
assertHitCount(searchResponse, 10);
|
||||||
|
|
||||||
|
Terms terms = searchResponse.getAggregations().get("terms");
|
||||||
|
assertThat(terms, notNullValue());
|
||||||
|
List<Terms.Bucket> buckets = terms.getBuckets();
|
||||||
|
assertThat(buckets, notNullValue());
|
||||||
|
assertThat(buckets.size(), equalTo(10));
|
||||||
|
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
Terms.Bucket bucket = buckets.get(i);
|
||||||
|
assertThat(bucket, notNullValue());
|
||||||
|
assertThat(bucket.getKeyAsNumber(), equalTo((long) i + 1));
|
||||||
|
assertThat(bucket.getDocCount(), equalTo(1L));
|
||||||
|
Filter filter = bucket.getAggregations().get("filter");
|
||||||
|
assertThat(filter, notNullValue());
|
||||||
|
assertThat(filter.getDocCount(), equalTo(0L));
|
||||||
|
Sum sum = filter.getAggregations().get("sum");
|
||||||
|
assertThat(sum, notNullValue());
|
||||||
|
assertThat(sum.value(), equalTo(0.0));
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Mock plugin for the {@link ExtractFieldScriptEngine}
|
* Mock plugin for the {@link ExtractFieldScriptEngine}
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -24,20 +24,26 @@ import org.elasticsearch.plugins.Plugin;
|
||||||
import org.elasticsearch.script.Script;
|
import org.elasticsearch.script.Script;
|
||||||
import org.elasticsearch.script.ScriptService.ScriptType;
|
import org.elasticsearch.script.ScriptService.ScriptType;
|
||||||
import org.elasticsearch.script.groovy.GroovyPlugin;
|
import org.elasticsearch.script.groovy.GroovyPlugin;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.filter.Filter;
|
||||||
import org.elasticsearch.search.aggregations.bucket.global.Global;
|
import org.elasticsearch.search.aggregations.bucket.global.Global;
|
||||||
import org.elasticsearch.search.aggregations.bucket.histogram.Histogram;
|
import org.elasticsearch.search.aggregations.bucket.histogram.Histogram;
|
||||||
import org.elasticsearch.search.aggregations.bucket.missing.Missing;
|
import org.elasticsearch.search.aggregations.bucket.missing.Missing;
|
||||||
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
|
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.terms.Terms.Order;
|
||||||
import org.elasticsearch.search.aggregations.metrics.AbstractNumericTestCase;
|
import org.elasticsearch.search.aggregations.metrics.AbstractNumericTestCase;
|
||||||
import org.elasticsearch.search.aggregations.metrics.stats.extended.ExtendedStats;
|
import org.elasticsearch.search.aggregations.metrics.stats.extended.ExtendedStats;
|
||||||
|
import org.elasticsearch.search.aggregations.metrics.stats.extended.ExtendedStats.Bounds;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
|
import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
|
||||||
|
import static org.elasticsearch.index.query.QueryBuilders.termQuery;
|
||||||
import static org.elasticsearch.search.aggregations.AggregationBuilders.extendedStats;
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.extendedStats;
|
||||||
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.filter;
|
||||||
import static org.elasticsearch.search.aggregations.AggregationBuilders.global;
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.global;
|
||||||
import static org.elasticsearch.search.aggregations.AggregationBuilders.histogram;
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.histogram;
|
||||||
import static org.elasticsearch.search.aggregations.AggregationBuilders.missing;
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.missing;
|
||||||
|
@ -538,6 +544,45 @@ public class ExtendedStatsTests extends AbstractNumericTestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void testOrderByEmptyAggregation() throws Exception {
|
||||||
|
SearchResponse searchResponse = client().prepareSearch("idx").setQuery(matchAllQuery())
|
||||||
|
.addAggregation(terms("terms").field("value").order(Order.compound(Order.aggregation("filter>extendedStats.avg", true)))
|
||||||
|
.subAggregation(
|
||||||
|
filter("filter", termQuery("value", 100)).subAggregation(extendedStats("extendedStats").field("value"))))
|
||||||
|
.get();
|
||||||
|
|
||||||
|
assertHitCount(searchResponse, 10);
|
||||||
|
|
||||||
|
Terms terms = searchResponse.getAggregations().get("terms");
|
||||||
|
assertThat(terms, notNullValue());
|
||||||
|
List<Terms.Bucket> buckets = terms.getBuckets();
|
||||||
|
assertThat(buckets, notNullValue());
|
||||||
|
assertThat(buckets.size(), equalTo(10));
|
||||||
|
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
Terms.Bucket bucket = buckets.get(i);
|
||||||
|
assertThat(bucket, notNullValue());
|
||||||
|
assertThat(bucket.getKeyAsNumber(), equalTo((long) i + 1));
|
||||||
|
assertThat(bucket.getDocCount(), equalTo(1L));
|
||||||
|
Filter filter = bucket.getAggregations().get("filter");
|
||||||
|
assertThat(filter, notNullValue());
|
||||||
|
assertThat(filter.getDocCount(), equalTo(0L));
|
||||||
|
ExtendedStats extendedStats = filter.getAggregations().get("extendedStats");
|
||||||
|
assertThat(extendedStats, notNullValue());
|
||||||
|
assertThat(extendedStats.getMin(), equalTo(Double.POSITIVE_INFINITY));
|
||||||
|
assertThat(extendedStats.getMax(), equalTo(Double.NEGATIVE_INFINITY));
|
||||||
|
assertThat(extendedStats.getAvg(), equalTo(Double.NaN));
|
||||||
|
assertThat(extendedStats.getSum(), equalTo(0.0));
|
||||||
|
assertThat(extendedStats.getCount(), equalTo(0L));
|
||||||
|
assertThat(extendedStats.getStdDeviation(), equalTo(Double.NaN));
|
||||||
|
assertThat(extendedStats.getSumOfSquares(), equalTo(0.0));
|
||||||
|
assertThat(extendedStats.getVariance(), equalTo(Double.NaN));
|
||||||
|
assertThat(extendedStats.getStdDeviationBound(Bounds.LOWER), equalTo(Double.NaN));
|
||||||
|
assertThat(extendedStats.getStdDeviationBound(Bounds.UPPER), equalTo(Double.NaN));
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void assertShardExecutionState(SearchResponse response, int expectedFailures) throws Exception {
|
private void assertShardExecutionState(SearchResponse response, int expectedFailures) throws Exception {
|
||||||
ShardSearchFailure[] failures = response.getShardFailures();
|
ShardSearchFailure[] failures = response.getShardFailures();
|
||||||
|
|
|
@ -24,9 +24,11 @@ import org.elasticsearch.plugins.Plugin;
|
||||||
import org.elasticsearch.script.Script;
|
import org.elasticsearch.script.Script;
|
||||||
import org.elasticsearch.script.ScriptService.ScriptType;
|
import org.elasticsearch.script.ScriptService.ScriptType;
|
||||||
import org.elasticsearch.script.groovy.GroovyPlugin;
|
import org.elasticsearch.script.groovy.GroovyPlugin;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.filter.Filter;
|
||||||
import org.elasticsearch.search.aggregations.bucket.global.Global;
|
import org.elasticsearch.search.aggregations.bucket.global.Global;
|
||||||
import org.elasticsearch.search.aggregations.bucket.histogram.Histogram;
|
import org.elasticsearch.search.aggregations.bucket.histogram.Histogram;
|
||||||
import org.elasticsearch.search.aggregations.bucket.histogram.Histogram.Order;
|
import org.elasticsearch.search.aggregations.bucket.histogram.Histogram.Order;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
|
||||||
import org.elasticsearch.search.aggregations.metrics.AbstractNumericTestCase;
|
import org.elasticsearch.search.aggregations.metrics.AbstractNumericTestCase;
|
||||||
import org.elasticsearch.search.aggregations.metrics.percentiles.Percentile;
|
import org.elasticsearch.search.aggregations.metrics.percentiles.Percentile;
|
||||||
import org.elasticsearch.search.aggregations.metrics.percentiles.PercentileRanks;
|
import org.elasticsearch.search.aggregations.metrics.percentiles.PercentileRanks;
|
||||||
|
@ -41,9 +43,12 @@ import java.util.Map;
|
||||||
|
|
||||||
import static org.elasticsearch.common.util.CollectionUtils.iterableAsArrayList;
|
import static org.elasticsearch.common.util.CollectionUtils.iterableAsArrayList;
|
||||||
import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
|
import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
|
||||||
|
import static org.elasticsearch.index.query.QueryBuilders.termQuery;
|
||||||
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.filter;
|
||||||
import static org.elasticsearch.search.aggregations.AggregationBuilders.global;
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.global;
|
||||||
import static org.elasticsearch.search.aggregations.AggregationBuilders.histogram;
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.histogram;
|
||||||
import static org.elasticsearch.search.aggregations.AggregationBuilders.percentileRanks;
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.percentileRanks;
|
||||||
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.terms;
|
||||||
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertHitCount;
|
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertHitCount;
|
||||||
import static org.hamcrest.Matchers.equalTo;
|
import static org.hamcrest.Matchers.equalTo;
|
||||||
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
|
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
|
||||||
|
@ -463,4 +468,35 @@ public class HDRPercentileRanksTests extends AbstractNumericTestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void testOrderByEmptyAggregation() throws Exception {
|
||||||
|
SearchResponse searchResponse = client().prepareSearch("idx").setQuery(matchAllQuery())
|
||||||
|
.addAggregation(terms("terms").field("value").order(Terms.Order.compound(Terms.Order.aggregation("filter>ranks.99", true)))
|
||||||
|
.subAggregation(filter("filter", termQuery("value", 100))
|
||||||
|
.subAggregation(percentileRanks("ranks").method(PercentilesMethod.HDR).values(99).field("value"))))
|
||||||
|
.get();
|
||||||
|
|
||||||
|
assertHitCount(searchResponse, 10);
|
||||||
|
|
||||||
|
Terms terms = searchResponse.getAggregations().get("terms");
|
||||||
|
assertThat(terms, notNullValue());
|
||||||
|
List<Terms.Bucket> buckets = terms.getBuckets();
|
||||||
|
assertThat(buckets, notNullValue());
|
||||||
|
assertThat(buckets.size(), equalTo(10));
|
||||||
|
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
Terms.Bucket bucket = buckets.get(i);
|
||||||
|
assertThat(bucket, notNullValue());
|
||||||
|
assertThat(bucket.getKeyAsNumber(), equalTo((long) i + 1));
|
||||||
|
assertThat(bucket.getDocCount(), equalTo(1L));
|
||||||
|
Filter filter = bucket.getAggregations().get("filter");
|
||||||
|
assertThat(filter, notNullValue());
|
||||||
|
assertThat(filter.getDocCount(), equalTo(0L));
|
||||||
|
PercentileRanks ranks = filter.getAggregations().get("ranks");
|
||||||
|
assertThat(ranks, notNullValue());
|
||||||
|
assertThat(ranks.percent(99), equalTo(Double.NaN));
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,9 +25,11 @@ import org.elasticsearch.plugins.Plugin;
|
||||||
import org.elasticsearch.script.Script;
|
import org.elasticsearch.script.Script;
|
||||||
import org.elasticsearch.script.ScriptService.ScriptType;
|
import org.elasticsearch.script.ScriptService.ScriptType;
|
||||||
import org.elasticsearch.script.groovy.GroovyPlugin;
|
import org.elasticsearch.script.groovy.GroovyPlugin;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.filter.Filter;
|
||||||
import org.elasticsearch.search.aggregations.bucket.global.Global;
|
import org.elasticsearch.search.aggregations.bucket.global.Global;
|
||||||
import org.elasticsearch.search.aggregations.bucket.histogram.Histogram;
|
import org.elasticsearch.search.aggregations.bucket.histogram.Histogram;
|
||||||
import org.elasticsearch.search.aggregations.bucket.histogram.Histogram.Order;
|
import org.elasticsearch.search.aggregations.bucket.histogram.Histogram.Order;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
|
||||||
import org.elasticsearch.search.aggregations.metrics.AbstractNumericTestCase;
|
import org.elasticsearch.search.aggregations.metrics.AbstractNumericTestCase;
|
||||||
import org.elasticsearch.search.aggregations.metrics.percentiles.Percentile;
|
import org.elasticsearch.search.aggregations.metrics.percentiles.Percentile;
|
||||||
import org.elasticsearch.search.aggregations.metrics.percentiles.Percentiles;
|
import org.elasticsearch.search.aggregations.metrics.percentiles.Percentiles;
|
||||||
|
@ -41,9 +43,12 @@ import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
|
import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
|
||||||
|
import static org.elasticsearch.index.query.QueryBuilders.termQuery;
|
||||||
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.filter;
|
||||||
import static org.elasticsearch.search.aggregations.AggregationBuilders.global;
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.global;
|
||||||
import static org.elasticsearch.search.aggregations.AggregationBuilders.histogram;
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.histogram;
|
||||||
import static org.elasticsearch.search.aggregations.AggregationBuilders.percentiles;
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.percentiles;
|
||||||
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.terms;
|
||||||
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertHitCount;
|
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertHitCount;
|
||||||
import static org.hamcrest.Matchers.closeTo;
|
import static org.hamcrest.Matchers.closeTo;
|
||||||
import static org.hamcrest.Matchers.equalTo;
|
import static org.hamcrest.Matchers.equalTo;
|
||||||
|
@ -443,4 +448,37 @@ public class HDRPercentilesTests extends AbstractNumericTestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void testOrderByEmptyAggregation() throws Exception {
|
||||||
|
SearchResponse searchResponse = client().prepareSearch("idx")
|
||||||
|
.setQuery(matchAllQuery())
|
||||||
|
.addAggregation(
|
||||||
|
terms("terms").field("value").order(Terms.Order.compound(Terms.Order.aggregation("filter>percentiles.99", true)))
|
||||||
|
.subAggregation(filter("filter", termQuery("value", 100))
|
||||||
|
.subAggregation(percentiles("percentiles").method(PercentilesMethod.HDR).field("value"))))
|
||||||
|
.get();
|
||||||
|
|
||||||
|
assertHitCount(searchResponse, 10);
|
||||||
|
|
||||||
|
Terms terms = searchResponse.getAggregations().get("terms");
|
||||||
|
assertThat(terms, notNullValue());
|
||||||
|
List<Terms.Bucket> buckets = terms.getBuckets();
|
||||||
|
assertThat(buckets, notNullValue());
|
||||||
|
assertThat(buckets.size(), equalTo(10));
|
||||||
|
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
Terms.Bucket bucket = buckets.get(i);
|
||||||
|
assertThat(bucket, notNullValue());
|
||||||
|
assertThat(bucket.getKeyAsNumber(), equalTo((long) i + 1));
|
||||||
|
assertThat(bucket.getDocCount(), equalTo(1L));
|
||||||
|
Filter filter = bucket.getAggregations().get("filter");
|
||||||
|
assertThat(filter, notNullValue());
|
||||||
|
assertThat(filter.getDocCount(), equalTo(0L));
|
||||||
|
Percentiles percentiles = filter.getAggregations().get("percentiles");
|
||||||
|
assertThat(percentiles, notNullValue());
|
||||||
|
assertThat(percentiles.percentile(99), equalTo(Double.NaN));
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -23,20 +23,26 @@ import org.elasticsearch.plugins.Plugin;
|
||||||
import org.elasticsearch.script.Script;
|
import org.elasticsearch.script.Script;
|
||||||
import org.elasticsearch.script.ScriptService.ScriptType;
|
import org.elasticsearch.script.ScriptService.ScriptType;
|
||||||
import org.elasticsearch.script.groovy.GroovyPlugin;
|
import org.elasticsearch.script.groovy.GroovyPlugin;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.filter.Filter;
|
||||||
import org.elasticsearch.search.aggregations.bucket.global.Global;
|
import org.elasticsearch.search.aggregations.bucket.global.Global;
|
||||||
import org.elasticsearch.search.aggregations.bucket.histogram.Histogram;
|
import org.elasticsearch.search.aggregations.bucket.histogram.Histogram;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.terms.Terms.Order;
|
||||||
import org.elasticsearch.search.aggregations.metrics.AbstractNumericTestCase;
|
import org.elasticsearch.search.aggregations.metrics.AbstractNumericTestCase;
|
||||||
import org.elasticsearch.search.aggregations.metrics.max.Max;
|
import org.elasticsearch.search.aggregations.metrics.max.Max;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
|
import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
|
||||||
|
import static org.elasticsearch.index.query.QueryBuilders.termQuery;
|
||||||
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.filter;
|
||||||
import static org.elasticsearch.search.aggregations.AggregationBuilders.global;
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.global;
|
||||||
import static org.elasticsearch.search.aggregations.AggregationBuilders.histogram;
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.histogram;
|
||||||
import static org.elasticsearch.search.aggregations.AggregationBuilders.max;
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.max;
|
||||||
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.terms;
|
||||||
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertHitCount;
|
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertHitCount;
|
||||||
import static org.hamcrest.Matchers.equalTo;
|
import static org.hamcrest.Matchers.equalTo;
|
||||||
import static org.hamcrest.Matchers.notNullValue;
|
import static org.hamcrest.Matchers.notNullValue;
|
||||||
|
@ -293,4 +299,34 @@ public class MaxTests extends AbstractNumericTestCase {
|
||||||
assertThat(max.getName(), equalTo("max"));
|
assertThat(max.getName(), equalTo("max"));
|
||||||
assertThat(max.getValue(), equalTo(11.0));
|
assertThat(max.getValue(), equalTo(11.0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void testOrderByEmptyAggregation() throws Exception {
|
||||||
|
SearchResponse searchResponse = client().prepareSearch("idx").setQuery(matchAllQuery())
|
||||||
|
.addAggregation(terms("terms").field("value").order(Order.compound(Order.aggregation("filter>max", true)))
|
||||||
|
.subAggregation(filter("filter", termQuery("value", 100)).subAggregation(max("max").field("value"))))
|
||||||
|
.get();
|
||||||
|
|
||||||
|
assertHitCount(searchResponse, 10);
|
||||||
|
|
||||||
|
Terms terms = searchResponse.getAggregations().get("terms");
|
||||||
|
assertThat(terms, notNullValue());
|
||||||
|
List<Terms.Bucket> buckets = terms.getBuckets();
|
||||||
|
assertThat(buckets, notNullValue());
|
||||||
|
assertThat(buckets.size(), equalTo(10));
|
||||||
|
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
Terms.Bucket bucket = buckets.get(i);
|
||||||
|
assertThat(bucket, notNullValue());
|
||||||
|
assertThat(bucket.getKeyAsNumber(), equalTo((long) i + 1));
|
||||||
|
assertThat(bucket.getDocCount(), equalTo(1L));
|
||||||
|
Filter filter = bucket.getAggregations().get("filter");
|
||||||
|
assertThat(filter, notNullValue());
|
||||||
|
assertThat(filter.getDocCount(), equalTo(0L));
|
||||||
|
Max max = filter.getAggregations().get("max");
|
||||||
|
assertThat(max, notNullValue());
|
||||||
|
assertThat(max.value(), equalTo(Double.NEGATIVE_INFINITY));
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -23,20 +23,27 @@ import org.elasticsearch.plugins.Plugin;
|
||||||
import org.elasticsearch.script.Script;
|
import org.elasticsearch.script.Script;
|
||||||
import org.elasticsearch.script.ScriptService.ScriptType;
|
import org.elasticsearch.script.ScriptService.ScriptType;
|
||||||
import org.elasticsearch.script.groovy.GroovyPlugin;
|
import org.elasticsearch.script.groovy.GroovyPlugin;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.filter.Filter;
|
||||||
import org.elasticsearch.search.aggregations.bucket.global.Global;
|
import org.elasticsearch.search.aggregations.bucket.global.Global;
|
||||||
import org.elasticsearch.search.aggregations.bucket.histogram.Histogram;
|
import org.elasticsearch.search.aggregations.bucket.histogram.Histogram;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.terms.Terms.Order;
|
||||||
import org.elasticsearch.search.aggregations.metrics.AbstractNumericTestCase;
|
import org.elasticsearch.search.aggregations.metrics.AbstractNumericTestCase;
|
||||||
import org.elasticsearch.search.aggregations.metrics.min.Min;
|
import org.elasticsearch.search.aggregations.metrics.min.Min;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
|
import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
|
||||||
|
import static org.elasticsearch.index.query.QueryBuilders.termQuery;
|
||||||
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.filter;
|
||||||
import static org.elasticsearch.search.aggregations.AggregationBuilders.global;
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.global;
|
||||||
import static org.elasticsearch.search.aggregations.AggregationBuilders.histogram;
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.histogram;
|
||||||
import static org.elasticsearch.search.aggregations.AggregationBuilders.min;
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.min;
|
||||||
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.terms;
|
||||||
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertHitCount;
|
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertHitCount;
|
||||||
import static org.hamcrest.Matchers.equalTo;
|
import static org.hamcrest.Matchers.equalTo;
|
||||||
import static org.hamcrest.Matchers.notNullValue;
|
import static org.hamcrest.Matchers.notNullValue;
|
||||||
|
@ -305,4 +312,34 @@ public class MinTests extends AbstractNumericTestCase {
|
||||||
assertThat(min.getName(), equalTo("min"));
|
assertThat(min.getName(), equalTo("min"));
|
||||||
assertThat(min.getValue(), equalTo(1.0));
|
assertThat(min.getValue(), equalTo(1.0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void testOrderByEmptyAggregation() throws Exception {
|
||||||
|
SearchResponse searchResponse = client().prepareSearch("idx").setQuery(matchAllQuery())
|
||||||
|
.addAggregation(terms("terms").field("value").order(Order.compound(Order.aggregation("filter>min", true)))
|
||||||
|
.subAggregation(filter("filter", termQuery("value", 100)).subAggregation(min("min").field("value"))))
|
||||||
|
.get();
|
||||||
|
|
||||||
|
assertHitCount(searchResponse, 10);
|
||||||
|
|
||||||
|
Terms terms = searchResponse.getAggregations().get("terms");
|
||||||
|
assertThat(terms, notNullValue());
|
||||||
|
List<Terms.Bucket> buckets = terms.getBuckets();
|
||||||
|
assertThat(buckets, notNullValue());
|
||||||
|
assertThat(buckets.size(), equalTo(10));
|
||||||
|
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
Terms.Bucket bucket = buckets.get(i);
|
||||||
|
assertThat(bucket, notNullValue());
|
||||||
|
assertThat(bucket.getKeyAsNumber(), equalTo((long) i + 1));
|
||||||
|
assertThat(bucket.getDocCount(), equalTo(1L));
|
||||||
|
Filter filter = bucket.getAggregations().get("filter");
|
||||||
|
assertThat(filter, notNullValue());
|
||||||
|
assertThat(filter.getDocCount(), equalTo(0L));
|
||||||
|
Min min = filter.getAggregations().get("min");
|
||||||
|
assertThat(min, notNullValue());
|
||||||
|
assertThat(min.value(), equalTo(Double.POSITIVE_INFINITY));
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -24,20 +24,27 @@ import org.elasticsearch.plugins.Plugin;
|
||||||
import org.elasticsearch.script.Script;
|
import org.elasticsearch.script.Script;
|
||||||
import org.elasticsearch.script.ScriptService.ScriptType;
|
import org.elasticsearch.script.ScriptService.ScriptType;
|
||||||
import org.elasticsearch.script.groovy.GroovyPlugin;
|
import org.elasticsearch.script.groovy.GroovyPlugin;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.filter.Filter;
|
||||||
import org.elasticsearch.search.aggregations.bucket.global.Global;
|
import org.elasticsearch.search.aggregations.bucket.global.Global;
|
||||||
import org.elasticsearch.search.aggregations.bucket.histogram.Histogram;
|
import org.elasticsearch.search.aggregations.bucket.histogram.Histogram;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.terms.Terms.Order;
|
||||||
import org.elasticsearch.search.aggregations.metrics.AbstractNumericTestCase;
|
import org.elasticsearch.search.aggregations.metrics.AbstractNumericTestCase;
|
||||||
import org.elasticsearch.search.aggregations.metrics.stats.Stats;
|
import org.elasticsearch.search.aggregations.metrics.stats.Stats;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
|
import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
|
||||||
|
import static org.elasticsearch.index.query.QueryBuilders.termQuery;
|
||||||
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.filter;
|
||||||
import static org.elasticsearch.search.aggregations.AggregationBuilders.global;
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.global;
|
||||||
import static org.elasticsearch.search.aggregations.AggregationBuilders.histogram;
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.histogram;
|
||||||
import static org.elasticsearch.search.aggregations.AggregationBuilders.stats;
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.stats;
|
||||||
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.terms;
|
||||||
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertHitCount;
|
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertHitCount;
|
||||||
import static org.hamcrest.Matchers.equalTo;
|
import static org.hamcrest.Matchers.equalTo;
|
||||||
import static org.hamcrest.Matchers.is;
|
import static org.hamcrest.Matchers.is;
|
||||||
|
@ -399,6 +406,39 @@ public class StatsTests extends AbstractNumericTestCase {
|
||||||
assertThat(stats.getCount(), equalTo(20L));
|
assertThat(stats.getCount(), equalTo(20L));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void testOrderByEmptyAggregation() throws Exception {
|
||||||
|
SearchResponse searchResponse = client().prepareSearch("idx").setQuery(matchAllQuery())
|
||||||
|
.addAggregation(terms("terms").field("value").order(Order.compound(Order.aggregation("filter>stats.avg", true)))
|
||||||
|
.subAggregation(filter("filter", termQuery("value", 100)).subAggregation(stats("stats").field("value"))))
|
||||||
|
.get();
|
||||||
|
|
||||||
|
assertHitCount(searchResponse, 10);
|
||||||
|
|
||||||
|
Terms terms = searchResponse.getAggregations().get("terms");
|
||||||
|
assertThat(terms, notNullValue());
|
||||||
|
List<Terms.Bucket> buckets = terms.getBuckets();
|
||||||
|
assertThat(buckets, notNullValue());
|
||||||
|
assertThat(buckets.size(), equalTo(10));
|
||||||
|
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
Terms.Bucket bucket = buckets.get(i);
|
||||||
|
assertThat(bucket, notNullValue());
|
||||||
|
assertThat(bucket.getKeyAsNumber(), equalTo((long) i + 1));
|
||||||
|
assertThat(bucket.getDocCount(), equalTo(1L));
|
||||||
|
Filter filter = bucket.getAggregations().get("filter");
|
||||||
|
assertThat(filter, notNullValue());
|
||||||
|
assertThat(filter.getDocCount(), equalTo(0L));
|
||||||
|
Stats stats = filter.getAggregations().get("stats");
|
||||||
|
assertThat(stats, notNullValue());
|
||||||
|
assertThat(stats.getMin(), equalTo(Double.POSITIVE_INFINITY));
|
||||||
|
assertThat(stats.getMax(), equalTo(Double.NEGATIVE_INFINITY));
|
||||||
|
assertThat(stats.getAvg(), equalTo(Double.NaN));
|
||||||
|
assertThat(stats.getSum(), equalTo(0.0));
|
||||||
|
assertThat(stats.getCount(), equalTo(0L));
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void assertShardExecutionState(SearchResponse response, int expectedFailures) throws Exception {
|
private void assertShardExecutionState(SearchResponse response, int expectedFailures) throws Exception {
|
||||||
ShardSearchFailure[] failures = response.getShardFailures();
|
ShardSearchFailure[] failures = response.getShardFailures();
|
||||||
|
|
|
@ -25,13 +25,16 @@ import org.elasticsearch.plugins.Plugin;
|
||||||
import org.elasticsearch.script.Script;
|
import org.elasticsearch.script.Script;
|
||||||
import org.elasticsearch.script.ScriptService.ScriptType;
|
import org.elasticsearch.script.ScriptService.ScriptType;
|
||||||
import org.elasticsearch.script.groovy.GroovyPlugin;
|
import org.elasticsearch.script.groovy.GroovyPlugin;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.filter.Filter;
|
||||||
import org.elasticsearch.search.aggregations.bucket.global.Global;
|
import org.elasticsearch.search.aggregations.bucket.global.Global;
|
||||||
import org.elasticsearch.search.aggregations.bucket.histogram.Histogram;
|
import org.elasticsearch.search.aggregations.bucket.histogram.Histogram;
|
||||||
import org.elasticsearch.search.aggregations.bucket.histogram.Histogram.Order;
|
import org.elasticsearch.search.aggregations.bucket.histogram.Histogram.Order;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
|
||||||
import org.elasticsearch.search.aggregations.metrics.AbstractNumericTestCase;
|
import org.elasticsearch.search.aggregations.metrics.AbstractNumericTestCase;
|
||||||
import org.elasticsearch.search.aggregations.metrics.percentiles.Percentile;
|
import org.elasticsearch.search.aggregations.metrics.percentiles.Percentile;
|
||||||
import org.elasticsearch.search.aggregations.metrics.percentiles.PercentileRanks;
|
import org.elasticsearch.search.aggregations.metrics.percentiles.PercentileRanks;
|
||||||
import org.elasticsearch.search.aggregations.metrics.percentiles.PercentileRanksAggregatorBuilder;
|
import org.elasticsearch.search.aggregations.metrics.percentiles.PercentileRanksAggregatorBuilder;
|
||||||
|
import org.elasticsearch.search.aggregations.metrics.percentiles.PercentilesMethod;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
@ -41,9 +44,12 @@ import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
|
import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
|
||||||
|
import static org.elasticsearch.index.query.QueryBuilders.termQuery;
|
||||||
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.filter;
|
||||||
import static org.elasticsearch.search.aggregations.AggregationBuilders.global;
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.global;
|
||||||
import static org.elasticsearch.search.aggregations.AggregationBuilders.histogram;
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.histogram;
|
||||||
import static org.elasticsearch.search.aggregations.AggregationBuilders.percentileRanks;
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.percentileRanks;
|
||||||
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.terms;
|
||||||
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertHitCount;
|
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertHitCount;
|
||||||
import static org.hamcrest.Matchers.equalTo;
|
import static org.hamcrest.Matchers.equalTo;
|
||||||
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
|
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
|
||||||
|
@ -425,4 +431,35 @@ public class TDigestPercentileRanksTests extends AbstractNumericTestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void testOrderByEmptyAggregation() throws Exception {
|
||||||
|
SearchResponse searchResponse = client().prepareSearch("idx").setQuery(matchAllQuery())
|
||||||
|
.addAggregation(terms("terms").field("value").order(Terms.Order.compound(Terms.Order.aggregation("filter>ranks.99", true)))
|
||||||
|
.subAggregation(filter("filter", termQuery("value", 100))
|
||||||
|
.subAggregation(percentileRanks("ranks").method(PercentilesMethod.TDIGEST).values(99).field("value"))))
|
||||||
|
.get();
|
||||||
|
|
||||||
|
assertHitCount(searchResponse, 10);
|
||||||
|
|
||||||
|
Terms terms = searchResponse.getAggregations().get("terms");
|
||||||
|
assertThat(terms, notNullValue());
|
||||||
|
List<Terms.Bucket> buckets = terms.getBuckets();
|
||||||
|
assertThat(buckets, notNullValue());
|
||||||
|
assertThat(buckets.size(), equalTo(10));
|
||||||
|
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
Terms.Bucket bucket = buckets.get(i);
|
||||||
|
assertThat(bucket, notNullValue());
|
||||||
|
assertThat(bucket.getKeyAsNumber(), equalTo((long) i + 1));
|
||||||
|
assertThat(bucket.getDocCount(), equalTo(1L));
|
||||||
|
Filter filter = bucket.getAggregations().get("filter");
|
||||||
|
assertThat(filter, notNullValue());
|
||||||
|
assertThat(filter.getDocCount(), equalTo(0L));
|
||||||
|
PercentileRanks ranks = filter.getAggregations().get("ranks");
|
||||||
|
assertThat(ranks, notNullValue());
|
||||||
|
assertThat(ranks.percent(99), equalTo(Double.NaN));
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -25,13 +25,17 @@ import org.elasticsearch.plugins.Plugin;
|
||||||
import org.elasticsearch.script.Script;
|
import org.elasticsearch.script.Script;
|
||||||
import org.elasticsearch.script.ScriptService.ScriptType;
|
import org.elasticsearch.script.ScriptService.ScriptType;
|
||||||
import org.elasticsearch.script.groovy.GroovyPlugin;
|
import org.elasticsearch.script.groovy.GroovyPlugin;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.filter.Filter;
|
||||||
import org.elasticsearch.search.aggregations.bucket.global.Global;
|
import org.elasticsearch.search.aggregations.bucket.global.Global;
|
||||||
import org.elasticsearch.search.aggregations.bucket.histogram.Histogram;
|
import org.elasticsearch.search.aggregations.bucket.histogram.Histogram;
|
||||||
import org.elasticsearch.search.aggregations.bucket.histogram.Histogram.Order;
|
import org.elasticsearch.search.aggregations.bucket.histogram.Histogram.Order;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
|
||||||
import org.elasticsearch.search.aggregations.metrics.AbstractNumericTestCase;
|
import org.elasticsearch.search.aggregations.metrics.AbstractNumericTestCase;
|
||||||
import org.elasticsearch.search.aggregations.metrics.percentiles.Percentile;
|
import org.elasticsearch.search.aggregations.metrics.percentiles.Percentile;
|
||||||
import org.elasticsearch.search.aggregations.metrics.percentiles.Percentiles;
|
import org.elasticsearch.search.aggregations.metrics.percentiles.Percentiles;
|
||||||
import org.elasticsearch.search.aggregations.metrics.percentiles.PercentilesAggregatorBuilder;
|
import org.elasticsearch.search.aggregations.metrics.percentiles.PercentilesAggregatorBuilder;
|
||||||
|
import org.elasticsearch.search.aggregations.metrics.percentiles.PercentilesMethod;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
@ -40,9 +44,12 @@ import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
|
import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
|
||||||
|
import static org.elasticsearch.index.query.QueryBuilders.termQuery;
|
||||||
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.filter;
|
||||||
import static org.elasticsearch.search.aggregations.AggregationBuilders.global;
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.global;
|
||||||
import static org.elasticsearch.search.aggregations.AggregationBuilders.histogram;
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.histogram;
|
||||||
import static org.elasticsearch.search.aggregations.AggregationBuilders.percentiles;
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.percentiles;
|
||||||
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.terms;
|
||||||
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertHitCount;
|
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertHitCount;
|
||||||
import static org.hamcrest.Matchers.equalTo;
|
import static org.hamcrest.Matchers.equalTo;
|
||||||
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
|
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
|
||||||
|
@ -407,4 +414,36 @@ public class TDigestPercentilesTests extends AbstractNumericTestCase {
|
||||||
previous = p99;
|
previous = p99;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void testOrderByEmptyAggregation() throws Exception {
|
||||||
|
SearchResponse searchResponse = client().prepareSearch("idx").setQuery(matchAllQuery())
|
||||||
|
.addAggregation(
|
||||||
|
terms("terms").field("value").order(Terms.Order.compound(Terms.Order.aggregation("filter>percentiles.99", true)))
|
||||||
|
.subAggregation(filter("filter", termQuery("value", 100))
|
||||||
|
.subAggregation(percentiles("percentiles").method(PercentilesMethod.TDIGEST).field("value"))))
|
||||||
|
.get();
|
||||||
|
|
||||||
|
assertHitCount(searchResponse, 10);
|
||||||
|
|
||||||
|
Terms terms = searchResponse.getAggregations().get("terms");
|
||||||
|
assertThat(terms, notNullValue());
|
||||||
|
List<Terms.Bucket> buckets = terms.getBuckets();
|
||||||
|
assertThat(buckets, notNullValue());
|
||||||
|
assertThat(buckets.size(), equalTo(10));
|
||||||
|
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
Terms.Bucket bucket = buckets.get(i);
|
||||||
|
assertThat(bucket, notNullValue());
|
||||||
|
assertThat(bucket.getKeyAsNumber(), equalTo((long) i + 1));
|
||||||
|
assertThat(bucket.getDocCount(), equalTo(1L));
|
||||||
|
Filter filter = bucket.getAggregations().get("filter");
|
||||||
|
assertThat(filter, notNullValue());
|
||||||
|
assertThat(filter.getDocCount(), equalTo(0L));
|
||||||
|
Percentiles percentiles = filter.getAggregations().get("percentiles");
|
||||||
|
assertThat(percentiles, notNullValue());
|
||||||
|
assertThat(percentiles.percentile(99), equalTo(Double.NaN));
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -97,4 +97,6 @@ public abstract class AbstractNumericTestCase extends ESIntegTestCase {
|
||||||
public abstract void testScriptMultiValued() throws Exception;
|
public abstract void testScriptMultiValued() throws Exception;
|
||||||
|
|
||||||
public abstract void testScriptMultiValuedWithParams() throws Exception;
|
public abstract void testScriptMultiValuedWithParams() throws Exception;
|
||||||
|
|
||||||
|
public abstract void testOrderByEmptyAggregation() throws Exception;
|
||||||
}
|
}
|
Loading…
Reference in New Issue