Elasticsearch: Support extended stats and percentiles in terms order by (#28910)

Adds support to the terms aggregation for ordering by percentiles and extended stats. 

Closes #5148

Co-authored-by: Giordano Ricci <grdnricci@gmail.com>
Co-authored-by: Marcus Efraimsson <marcus.efraimsson@gmail.com>
This commit is contained in:
Chris Cowan
2021-01-15 04:10:16 -07:00
committed by GitHub
parent b32c4f34cd
commit 5088e2044a
10 changed files with 4516 additions and 99 deletions

View File

@@ -12,6 +12,7 @@ import {
} from './components/QueryEditor/MetricAggregationsEditor/aggregations';
import { defaultBucketAgg, defaultMetricAgg, findMetricById } from './query_def';
import { ElasticsearchQuery } from './types';
import { convertOrderByToMetricId } from './utils';
export class ElasticQueryBuilder {
timeField: string;
@@ -34,7 +35,6 @@ export class ElasticQueryBuilder {
}
buildTermsAgg(aggDef: Terms, queryNode: { terms?: any; aggs?: any }, target: ElasticsearchQuery) {
let metricRef;
queryNode.terms = { field: aggDef.field };
if (!aggDef.settings) {
@@ -54,14 +54,17 @@ export class ElasticQueryBuilder {
}
// if metric ref, look it up and add it to this agg level
metricRef = parseInt(aggDef.settings.orderBy, 10);
if (!isNaN(metricRef)) {
const metricId = convertOrderByToMetricId(aggDef.settings.orderBy);
if (metricId) {
for (let metric of target.metrics || []) {
if (metric.id === aggDef.settings.orderBy) {
queryNode.aggs = {};
queryNode.aggs[metric.id] = {};
if (isMetricAggregationWithField(metric)) {
queryNode.aggs[metric.id][metric.type] = { field: metric.field };
if (metric.id === metricId) {
if (metric.type === 'count') {
queryNode.terms.order = { _count: aggDef.settings.order };
} else if (isMetricAggregationWithField(metric)) {
queryNode.aggs = {};
queryNode.aggs[metric.id] = {
[metric.type]: { field: metric.field },
};
}
break;
}