diff --git a/src/plugins/data/common/search/aggs/agg_type.ts b/src/plugins/data/common/search/aggs/agg_type.ts index 7931ce1f59577..4583be17478e3 100644 --- a/src/plugins/data/common/search/aggs/agg_type.ts +++ b/src/plugins/data/common/search/aggs/agg_type.ts @@ -10,7 +10,7 @@ import { constant, noop, identity } from 'lodash'; import { i18n } from '@kbn/i18n'; import { ISearchSource } from 'src/plugins/data/public'; -import { SerializedFieldFormat } from 'src/plugins/expressions/common'; +import { DatatableColumnType, SerializedFieldFormat } from 'src/plugins/expressions/common'; import type { RequestAdapter } from 'src/plugins/inspector/common'; import { initParams } from './agg_params'; @@ -33,6 +33,7 @@ export interface AggTypeConfig< ordered?: any; hasNoDsl?: boolean; params?: Array>; + valueType?: DatatableColumnType; getRequestAggs?: ((aggConfig: TAggConfig) => TAggConfig[]) | (() => TAggConfig[] | void); getResponseAggs?: ((aggConfig: TAggConfig) => TAggConfig[]) | (() => TAggConfig[] | void); customLabels?: boolean; @@ -91,6 +92,11 @@ export class AggType< * @type {string} */ title: string; + /** + * The type the values produced by this agg will have in the final data table. + * If not specified, the type of the field is used. + */ + valueType?: DatatableColumnType; /** * a function that will be called when this aggType is assigned to * an aggConfig, and that aggConfig is being rendered (in a form, chart, etc.). @@ -222,6 +228,7 @@ export class AggType< this.dslName = config.dslName || config.name; this.expressionName = config.expressionName; this.title = config.title; + this.valueType = config.valueType; this.makeLabel = config.makeLabel || constant(this.name); this.ordered = config.ordered; this.hasNoDsl = !!config.hasNoDsl; diff --git a/src/plugins/data/common/search/aggs/metrics/cardinality.ts b/src/plugins/data/common/search/aggs/metrics/cardinality.ts index 38dd5893eb8ad..5a18924902fc3 100644 --- a/src/plugins/data/common/search/aggs/metrics/cardinality.ts +++ b/src/plugins/data/common/search/aggs/metrics/cardinality.ts @@ -24,6 +24,7 @@ export interface AggParamsCardinality extends BaseAggParams { export const getCardinalityMetricAgg = () => new MetricAggType({ name: METRIC_TYPES.CARDINALITY, + valueType: 'number', expressionName: aggCardinalityFnName, title: uniqueCountTitle, makeLabel(aggConfig: IMetricAggConfig) { diff --git a/src/plugins/data/common/search/tabify/response_writer.test.ts b/src/plugins/data/common/search/tabify/response_writer.test.ts index 6cec6d431ab70..603ccc0f493c7 100644 --- a/src/plugins/data/common/search/tabify/response_writer.test.ts +++ b/src/plugins/data/common/search/tabify/response_writer.test.ts @@ -7,7 +7,7 @@ */ import { TabbedAggResponseWriter } from './response_writer'; -import { AggConfigs, BUCKET_TYPES } from '../aggs'; +import { AggConfigs, BUCKET_TYPES, METRIC_TYPES } from '../aggs'; import { mockAggTypesRegistry } from '../aggs/test_helpers'; import { TabbedResponseWriterOptions } from './types'; @@ -23,7 +23,12 @@ describe('TabbedAggResponseWriter class', () => { field: 'geo.src', }, }, - { type: 'count' }, + { + type: METRIC_TYPES.CARDINALITY, + params: { + field: 'machine.os.raw', + }, + }, ]; const twoSplitsAggConfig = [ @@ -39,7 +44,12 @@ describe('TabbedAggResponseWriter class', () => { field: 'machine.os.raw', }, }, - { type: 'count' }, + { + type: METRIC_TYPES.CARDINALITY, + params: { + field: 'machine.os.raw', + }, + }, ]; const createResponseWritter = (aggs: any[] = [], opts?: Partial) => { @@ -174,19 +184,23 @@ describe('TabbedAggResponseWriter class', () => { }); expect(response.columns[1]).toHaveProperty('id', 'col-1-2'); - expect(response.columns[1]).toHaveProperty('name', 'Count'); + expect(response.columns[1]).toHaveProperty('name', 'Unique count of machine.os.raw'); expect(response.columns[1]).toHaveProperty('meta', { index: 'logstash-*', + field: 'machine.os.raw', params: { id: 'number', }, source: 'esaggs', sourceParams: { + appliedTimeRange: undefined, enabled: true, id: '2', indexPatternId: '1234', - params: {}, - type: 'count', + params: { + field: 'machine.os.raw', + }, + type: 'cardinality', }, type: 'number', }); @@ -231,19 +245,23 @@ describe('TabbedAggResponseWriter class', () => { }); expect(response.columns[1]).toHaveProperty('id', 'col-1-2'); - expect(response.columns[1]).toHaveProperty('name', 'Count'); + expect(response.columns[1]).toHaveProperty('name', 'Unique count of machine.os.raw'); expect(response.columns[1]).toHaveProperty('meta', { index: 'logstash-*', + field: 'machine.os.raw', params: { id: 'number', }, source: 'esaggs', sourceParams: { + appliedTimeRange: undefined, enabled: true, id: '2', indexPatternId: '1234', - params: {}, - type: 'count', + params: { + field: 'machine.os.raw', + }, + type: 'cardinality', }, type: 'number', }); diff --git a/src/plugins/data/common/search/tabify/response_writer.ts b/src/plugins/data/common/search/tabify/response_writer.ts index 1c312e5cd2200..a0ba07598e53a 100644 --- a/src/plugins/data/common/search/tabify/response_writer.ts +++ b/src/plugins/data/common/search/tabify/response_writer.ts @@ -73,7 +73,8 @@ export class TabbedAggResponseWriter { id: column.id, name: column.name, meta: { - type: column.aggConfig.params.field?.type || 'number', + type: + column.aggConfig.type.valueType || column.aggConfig.params.field?.type || 'number', field: column.aggConfig.params.field?.name, index: column.aggConfig.getIndexPattern()?.title, params: column.aggConfig.toSerializedFieldFormat(), diff --git a/src/plugins/data/public/public.api.md b/src/plugins/data/public/public.api.md index 03ae893ab526d..782f6f45eadc7 100644 --- a/src/plugins/data/public/public.api.md +++ b/src/plugins/data/public/public.api.md @@ -24,6 +24,7 @@ import * as CSS from 'csstype'; import { Datatable as Datatable_2 } from 'src/plugins/expressions'; import { Datatable as Datatable_3 } from 'src/plugins/expressions/common'; import { DatatableColumn as DatatableColumn_2 } from 'src/plugins/expressions'; +import { DatatableColumnType } from 'src/plugins/expressions/common'; import { DetailedPeerCertificate } from 'tls'; import { Ensure } from '@kbn/utility-types'; import { EnvironmentMode } from '@kbn/config'; diff --git a/src/plugins/data/server/server.api.md b/src/plugins/data/server/server.api.md index 3951bb0c7ed75..d579663eeca43 100644 --- a/src/plugins/data/server/server.api.md +++ b/src/plugins/data/server/server.api.md @@ -18,6 +18,7 @@ import { CoreStart as CoreStart_2 } from 'src/core/server'; import { Datatable } from 'src/plugins/expressions'; import { Datatable as Datatable_2 } from 'src/plugins/expressions/common'; import { DatatableColumn } from 'src/plugins/expressions'; +import { DatatableColumnType } from 'src/plugins/expressions/common'; import { Duration } from 'moment'; import { ElasticsearchClient } from 'src/core/server'; import { ElasticsearchClient as ElasticsearchClient_2 } from 'kibana/server';