From 62d1d159d9f77d1e0297b7eae5bea2628f003d7c Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Tue, 4 Oct 2022 12:01:55 +0300 Subject: [PATCH 01/43] Added support of metric. --- .../metric_vis_function.ts | 1 + .../common/types/expression_functions.ts | 1 + .../metric_vis_renderer.tsx | 9 +- src/plugins/vis_types/metric/kibana.json | 15 +++- .../convert_to_lens/configurations/index.ts | 38 ++++++++ .../convert_to_lens/configurations/palette.ts | 65 ++++++++++++++ .../metric/public/convert_to_lens/index.ts | 88 +++++++++++++++++++ .../metric/public/convert_to_lens/types.ts | 17 ++++ .../metric/public/metric_vis_type.ts | 7 ++ src/plugins/vis_types/metric/public/plugin.ts | 15 +++- .../vis_types/metric/public/services.ts | 13 +++ 11 files changed, 261 insertions(+), 8 deletions(-) create mode 100644 src/plugins/vis_types/metric/public/convert_to_lens/configurations/index.ts create mode 100644 src/plugins/vis_types/metric/public/convert_to_lens/configurations/palette.ts create mode 100644 src/plugins/vis_types/metric/public/convert_to_lens/index.ts create mode 100644 src/plugins/vis_types/metric/public/convert_to_lens/types.ts create mode 100644 src/plugins/vis_types/metric/public/services.ts diff --git a/src/plugins/chart_expressions/expression_legacy_metric/common/expression_functions/metric_vis_function.ts b/src/plugins/chart_expressions/expression_legacy_metric/common/expression_functions/metric_vis_function.ts index 8ec638d139bff..a7d655107fc2d 100644 --- a/src/plugins/chart_expressions/expression_legacy_metric/common/expression_functions/metric_vis_function.ts +++ b/src/plugins/chart_expressions/expression_legacy_metric/common/expression_functions/metric_vis_function.ts @@ -200,6 +200,7 @@ export const metricVisFunction = (): MetricVisExpressionFunctionDefinition => ({ ...(args.bucket ? { bucket: args.bucket } : {}), }, }, + canNavigateToLens: Boolean(handlers?.variables?.canNavigateToLens), }, }; }, diff --git a/src/plugins/chart_expressions/expression_legacy_metric/common/types/expression_functions.ts b/src/plugins/chart_expressions/expression_legacy_metric/common/types/expression_functions.ts index 0c7c0331975e8..f0a63b012dc0a 100644 --- a/src/plugins/chart_expressions/expression_legacy_metric/common/types/expression_functions.ts +++ b/src/plugins/chart_expressions/expression_legacy_metric/common/types/expression_functions.ts @@ -38,6 +38,7 @@ export interface MetricVisRenderConfig { visType: typeof visType; visData: Datatable; visConfig: Pick; + canNavigateToLens: boolean; } export type MetricVisExpressionFunctionDefinition = ExpressionFunctionDefinition< diff --git a/src/plugins/chart_expressions/expression_legacy_metric/public/expression_renderers/metric_vis_renderer.tsx b/src/plugins/chart_expressions/expression_legacy_metric/public/expression_renderers/metric_vis_renderer.tsx index 798bc62938ca1..456a7f9cbf8a4 100644 --- a/src/plugins/chart_expressions/expression_legacy_metric/public/expression_renderers/metric_vis_renderer.tsx +++ b/src/plugins/chart_expressions/expression_legacy_metric/public/expression_renderers/metric_vis_renderer.tsx @@ -67,7 +67,7 @@ export const getMetricVisRenderer: ( name: EXPRESSION_METRIC_NAME, displayName: 'metric visualization', reuseDomNode: true, - render: async (domNode, { visData, visConfig }, handlers) => { + render: async (domNode, { visData, visConfig, canNavigateToLens }, handlers) => { const { core, plugins } = getStartDeps(); handlers.onDestroy(() => { @@ -82,9 +82,12 @@ export const getMetricVisRenderer: ( const visualizationType = extractVisualizationType(executionContext); if (containerType && visualizationType) { - plugins.usageCollection?.reportUiCounter(containerType, METRIC_TYPE.COUNT, [ + const events = [ `render_${visualizationType}_legacy_metric`, - ]); + canNavigateToLens ? `render_${visualizationType}_legacy_metric_convertable` : undefined, + ].filter((event): event is string => Boolean(event)); + + plugins.usageCollection?.reportUiCounter(containerType, METRIC_TYPE.COUNT, events); } handlers.done(); diff --git a/src/plugins/vis_types/metric/kibana.json b/src/plugins/vis_types/metric/kibana.json index ab69f78430338..4d8f776d2a0bb 100644 --- a/src/plugins/vis_types/metric/kibana.json +++ b/src/plugins/vis_types/metric/kibana.json @@ -4,11 +4,20 @@ "kibanaVersion": "kibana", "server": true, "ui": true, - "requiredPlugins": ["data", "visualizations", "charts", "expressions"], - "requiredBundles": ["visDefaultEditor"], + "requiredPlugins": [ + "data", + "visualizations", + "charts", + "expressions", + "dataViews" + ], + "requiredBundles": [ + "visDefaultEditor", + "kibanaUtils" + ], "owner": { "name": "Vis Editors", "githubTeam": "kibana-vis-editors" }, "description": "Registers the Metric aggregation-based visualization." -} +} \ No newline at end of file diff --git a/src/plugins/vis_types/metric/public/convert_to_lens/configurations/index.ts b/src/plugins/vis_types/metric/public/convert_to_lens/configurations/index.ts new file mode 100644 index 0000000000000..9303be0c25d3d --- /dev/null +++ b/src/plugins/vis_types/metric/public/convert_to_lens/configurations/index.ts @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { Column, MetricVisConfiguration } from '@kbn/visualizations-plugin/common'; +import { VisParams } from '../../types'; +import { getPalette } from './palette'; + +export const getConfiguration = ( + layerId: string, + params: VisParams, + { + metrics, + buckets, + columnsWithoutReferenced, + bucketCollapseFn, + }: { + metrics: string[]; + buckets: string[]; + columnsWithoutReferenced: Column[]; + bucketCollapseFn?: Record; + } +): MetricVisConfiguration => { + const [metricAccessor] = metrics; + const [breakdownByAccessor] = buckets; + return { + layerId, + layerType: 'data', + palette: getPalette(params), + metricAccessor, + breakdownByAccessor, + collapseFn: Object.values(bucketCollapseFn ?? {})[0], + }; +}; diff --git a/src/plugins/vis_types/metric/public/convert_to_lens/configurations/palette.ts b/src/plugins/vis_types/metric/public/convert_to_lens/configurations/palette.ts new file mode 100644 index 0000000000000..360de60199efa --- /dev/null +++ b/src/plugins/vis_types/metric/public/convert_to_lens/configurations/palette.ts @@ -0,0 +1,65 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import color from 'color'; +import { CustomPaletteParams, PaletteOutput } from '@kbn/coloring'; +import { VisParams } from '../../types'; +import { getStopsWithColorsFromRanges } from '../../utils'; +import { PaletteConfig } from '../../utils/palette'; + +type ColorStopsWithMinMax = Pick< + CustomPaletteParams, + 'colorStops' | 'stops' | 'steps' | 'rangeMax' | 'rangeMin' | 'continuity' +>; + +const buildPaletteParams = ({ color: colors, stop }: PaletteConfig): ColorStopsWithMinMax => { + const colorsWithoutStartColor = colors.slice(1, colors.length); + return { + rangeMin: stop[0], + rangeMax: stop[stop.length - 1], + continuity: 'none', + colorStops: colorsWithoutStartColor.map((c, index) => ({ + color: color(c!).hex(), + stop: stop[index], + })), + stops: colorsWithoutStartColor.map((c, index) => ({ + color: color(c!).hex(), + stop: stop[index + 1], + })), + }; +}; + +const buildCustomPalette = ( + colorStopsWithMinMax: ColorStopsWithMinMax +): PaletteOutput => { + return { + name: 'custom', + params: { + maxSteps: 5, + name: 'custom', + progression: 'fixed', + rangeMax: Infinity, + rangeMin: -Infinity, + rangeType: 'number', + reverse: false, + ...colorStopsWithMinMax, + }, + type: 'palette', + }; +}; + +export const getPalette = (params: VisParams): PaletteOutput | undefined => { + const { colorSchema, colorsRange, invertColors, metricColorMode } = params.metric; + + if (metricColorMode === 'None' || !(colorsRange && colorsRange.length)) { + return; + } + + const stopsWithColors = getStopsWithColorsFromRanges(colorsRange, colorSchema, invertColors); + return buildCustomPalette(buildPaletteParams(stopsWithColors)); +}; diff --git a/src/plugins/vis_types/metric/public/convert_to_lens/index.ts b/src/plugins/vis_types/metric/public/convert_to_lens/index.ts new file mode 100644 index 0000000000000..23c19f8fffc72 --- /dev/null +++ b/src/plugins/vis_types/metric/public/convert_to_lens/index.ts @@ -0,0 +1,88 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { Column, ColumnWithMeta } from '@kbn/visualizations-plugin/common'; +import { + convertToLensModule, + getDataViewByIndexPatternId, +} from '@kbn/visualizations-plugin/public'; +import uuid from 'uuid'; +import { getDataViewsStart } from '../services'; +import { getConfiguration } from './configurations'; +import { ConvertMetricVisToLensVisualization } from './types'; + +export const isColumnWithMeta = (column: Column): column is ColumnWithMeta => { + if ((column as ColumnWithMeta).meta) { + return true; + } + return false; +}; + +export const excludeMetaFromColumn = (column: Column) => { + if (isColumnWithMeta(column)) { + const { meta, ...rest } = column; + return rest; + } + return column; +}; + +export const convertToLens: ConvertMetricVisToLensVisualization = async (vis, timefilter) => { + if (!timefilter) { + return null; + } + + const dataViews = getDataViewsStart(); + const dataView = await getDataViewByIndexPatternId(vis.data.indexPattern?.id, dataViews); + + if (!dataView) { + return null; + } + + const { getColumnsFromVis } = await convertToLensModule; + const result = getColumnsFromVis( + vis, + timefilter, + dataView, + { + splits: ['group'], + }, + { dropEmptyRowsInDateHistogram: true } + ); + + if (result === null) { + return null; + } + + // for now, multiple metrics are not supported + if (result.metrics.length > 1 || result.buckets.length > 1) { + return null; + } + + if (result.metrics[0]) { + const metric = result.columns.find(({ columnId }) => columnId === result.metrics[0]); + if (metric?.dataType !== 'number') { + return null; + } + } + const layerId = uuid(); + const indexPatternId = dataView.id!; + + return { + type: 'lnsMetric', + layers: [ + { + indexPatternId, + layerId, + columns: result.columns.map(excludeMetaFromColumn), + columnOrder: [], + }, + ], + configuration: getConfiguration(layerId, vis.params, result), + indexPatternIds: [indexPatternId], + }; +}; diff --git a/src/plugins/vis_types/metric/public/convert_to_lens/types.ts b/src/plugins/vis_types/metric/public/convert_to_lens/types.ts new file mode 100644 index 0000000000000..3676c9dee8d9d --- /dev/null +++ b/src/plugins/vis_types/metric/public/convert_to_lens/types.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { TimefilterContract } from '@kbn/data-plugin/public'; +import { NavigateToLensContext, MetricVisConfiguration } from '@kbn/visualizations-plugin/common'; +import { Vis } from '@kbn/visualizations-plugin/public'; +import { VisParams } from '../types'; + +export type ConvertMetricVisToLensVisualization = ( + vis: Vis, + timefilter?: TimefilterContract +) => Promise | null>; diff --git a/src/plugins/vis_types/metric/public/metric_vis_type.ts b/src/plugins/vis_types/metric/public/metric_vis_type.ts index 30e13e8605b6d..b39cde5e07fc4 100644 --- a/src/plugins/vis_types/metric/public/metric_vis_type.ts +++ b/src/plugins/vis_types/metric/public/metric_vis_type.ts @@ -13,6 +13,7 @@ import { AggGroupNames } from '@kbn/data-plugin/public'; import { MetricVisOptions } from './components'; import { toExpressionAst } from './to_ast'; import { VisParams } from './types'; +import { convertToLens } from './convert_to_lens'; export const createMetricVisTypeDefinition = (): VisTypeDefinition => ({ name: 'metric', @@ -103,4 +104,10 @@ export const createMetricVisTypeDefinition = (): VisTypeDefinition => ], }, requiresSearch: true, + navigateToLens: async (vis, timefilter) => (vis ? convertToLens(vis, timefilter) : null), + getExpressionVariables: async (vis, timeFilter) => { + return { + canNavigateToLens: Boolean(vis?.params ? await convertToLens(vis, timeFilter) : null), + }; + }, }); diff --git a/src/plugins/vis_types/metric/public/plugin.ts b/src/plugins/vis_types/metric/public/plugin.ts index 9e79d1d23efda..bf8b8af0bddda 100644 --- a/src/plugins/vis_types/metric/public/plugin.ts +++ b/src/plugins/vis_types/metric/public/plugin.ts @@ -8,8 +8,10 @@ import { PluginInitializerContext, CoreSetup, CoreStart, Plugin } from '@kbn/core/public'; import { VisualizationsSetup } from '@kbn/visualizations-plugin/public'; +import { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; import { createMetricVisTypeDefinition } from './metric_vis_type'; import { ConfigSchema } from '../config'; +import { setDataViewsStart } from './services'; /** @internal */ export interface MetricVisPluginSetupDependencies { @@ -17,7 +19,14 @@ export interface MetricVisPluginSetupDependencies { } /** @internal */ -export class MetricVisPlugin implements Plugin { +export interface MetricVisPluginStartDependencies { + dataViews: DataViewsPublicPluginStart; +} + +/** @internal */ +export class MetricVisPlugin + implements Plugin +{ initializerContext: PluginInitializerContext; constructor(initializerContext: PluginInitializerContext) { @@ -28,5 +37,7 @@ export class MetricVisPlugin implements Plugin { visualizations.createBaseVisualization(createMetricVisTypeDefinition()); } - public start(core: CoreStart) {} + public start(core: CoreStart, { dataViews }: MetricVisPluginStartDependencies) { + setDataViewsStart(dataViews); + } } diff --git a/src/plugins/vis_types/metric/public/services.ts b/src/plugins/vis_types/metric/public/services.ts new file mode 100644 index 0000000000000..736ad70d49419 --- /dev/null +++ b/src/plugins/vis_types/metric/public/services.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { createGetterSetter } from '@kbn/kibana-utils-plugin/public'; +import { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; + +export const [getDataViewsStart, setDataViewsStart] = + createGetterSetter('dataViews'); From 92972c0e941833db394f592b23e05f3e1979bd47 Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Tue, 4 Oct 2022 12:46:57 +0300 Subject: [PATCH 02/43] Fixed bundle size. --- src/plugins/vis_types/metric/public/convert_to_lens/index.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/plugins/vis_types/metric/public/convert_to_lens/index.ts b/src/plugins/vis_types/metric/public/convert_to_lens/index.ts index 23c19f8fffc72..8458dc7f7dfd3 100644 --- a/src/plugins/vis_types/metric/public/convert_to_lens/index.ts +++ b/src/plugins/vis_types/metric/public/convert_to_lens/index.ts @@ -13,7 +13,6 @@ import { } from '@kbn/visualizations-plugin/public'; import uuid from 'uuid'; import { getDataViewsStart } from '../services'; -import { getConfiguration } from './configurations'; import { ConvertMetricVisToLensVisualization } from './types'; export const isColumnWithMeta = (column: Column): column is ColumnWithMeta => { @@ -69,9 +68,12 @@ export const convertToLens: ConvertMetricVisToLensVisualization = async (vis, ti return null; } } + const layerId = uuid(); const indexPatternId = dataView.id!; + const { getConfiguration } = await import('./configurations'); + return { type: 'lnsMetric', layers: [ From ee60eca125231f6ee98b3540aba06fec828c0297 Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Tue, 4 Oct 2022 17:25:36 +0300 Subject: [PATCH 03/43] Added percentage mode. --- .../convert_to_lens/configurations/index.ts | 13 +++++ .../metric/public/convert_to_lens/index.ts | 10 ++-- .../convert_to_lens/lib/convert/column.ts | 2 +- .../convert_to_lens/lib/metrics/metrics.ts | 54 +++++++++++++++++-- .../common/convert_to_lens/types/common.ts | 9 ++++ .../public/convert_to_lens/schemas.ts | 17 +++--- 6 files changed, 88 insertions(+), 17 deletions(-) diff --git a/src/plugins/vis_types/metric/public/convert_to_lens/configurations/index.ts b/src/plugins/vis_types/metric/public/convert_to_lens/configurations/index.ts index 9303be0c25d3d..ad68dd5e263b6 100644 --- a/src/plugins/vis_types/metric/public/convert_to_lens/configurations/index.ts +++ b/src/plugins/vis_types/metric/public/convert_to_lens/configurations/index.ts @@ -7,9 +7,22 @@ */ import { Column, MetricVisConfiguration } from '@kbn/visualizations-plugin/common'; +import { PercentageModeConfig } from '@kbn/visualizations-plugin/common/convert_to_lens'; import { VisParams } from '../../types'; import { getPalette } from './palette'; +export const getPercentageModeConfig = (params: VisParams): PercentageModeConfig => { + if (!params.metric.percentageMode || params.metric.metricColorMode === 'None') { + return { isPercentageColumn: params.metric.percentageMode }; + } + const { colorsRange } = params.metric; + return { + isPercentageColumn: true, + min: colorsRange[0].from, + max: colorsRange[colorsRange.length - 1].to, + }; +}; + export const getConfiguration = ( layerId: string, params: VisParams, diff --git a/src/plugins/vis_types/metric/public/convert_to_lens/index.ts b/src/plugins/vis_types/metric/public/convert_to_lens/index.ts index 8458dc7f7dfd3..7675cbcc1d714 100644 --- a/src/plugins/vis_types/metric/public/convert_to_lens/index.ts +++ b/src/plugins/vis_types/metric/public/convert_to_lens/index.ts @@ -42,7 +42,11 @@ export const convertToLens: ConvertMetricVisToLensVisualization = async (vis, ti return null; } - const { getColumnsFromVis } = await convertToLensModule; + const [{ getColumnsFromVis }, { getConfiguration, getPercentageModeConfig }] = await Promise.all([ + convertToLensModule, + import('./configurations'), + ]); + const result = getColumnsFromVis( vis, timefilter, @@ -50,7 +54,7 @@ export const convertToLens: ConvertMetricVisToLensVisualization = async (vis, ti { splits: ['group'], }, - { dropEmptyRowsInDateHistogram: true } + { dropEmptyRowsInDateHistogram: true, ...getPercentageModeConfig(vis.params) } ); if (result === null) { @@ -72,8 +76,6 @@ export const convertToLens: ConvertMetricVisToLensVisualization = async (vis, ti const layerId = uuid(); const indexPatternId = dataView.id!; - const { getConfiguration } = await import('./configurations'); - return { type: 'lnsMetric', layers: [ diff --git a/src/plugins/visualizations/common/convert_to_lens/lib/convert/column.ts b/src/plugins/visualizations/common/convert_to_lens/lib/convert/column.ts index b1ac46dd36a20..7fe98b9f7ec65 100644 --- a/src/plugins/visualizations/common/convert_to_lens/lib/convert/column.ts +++ b/src/plugins/visualizations/common/convert_to_lens/lib/convert/column.ts @@ -25,7 +25,7 @@ export const createColumn = ( { isBucketed = false, isSplit = false, reducedTimeRange }: ExtraColumnFields = {} ): GeneralColumnWithMeta => ({ columnId: uuid(), - dataType: (field?.type as DataType) ?? undefined, + dataType: (field?.type as DataType) ?? 'number', label: getLabel(agg), isBucketed, isSplit, diff --git a/src/plugins/visualizations/common/convert_to_lens/lib/metrics/metrics.ts b/src/plugins/visualizations/common/convert_to_lens/lib/metrics/metrics.ts index d97f81c4c8240..41ada79f38fed 100644 --- a/src/plugins/visualizations/common/convert_to_lens/lib/metrics/metrics.ts +++ b/src/plugins/visualizations/common/convert_to_lens/lib/metrics/metrics.ts @@ -8,7 +8,7 @@ import { METRIC_TYPES } from '@kbn/data-plugin/common'; import type { DataView } from '@kbn/data-views-plugin/common'; -import { SchemaConfig } from '../../..'; +import { MinMax, PercentageModeConfig, SchemaConfig } from '../../..'; import { convertMetricAggregationColumnWithoutSpecialParams, convertToOtherParentPipelineAggColumns, @@ -19,20 +19,66 @@ import { convertToLastValueColumn, convertToCumulativeSumAggColumn, AggBasedColumn, + ExtendedColumnConverterArgs, + createFormulaColumn, } from '../convert'; import { SUPPORTED_METRICS } from '../convert/supported_metrics'; import { getValidColumns } from '../utils'; +import { getFormulaForAgg } from './formula'; + +const getPercentageFormulaOverRange = (formula: string, { min, max }: MinMax) => + `((${formula}) - ${min}) / (${max} - ${min})`; + +// Lens is multiplying by 100, so, it is necessary to disable that operation. +const getPercentageFormula = (formula: string) => `(${formula}) / 10000`; + +const convertToColumnInPercentageMode = ( + columnConverterArgs: ExtendedColumnConverterArgs, + minMax: MinMax | {} +) => { + const formula = getFormulaForAgg(columnConverterArgs); + if (formula === null) { + return null; + } + + const percentageModeFormula = isMinMax(minMax) + ? getPercentageFormulaOverRange(formula, minMax) + : getPercentageFormula(formula); + const column = createFormulaColumn(percentageModeFormula, columnConverterArgs.agg); + if (column === null) { + return null; + } + return { + ...column, + params: { ...column?.params, format: { id: 'percent' } }, + }; +}; + +const isMinMax = (minMax: MinMax | {}): minMax is MinMax => { + if ((minMax as MinMax).min !== undefined && (minMax as MinMax).max !== undefined) { + return true; + } + return false; +}; export const convertMetricToColumns = ( - agg: SchemaConfig, + agg: SchemaConfig, dataView: DataView, - aggs: Array> + aggs: Array>, + percentageModeConfig: PercentageModeConfig ): AggBasedColumn[] | null => { const supportedAgg = SUPPORTED_METRICS[agg.aggType]; if (!supportedAgg) { return null; } + if (percentageModeConfig.isPercentageColumn) { + const { isPercentageColumn, ...minMax } = percentageModeConfig; + + const formulaColumn = convertToColumnInPercentageMode({ agg, dataView, aggs }, minMax); + return getValidColumns(formulaColumn); + } + switch (agg.aggType) { case METRIC_TYPES.AVG: case METRIC_TYPES.MIN: @@ -119,8 +165,6 @@ export const convertMetricToColumns = ( }); return getValidColumns(columns); } - case METRIC_TYPES.SERIAL_DIFF: - return null; default: return null; } diff --git a/src/plugins/visualizations/common/convert_to_lens/types/common.ts b/src/plugins/visualizations/common/convert_to_lens/types/common.ts index d792467e298d0..8daa9889b04d3 100644 --- a/src/plugins/visualizations/common/convert_to_lens/types/common.ts +++ b/src/plugins/visualizations/common/convert_to_lens/types/common.ts @@ -45,3 +45,12 @@ export interface NumberValueFormat { suffix?: string; }; } + +export interface MinMax { + min: number; + max: number; +} + +export type PercentageModeConfig = + | ({ isPercentageColumn: true } & MinMax) + | { isPercentageColumn: boolean }; diff --git a/src/plugins/visualizations/public/convert_to_lens/schemas.ts b/src/plugins/visualizations/public/convert_to_lens/schemas.ts index 56108b1a1d63f..06c28455edfcf 100644 --- a/src/plugins/visualizations/public/convert_to_lens/schemas.ts +++ b/src/plugins/visualizations/public/convert_to_lens/schemas.ts @@ -8,7 +8,7 @@ import type { DataView } from '@kbn/data-views-plugin/common'; import { METRIC_TYPES, TimefilterContract } from '@kbn/data-plugin/public'; -import { AggBasedColumn, SchemaConfig } from '../../common'; +import { AggBasedColumn, PercentageModeConfig, SchemaConfig } from '../../common'; import { convertMetricToColumns } from '../../common/convert_to_lens/lib/metrics'; import { convertBucketToColumns } from '../../common/convert_to_lens/lib/buckets'; import { getCustomBucketsFromSiblingAggs } from '../../common/convert_to_lens/lib/utils'; @@ -46,8 +46,11 @@ export const getColumnsFromVis = ( } = {}, config?: { dropEmptyRowsInDateHistogram?: boolean; - } + } & (PercentageModeConfig | void) ) => { + const { dropEmptyRowsInDateHistogram, ...percentageModeConfig } = config ?? { + isPercentageColumn: false, + }; const visSchemas = getVisSchemas(vis, { timefilter, timeRange: timefilter.getAbsoluteTime(), @@ -67,8 +70,8 @@ export const getColumnsFromVis = ( const metricsWithoutDuplicates = getMetricsWithoutDuplicates(visSchemas.metric); const aggs = metricsWithoutDuplicates as Array>; - const metricColumns = metricsWithoutDuplicates.flatMap((m) => - convertMetricToColumns(m, dataView, aggs) + const metricColumns = aggs.flatMap((m) => + convertMetricToColumns(m, dataView, aggs, percentageModeConfig) ); if (metricColumns.includes(null)) { @@ -81,7 +84,7 @@ export const getColumnsFromVis = ( const customBucketColumn = convertBucketToColumns( { agg: customBuckets[0], dataView, metricColumns: metrics, aggs }, false, - config?.dropEmptyRowsInDateHistogram + dropEmptyRowsInDateHistogram ); if (!customBucketColumn) { return null; @@ -95,7 +98,7 @@ export const getColumnsFromVis = ( dataView, false, metricColumns as AggBasedColumn[], - config?.dropEmptyRowsInDateHistogram + dropEmptyRowsInDateHistogram ); if (!bucketColumns) { return null; @@ -107,7 +110,7 @@ export const getColumnsFromVis = ( dataView, true, metricColumns as AggBasedColumn[], - config?.dropEmptyRowsInDateHistogram + dropEmptyRowsInDateHistogram ); if (!splitBucketColumns) { return null; From dc539fce5f07cb72d2184d64dee8773ae3bee58d Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Wed, 5 Oct 2022 10:05:36 +0300 Subject: [PATCH 04/43] Added fix of snapshot. --- .../__snapshots__/metric_vis_function.test.ts.snap | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/chart_expressions/expression_legacy_metric/common/expression_functions/__snapshots__/metric_vis_function.test.ts.snap b/src/plugins/chart_expressions/expression_legacy_metric/common/expression_functions/__snapshots__/metric_vis_function.test.ts.snap index 9a7a7d5a5035c..defaca87fad1c 100644 --- a/src/plugins/chart_expressions/expression_legacy_metric/common/expression_functions/__snapshots__/metric_vis_function.test.ts.snap +++ b/src/plugins/chart_expressions/expression_legacy_metric/common/expression_functions/__snapshots__/metric_vis_function.test.ts.snap @@ -26,6 +26,7 @@ Object { "as": "legacyMetricVis", "type": "render", "value": Object { + "canNavigateToLens": false, "visConfig": Object { "dimensions": Object { "metrics": Array [ From 24acad58d0ba16da3b904a8af2ba75f3acf39bbc Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Wed, 5 Oct 2022 10:15:22 +0300 Subject: [PATCH 05/43] Fixed convertMetricToColumns tests. --- .../lib/metrics/metrics.test.ts | 322 +++++++++++++++--- 1 file changed, 276 insertions(+), 46 deletions(-) diff --git a/src/plugins/visualizations/common/convert_to_lens/lib/metrics/metrics.test.ts b/src/plugins/visualizations/common/convert_to_lens/lib/metrics/metrics.test.ts index 659ab80ea03d5..ef33f140601e8 100644 --- a/src/plugins/visualizations/common/convert_to_lens/lib/metrics/metrics.test.ts +++ b/src/plugins/visualizations/common/convert_to_lens/lib/metrics/metrics.test.ts @@ -56,145 +56,265 @@ describe('convertMetricToColumns invalid cases', () => { test.each<[string, Parameters, null, jest.Mock | undefined]>([ [ 'null if agg is not supported', - [{ aggType: METRIC_TYPES.GEO_BOUNDS } as unknown as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.GEO_BOUNDS } as unknown as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], null, undefined, ], [ 'null if supported agg AVG is not valid', - [{ aggType: METRIC_TYPES.AVG } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.AVG } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], null, mockConvertMetricAggregationColumnWithoutSpecialParams, ], [ 'null if supported agg MIN is not valid', - [{ aggType: METRIC_TYPES.MIN } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.MIN } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], null, mockConvertMetricAggregationColumnWithoutSpecialParams, ], [ 'null if supported agg MAX is not valid', - [{ aggType: METRIC_TYPES.MAX } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.MAX } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], null, mockConvertMetricAggregationColumnWithoutSpecialParams, ], [ 'null if supported agg SUM is not valid', - [{ aggType: METRIC_TYPES.SUM } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.SUM } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], null, mockConvertMetricAggregationColumnWithoutSpecialParams, ], [ 'null if supported agg COUNT is not valid', - [{ aggType: METRIC_TYPES.COUNT } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.COUNT } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], null, mockConvertMetricAggregationColumnWithoutSpecialParams, ], [ 'null if supported agg CARDINALITY is not valid', - [{ aggType: METRIC_TYPES.CARDINALITY } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.CARDINALITY } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], null, mockConvertMetricAggregationColumnWithoutSpecialParams, ], [ 'null if supported agg VALUE_COUNT is not valid', - [{ aggType: METRIC_TYPES.VALUE_COUNT } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.VALUE_COUNT } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], null, mockConvertMetricAggregationColumnWithoutSpecialParams, ], [ 'null if supported agg MEDIAN is not valid', - [{ aggType: METRIC_TYPES.MEDIAN } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.MEDIAN } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], null, mockConvertMetricAggregationColumnWithoutSpecialParams, ], [ 'null if supported agg STD_DEV is not valid', - [{ aggType: METRIC_TYPES.STD_DEV } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.STD_DEV } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], null, mockConvertToStdDeviationFormulaColumns, ], [ 'null if supported agg PERCENTILES is not valid', - [{ aggType: METRIC_TYPES.PERCENTILES } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.PERCENTILES } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], null, mockConvertToPercentileColumn, ], [ 'null if supported agg SINGLE_PERCENTILE is not valid', - [{ aggType: METRIC_TYPES.SINGLE_PERCENTILE } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.SINGLE_PERCENTILE } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], null, mockConvertToPercentileColumn, ], [ 'null if supported agg PERCENTILE_RANKS is not valid', - [{ aggType: METRIC_TYPES.PERCENTILE_RANKS } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.PERCENTILE_RANKS } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], null, mockConvertToPercentileRankColumn, ], [ 'null if supported agg SINGLE_PERCENTILE_RANK is not valid', - [{ aggType: METRIC_TYPES.SINGLE_PERCENTILE_RANK } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.SINGLE_PERCENTILE_RANK } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], null, mockConvertToPercentileRankColumn, ], [ 'null if supported agg TOP_HITS is not valid', - [{ aggType: METRIC_TYPES.TOP_HITS } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.TOP_HITS } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], null, mockConvertToLastValueColumn, ], [ 'null if supported agg TOP_METRICS is not valid', - [{ aggType: METRIC_TYPES.TOP_METRICS } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.TOP_METRICS } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], null, mockConvertToLastValueColumn, ], [ 'null if supported agg CUMULATIVE_SUM is not valid', - [{ aggType: METRIC_TYPES.CUMULATIVE_SUM } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.CUMULATIVE_SUM } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], null, mockConvertToCumulativeSumAggColumn, ], [ 'null if supported agg DERIVATIVE is not valid', - [{ aggType: METRIC_TYPES.DERIVATIVE } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.DERIVATIVE } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], null, mockConvertToOtherParentPipelineAggColumns, ], [ 'null if supported agg MOVING_FN is not valid', - [{ aggType: METRIC_TYPES.MOVING_FN } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.MOVING_FN } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], null, mockConvertToOtherParentPipelineAggColumns, ], [ 'null if supported agg SUM_BUCKET is not valid', - [{ aggType: METRIC_TYPES.SUM_BUCKET } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.SUM_BUCKET } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], null, mockConvertToSiblingPipelineColumns, ], [ 'null if supported agg MIN_BUCKET is not valid', - [{ aggType: METRIC_TYPES.MIN_BUCKET } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.MIN_BUCKET } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], null, mockConvertToSiblingPipelineColumns, ], [ 'null if supported agg MAX_BUCKET is not valid', - [{ aggType: METRIC_TYPES.MAX_BUCKET } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.MAX_BUCKET } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], null, mockConvertToSiblingPipelineColumns, ], [ 'null if supported agg AVG_BUCKET is not valid', - [{ aggType: METRIC_TYPES.AVG_BUCKET } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.AVG_BUCKET } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], null, mockConvertToSiblingPipelineColumns, ], [ 'null if supported agg SERIAL_DIFF is not valid', - [{ aggType: METRIC_TYPES.SERIAL_DIFF } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.SERIAL_DIFF } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], null, undefined, ], @@ -229,133 +349,243 @@ describe('convertMetricToColumns valid cases', () => { test.each<[string, Parameters, Array<{}>, jest.Mock]>([ [ 'array of columns if supported agg AVG is valid', - [{ aggType: METRIC_TYPES.AVG } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.AVG } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], result, mockConvertMetricAggregationColumnWithoutSpecialParams, ], [ 'array of columns if supported agg MIN is valid', - [{ aggType: METRIC_TYPES.MIN } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.MIN } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], result, mockConvertMetricAggregationColumnWithoutSpecialParams, ], [ 'array of columns if supported agg MAX is valid', - [{ aggType: METRIC_TYPES.MAX } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.MAX } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], result, mockConvertMetricAggregationColumnWithoutSpecialParams, ], [ 'array of columns if supported agg SUM is valid', - [{ aggType: METRIC_TYPES.SUM } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.SUM } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], result, mockConvertMetricAggregationColumnWithoutSpecialParams, ], [ 'array of columns if supported agg COUNT is valid', - [{ aggType: METRIC_TYPES.COUNT } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.COUNT } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], result, mockConvertMetricAggregationColumnWithoutSpecialParams, ], [ 'array of columns if supported agg CARDINALITY is valid', - [{ aggType: METRIC_TYPES.CARDINALITY } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.CARDINALITY } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], result, mockConvertMetricAggregationColumnWithoutSpecialParams, ], [ 'array of columns if supported agg VALUE_COUNT is valid', - [{ aggType: METRIC_TYPES.VALUE_COUNT } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.VALUE_COUNT } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], result, mockConvertMetricAggregationColumnWithoutSpecialParams, ], [ 'array of columns if supported agg MEDIAN is valid', - [{ aggType: METRIC_TYPES.MEDIAN } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.MEDIAN } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], result, mockConvertMetricAggregationColumnWithoutSpecialParams, ], [ 'array of columns if supported agg STD_DEV is valid', - [{ aggType: METRIC_TYPES.STD_DEV } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.STD_DEV } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], result, mockConvertToStdDeviationFormulaColumns, ], [ 'array of columns if supported agg PERCENTILES is valid', - [{ aggType: METRIC_TYPES.PERCENTILES } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.PERCENTILES } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], result, mockConvertToPercentileColumn, ], [ 'array of columns if supported agg SINGLE_PERCENTILE is valid', - [{ aggType: METRIC_TYPES.SINGLE_PERCENTILE } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.SINGLE_PERCENTILE } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], result, mockConvertToPercentileColumn, ], [ 'array of columns if supported agg PERCENTILE_RANKS is valid', - [{ aggType: METRIC_TYPES.PERCENTILE_RANKS } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.PERCENTILE_RANKS } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], result, mockConvertToPercentileRankColumn, ], [ 'array of columns if supported agg SINGLE_PERCENTILE_RANK is valid', - [{ aggType: METRIC_TYPES.SINGLE_PERCENTILE_RANK } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.SINGLE_PERCENTILE_RANK } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], result, mockConvertToPercentileRankColumn, ], [ 'array of columns if supported agg TOP_HITS is valid', - [{ aggType: METRIC_TYPES.TOP_HITS } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.TOP_HITS } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], result, mockConvertToLastValueColumn, ], [ 'array of columns if supported agg TOP_METRICS is valid', - [{ aggType: METRIC_TYPES.TOP_METRICS } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.TOP_METRICS } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], result, mockConvertToLastValueColumn, ], [ 'array of columns if supported agg CUMULATIVE_SUM is valid', - [{ aggType: METRIC_TYPES.CUMULATIVE_SUM } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.CUMULATIVE_SUM } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], result, mockConvertToCumulativeSumAggColumn, ], [ 'array of columns if supported agg DERIVATIVE is valid', - [{ aggType: METRIC_TYPES.DERIVATIVE } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.DERIVATIVE } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], result, mockConvertToOtherParentPipelineAggColumns, ], [ 'array of columns if supported agg MOVING_FN is valid', - [{ aggType: METRIC_TYPES.MOVING_FN } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.MOVING_FN } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], result, mockConvertToOtherParentPipelineAggColumns, ], [ 'array of columns if supported agg SUM_BUCKET is valid', - [{ aggType: METRIC_TYPES.SUM_BUCKET } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.SUM_BUCKET } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], result, mockConvertToSiblingPipelineColumns, ], [ 'array of columns if supported agg MIN_BUCKET is valid', - [{ aggType: METRIC_TYPES.MIN_BUCKET } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.MIN_BUCKET } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], result, mockConvertToSiblingPipelineColumns, ], [ 'array of columns if supported agg MAX_BUCKET is valid', - [{ aggType: METRIC_TYPES.MAX_BUCKET } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.MAX_BUCKET } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], result, mockConvertToSiblingPipelineColumns, ], [ 'array of columns if supported agg AVG_BUCKET is valid', - [{ aggType: METRIC_TYPES.AVG_BUCKET } as SchemaConfig, dataView, []], + [ + { aggType: METRIC_TYPES.AVG_BUCKET } as SchemaConfig, + dataView, + [], + { isPercentageColumn: false }, + ], result, mockConvertToSiblingPipelineColumns, ], From ae47b7d0b1b45918f8e7c6462e5a97527d0da6c2 Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Wed, 5 Oct 2022 10:31:02 +0300 Subject: [PATCH 06/43] Added tests for percentageMode enabled in convertMetricToColumns --- .../convert_to_lens/lib/convert/index.ts | 1 + .../lib/convert/percentage_mode.ts | 49 +++++++++++++++++++ .../lib/metrics/metrics.test.ts | 25 ++++++++++ .../convert_to_lens/lib/metrics/metrics.ts | 41 +--------------- 4 files changed, 77 insertions(+), 39 deletions(-) create mode 100644 src/plugins/visualizations/common/convert_to_lens/lib/convert/percentage_mode.ts diff --git a/src/plugins/visualizations/common/convert_to_lens/lib/convert/index.ts b/src/plugins/visualizations/common/convert_to_lens/lib/convert/index.ts index b77ea6b97209a..9da33607be2a9 100644 --- a/src/plugins/visualizations/common/convert_to_lens/lib/convert/index.ts +++ b/src/plugins/visualizations/common/convert_to_lens/lib/convert/index.ts @@ -20,3 +20,4 @@ export * from './terms'; export * from './types'; export * from './last_value'; export * from './range'; +export * from './percentage_mode'; diff --git a/src/plugins/visualizations/common/convert_to_lens/lib/convert/percentage_mode.ts b/src/plugins/visualizations/common/convert_to_lens/lib/convert/percentage_mode.ts new file mode 100644 index 0000000000000..682dd6aff8148 --- /dev/null +++ b/src/plugins/visualizations/common/convert_to_lens/lib/convert/percentage_mode.ts @@ -0,0 +1,49 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { METRIC_TYPES } from '@kbn/data-plugin/common'; +import { MinMax } from '../../types'; +import { getFormulaForAgg } from '../metrics/formula'; +import { createFormulaColumn } from './formula'; +import { ExtendedColumnConverterArgs } from './types'; + +const getPercentageFormulaOverRange = (formula: string, { min, max }: MinMax) => + `((${formula}) - ${min}) / (${max} - ${min})`; + +// Lens is multiplying by 100, so, it is necessary to disable that operation. +const getPercentageFormula = (formula: string) => `(${formula}) / 10000`; + +const isMinMax = (minMax: MinMax | {}): minMax is MinMax => { + if ((minMax as MinMax).min !== undefined && (minMax as MinMax).max !== undefined) { + return true; + } + return false; +}; + +export const convertToColumnInPercentageMode = ( + columnConverterArgs: ExtendedColumnConverterArgs, + minMax: MinMax | {} +) => { + const formula = getFormulaForAgg(columnConverterArgs); + if (formula === null) { + return null; + } + + const percentageModeFormula = isMinMax(minMax) + ? getPercentageFormulaOverRange(formula, minMax) + : getPercentageFormula(formula); + + const column = createFormulaColumn(percentageModeFormula, columnConverterArgs.agg); + if (column === null) { + return null; + } + return { + ...column, + params: { ...column?.params, format: { id: 'percent' } }, + }; +}; diff --git a/src/plugins/visualizations/common/convert_to_lens/lib/metrics/metrics.test.ts b/src/plugins/visualizations/common/convert_to_lens/lib/metrics/metrics.test.ts index ef33f140601e8..740dc7341c324 100644 --- a/src/plugins/visualizations/common/convert_to_lens/lib/metrics/metrics.test.ts +++ b/src/plugins/visualizations/common/convert_to_lens/lib/metrics/metrics.test.ts @@ -19,6 +19,7 @@ const mockConvertToSiblingPipelineColumns = jest.fn(); const mockConvertToStdDeviationFormulaColumns = jest.fn(); const mockConvertToLastValueColumn = jest.fn(); const mockConvertToCumulativeSumAggColumn = jest.fn(); +const mockConvertToColumnInPercentageMode = jest.fn(); jest.mock('../convert', () => ({ convertMetricAggregationColumnWithoutSpecialParams: jest.fn(() => @@ -33,6 +34,7 @@ jest.mock('../convert', () => ({ convertToStdDeviationFormulaColumns: jest.fn(() => mockConvertToStdDeviationFormulaColumns()), convertToLastValueColumn: jest.fn(() => mockConvertToLastValueColumn()), convertToCumulativeSumAggColumn: jest.fn(() => mockConvertToCumulativeSumAggColumn()), + convertToColumnInPercentageMode: jest.fn(() => mockConvertToColumnInPercentageMode()), })); describe('convertMetricToColumns invalid cases', () => { @@ -344,6 +346,7 @@ describe('convertMetricToColumns valid cases', () => { mockConvertToStdDeviationFormulaColumns.mockReturnValue(result); mockConvertToLastValueColumn.mockReturnValue(result); mockConvertToCumulativeSumAggColumn.mockReturnValue(result); + mockConvertToColumnInPercentageMode.mockReturnValue(result); }); test.each<[string, Parameters, Array<{}>, jest.Mock]>([ @@ -589,6 +592,28 @@ describe('convertMetricToColumns valid cases', () => { result, mockConvertToSiblingPipelineColumns, ], + [ + 'column in percentage mode without range if percentageMode is enabled ', + [ + { aggType: METRIC_TYPES.AVG_BUCKET } as SchemaConfig, + dataView, + [], + { isPercentageColumn: true }, + ], + result, + mockConvertToColumnInPercentageMode, + ], + [ + 'column in percentage mode with range if percentageMode is enabled ', + [ + { aggType: METRIC_TYPES.AVG_BUCKET } as SchemaConfig, + dataView, + [], + { isPercentageColumn: true, min: 0, max: 100 }, + ], + result, + mockConvertToColumnInPercentageMode, + ], ])('should return %s', (_, input, expected, mock) => { expect(convertMetricToColumns(...input)).toEqual(expected.map(expect.objectContaining)); if (mock) { diff --git a/src/plugins/visualizations/common/convert_to_lens/lib/metrics/metrics.ts b/src/plugins/visualizations/common/convert_to_lens/lib/metrics/metrics.ts index 41ada79f38fed..aa88a835f3895 100644 --- a/src/plugins/visualizations/common/convert_to_lens/lib/metrics/metrics.ts +++ b/src/plugins/visualizations/common/convert_to_lens/lib/metrics/metrics.ts @@ -8,7 +8,7 @@ import { METRIC_TYPES } from '@kbn/data-plugin/common'; import type { DataView } from '@kbn/data-views-plugin/common'; -import { MinMax, PercentageModeConfig, SchemaConfig } from '../../..'; +import { PercentageModeConfig, SchemaConfig } from '../../..'; import { convertMetricAggregationColumnWithoutSpecialParams, convertToOtherParentPipelineAggColumns, @@ -19,47 +19,10 @@ import { convertToLastValueColumn, convertToCumulativeSumAggColumn, AggBasedColumn, - ExtendedColumnConverterArgs, - createFormulaColumn, + convertToColumnInPercentageMode, } from '../convert'; import { SUPPORTED_METRICS } from '../convert/supported_metrics'; import { getValidColumns } from '../utils'; -import { getFormulaForAgg } from './formula'; - -const getPercentageFormulaOverRange = (formula: string, { min, max }: MinMax) => - `((${formula}) - ${min}) / (${max} - ${min})`; - -// Lens is multiplying by 100, so, it is necessary to disable that operation. -const getPercentageFormula = (formula: string) => `(${formula}) / 10000`; - -const convertToColumnInPercentageMode = ( - columnConverterArgs: ExtendedColumnConverterArgs, - minMax: MinMax | {} -) => { - const formula = getFormulaForAgg(columnConverterArgs); - if (formula === null) { - return null; - } - - const percentageModeFormula = isMinMax(minMax) - ? getPercentageFormulaOverRange(formula, minMax) - : getPercentageFormula(formula); - const column = createFormulaColumn(percentageModeFormula, columnConverterArgs.agg); - if (column === null) { - return null; - } - return { - ...column, - params: { ...column?.params, format: { id: 'percent' } }, - }; -}; - -const isMinMax = (minMax: MinMax | {}): minMax is MinMax => { - if ((minMax as MinMax).min !== undefined && (minMax as MinMax).max !== undefined) { - return true; - } - return false; -}; export const convertMetricToColumns = ( agg: SchemaConfig, From b73664b2a95e3cc5c03d070b84d5b9d5b60d7b6a Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Wed, 5 Oct 2022 10:37:53 +0300 Subject: [PATCH 07/43] Updated snapshots of run_pipeline/basic.ts --- .../snapshots/baseline/combined_test3.json | 2 +- .../snapshots/baseline/final_output_test.json | 2 +- .../snapshots/baseline/partial_test_2.json | 2 +- .../snapshots/baseline/step_output_test3.json | 2 +- .../snapshots/session/combined_test3.json | 2 +- .../snapshots/session/final_output_test.json | 2 +- .../snapshots/session/partial_test_2.json | 2 +- .../snapshots/session/step_output_test3.json | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/test/interpreter_functional/snapshots/baseline/combined_test3.json b/test/interpreter_functional/snapshots/baseline/combined_test3.json index 49daaed3c5b85..922d266f7e187 100644 --- a/test/interpreter_functional/snapshots/baseline/combined_test3.json +++ b/test/interpreter_functional/snapshots/baseline/combined_test3.json @@ -1 +1 @@ -{"as":"legacyMetricVis","type":"render","value":{"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"excludeIsRegex":true,"field":"response.raw","includeIsRegex":true,"missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"emptyAsNull":false},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"meta":{"source":"logstash-*","statistics":{"totalCount":14004},"type":"esaggs"},"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"legacyMetricVis","type":"render","value":{"canNavigateToLens":false,"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"excludeIsRegex":true,"field":"response.raw","includeIsRegex":true,"missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"emptyAsNull":false},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"meta":{"source":"logstash-*","statistics":{"totalCount":14004},"type":"esaggs"},"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/baseline/final_output_test.json b/test/interpreter_functional/snapshots/baseline/final_output_test.json index 49daaed3c5b85..922d266f7e187 100644 --- a/test/interpreter_functional/snapshots/baseline/final_output_test.json +++ b/test/interpreter_functional/snapshots/baseline/final_output_test.json @@ -1 +1 @@ -{"as":"legacyMetricVis","type":"render","value":{"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"excludeIsRegex":true,"field":"response.raw","includeIsRegex":true,"missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"emptyAsNull":false},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"meta":{"source":"logstash-*","statistics":{"totalCount":14004},"type":"esaggs"},"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"legacyMetricVis","type":"render","value":{"canNavigateToLens":false,"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"excludeIsRegex":true,"field":"response.raw","includeIsRegex":true,"missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"emptyAsNull":false},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"meta":{"source":"logstash-*","statistics":{"totalCount":14004},"type":"esaggs"},"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/baseline/partial_test_2.json b/test/interpreter_functional/snapshots/baseline/partial_test_2.json index 49daaed3c5b85..922d266f7e187 100644 --- a/test/interpreter_functional/snapshots/baseline/partial_test_2.json +++ b/test/interpreter_functional/snapshots/baseline/partial_test_2.json @@ -1 +1 @@ -{"as":"legacyMetricVis","type":"render","value":{"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"excludeIsRegex":true,"field":"response.raw","includeIsRegex":true,"missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"emptyAsNull":false},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"meta":{"source":"logstash-*","statistics":{"totalCount":14004},"type":"esaggs"},"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"legacyMetricVis","type":"render","value":{"canNavigateToLens":false,"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"excludeIsRegex":true,"field":"response.raw","includeIsRegex":true,"missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"emptyAsNull":false},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"meta":{"source":"logstash-*","statistics":{"totalCount":14004},"type":"esaggs"},"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/baseline/step_output_test3.json b/test/interpreter_functional/snapshots/baseline/step_output_test3.json index 49daaed3c5b85..922d266f7e187 100644 --- a/test/interpreter_functional/snapshots/baseline/step_output_test3.json +++ b/test/interpreter_functional/snapshots/baseline/step_output_test3.json @@ -1 +1 @@ -{"as":"legacyMetricVis","type":"render","value":{"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"excludeIsRegex":true,"field":"response.raw","includeIsRegex":true,"missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"emptyAsNull":false},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"meta":{"source":"logstash-*","statistics":{"totalCount":14004},"type":"esaggs"},"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"legacyMetricVis","type":"render","value":{"canNavigateToLens":false,"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"excludeIsRegex":true,"field":"response.raw","includeIsRegex":true,"missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"emptyAsNull":false},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"meta":{"source":"logstash-*","statistics":{"totalCount":14004},"type":"esaggs"},"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/session/combined_test3.json b/test/interpreter_functional/snapshots/session/combined_test3.json index 49daaed3c5b85..922d266f7e187 100644 --- a/test/interpreter_functional/snapshots/session/combined_test3.json +++ b/test/interpreter_functional/snapshots/session/combined_test3.json @@ -1 +1 @@ -{"as":"legacyMetricVis","type":"render","value":{"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"excludeIsRegex":true,"field":"response.raw","includeIsRegex":true,"missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"emptyAsNull":false},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"meta":{"source":"logstash-*","statistics":{"totalCount":14004},"type":"esaggs"},"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"legacyMetricVis","type":"render","value":{"canNavigateToLens":false,"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"excludeIsRegex":true,"field":"response.raw","includeIsRegex":true,"missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"emptyAsNull":false},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"meta":{"source":"logstash-*","statistics":{"totalCount":14004},"type":"esaggs"},"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/session/final_output_test.json b/test/interpreter_functional/snapshots/session/final_output_test.json index 49daaed3c5b85..922d266f7e187 100644 --- a/test/interpreter_functional/snapshots/session/final_output_test.json +++ b/test/interpreter_functional/snapshots/session/final_output_test.json @@ -1 +1 @@ -{"as":"legacyMetricVis","type":"render","value":{"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"excludeIsRegex":true,"field":"response.raw","includeIsRegex":true,"missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"emptyAsNull":false},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"meta":{"source":"logstash-*","statistics":{"totalCount":14004},"type":"esaggs"},"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"legacyMetricVis","type":"render","value":{"canNavigateToLens":false,"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"excludeIsRegex":true,"field":"response.raw","includeIsRegex":true,"missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"emptyAsNull":false},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"meta":{"source":"logstash-*","statistics":{"totalCount":14004},"type":"esaggs"},"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/session/partial_test_2.json b/test/interpreter_functional/snapshots/session/partial_test_2.json index 49daaed3c5b85..922d266f7e187 100644 --- a/test/interpreter_functional/snapshots/session/partial_test_2.json +++ b/test/interpreter_functional/snapshots/session/partial_test_2.json @@ -1 +1 @@ -{"as":"legacyMetricVis","type":"render","value":{"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"excludeIsRegex":true,"field":"response.raw","includeIsRegex":true,"missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"emptyAsNull":false},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"meta":{"source":"logstash-*","statistics":{"totalCount":14004},"type":"esaggs"},"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"legacyMetricVis","type":"render","value":{"canNavigateToLens":false,"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"excludeIsRegex":true,"field":"response.raw","includeIsRegex":true,"missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"emptyAsNull":false},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"meta":{"source":"logstash-*","statistics":{"totalCount":14004},"type":"esaggs"},"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/session/step_output_test3.json b/test/interpreter_functional/snapshots/session/step_output_test3.json index 49daaed3c5b85..922d266f7e187 100644 --- a/test/interpreter_functional/snapshots/session/step_output_test3.json +++ b/test/interpreter_functional/snapshots/session/step_output_test3.json @@ -1 +1 @@ -{"as":"legacyMetricVis","type":"render","value":{"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"excludeIsRegex":true,"field":"response.raw","includeIsRegex":true,"missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"emptyAsNull":false},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"meta":{"source":"logstash-*","statistics":{"totalCount":14004},"type":"esaggs"},"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"legacyMetricVis","type":"render","value":{"canNavigateToLens":false,"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"excludeIsRegex":true,"field":"response.raw","includeIsRegex":true,"missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"emptyAsNull":false},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"meta":{"source":"logstash-*","statistics":{"totalCount":14004},"type":"esaggs"},"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file From 0d247c7de08930ca94be5496f393f3f57cf08645 Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Wed, 5 Oct 2022 10:40:43 +0300 Subject: [PATCH 08/43] Fixed snapshots. --- .../snapshots/baseline/metric_all_data.json | 2 +- .../snapshots/baseline/metric_empty_data.json | 2 +- .../snapshots/baseline/metric_multi_metric_data.json | 2 +- .../snapshots/baseline/metric_percentage_mode.json | 2 +- .../snapshots/baseline/metric_single_metric_data.json | 2 +- .../snapshots/session/metric_all_data.json | 2 +- .../snapshots/session/metric_empty_data.json | 2 +- .../snapshots/session/metric_multi_metric_data.json | 2 +- .../snapshots/session/metric_percentage_mode.json | 2 +- .../snapshots/session/metric_single_metric_data.json | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/test/interpreter_functional/snapshots/baseline/metric_all_data.json b/test/interpreter_functional/snapshots/baseline/metric_all_data.json index 1c7a6cb857ed1..3b8553435624f 100644 --- a/test/interpreter_functional/snapshots/baseline/metric_all_data.json +++ b/test/interpreter_functional/snapshots/baseline/metric_all_data.json @@ -1 +1 @@ -{"as":"legacyMetricVis","type":"render","value":{"visConfig":{"dimensions":{"bucket":{"accessor":2,"format":{"id":"bytes","params":null},"type":"vis_dimension"},"metrics":[{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"excludeIsRegex":true,"field":"response.raw","includeIsRegex":true,"missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"emptyAsNull":false},"schema":"metric","type":"count"},"type":"number"},"name":"Count"},{"id":"col-2-1","meta":{"field":"bytes","index":"logstash-*","params":{"id":"bytes","params":null},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"field":"bytes"},"schema":"metric","type":"max"},"type":"number"},"name":"Max bytes"}],"meta":{"source":"logstash-*","statistics":{"totalCount":14004},"type":"esaggs"},"rows":[{"col-0-2":"200","col-1-1":12891,"col-2-1":19986},{"col-0-2":"404","col-1-1":696,"col-2-1":19881},{"col-0-2":"503","col-1-1":417,"col-2-1":0}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"legacyMetricVis","type":"render","value":{"canNavigateToLens":false,"visConfig":{"dimensions":{"bucket":{"accessor":2,"format":{"id":"bytes","params":null},"type":"vis_dimension"},"metrics":[{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"excludeIsRegex":true,"field":"response.raw","includeIsRegex":true,"missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"emptyAsNull":false},"schema":"metric","type":"count"},"type":"number"},"name":"Count"},{"id":"col-2-1","meta":{"field":"bytes","index":"logstash-*","params":{"id":"bytes","params":null},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"field":"bytes"},"schema":"metric","type":"max"},"type":"number"},"name":"Max bytes"}],"meta":{"source":"logstash-*","statistics":{"totalCount":14004},"type":"esaggs"},"rows":[{"col-0-2":"200","col-1-1":12891,"col-2-1":19986},{"col-0-2":"404","col-1-1":696,"col-2-1":19881},{"col-0-2":"503","col-1-1":417,"col-2-1":0}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/baseline/metric_empty_data.json b/test/interpreter_functional/snapshots/baseline/metric_empty_data.json index 1f93a487bee2b..ef645bdb30afd 100644 --- a/test/interpreter_functional/snapshots/baseline/metric_empty_data.json +++ b/test/interpreter_functional/snapshots/baseline/metric_empty_data.json @@ -1 +1 @@ -{"as":"legacyMetricVis","type":"render","value":{"visConfig":{"dimensions":{"metrics":[{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"excludeIsRegex":true,"field":"response.raw","includeIsRegex":true,"missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"emptyAsNull":false},"schema":"metric","type":"count"},"type":"number"},"name":"Count"},{"id":"col-2-1","meta":{"field":"bytes","index":"logstash-*","params":{"id":"bytes","params":null},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"field":"bytes"},"schema":"metric","type":"max"},"type":"number"},"name":"Max bytes"}],"meta":{"source":"logstash-*","statistics":{"totalCount":14004},"type":"esaggs"},"rows":[],"type":"datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"legacyMetricVis","type":"render","value":{"canNavigateToLens":false,"visConfig":{"dimensions":{"metrics":[{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"excludeIsRegex":true,"field":"response.raw","includeIsRegex":true,"missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"emptyAsNull":false},"schema":"metric","type":"count"},"type":"number"},"name":"Count"},{"id":"col-2-1","meta":{"field":"bytes","index":"logstash-*","params":{"id":"bytes","params":null},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"field":"bytes"},"schema":"metric","type":"max"},"type":"number"},"name":"Max bytes"}],"meta":{"source":"logstash-*","statistics":{"totalCount":14004},"type":"esaggs"},"rows":[],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/baseline/metric_multi_metric_data.json b/test/interpreter_functional/snapshots/baseline/metric_multi_metric_data.json index 78135325fac66..90d572ab720f0 100644 --- a/test/interpreter_functional/snapshots/baseline/metric_multi_metric_data.json +++ b/test/interpreter_functional/snapshots/baseline/metric_multi_metric_data.json @@ -1 +1 @@ -{"as":"legacyMetricVis","type":"render","value":{"visConfig":{"dimensions":{"metrics":[{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"},{"accessor":1,"format":{"id":"number"},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"excludeIsRegex":true,"field":"response.raw","includeIsRegex":true,"missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"emptyAsNull":false},"schema":"metric","type":"count"},"type":"number"},"name":"Count"},{"id":"col-2-1","meta":{"field":"bytes","index":"logstash-*","params":{"id":"bytes","params":null},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"field":"bytes"},"schema":"metric","type":"max"},"type":"number"},"name":"Max bytes"}],"meta":{"source":"logstash-*","statistics":{"totalCount":14004},"type":"esaggs"},"rows":[{"col-0-2":"200","col-1-1":12891,"col-2-1":19986},{"col-0-2":"404","col-1-1":696,"col-2-1":19881},{"col-0-2":"503","col-1-1":417,"col-2-1":0}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"legacyMetricVis","type":"render","value":{"canNavigateToLens":false,"visConfig":{"dimensions":{"metrics":[{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"},{"accessor":1,"format":{"id":"number"},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"excludeIsRegex":true,"field":"response.raw","includeIsRegex":true,"missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"emptyAsNull":false},"schema":"metric","type":"count"},"type":"number"},"name":"Count"},{"id":"col-2-1","meta":{"field":"bytes","index":"logstash-*","params":{"id":"bytes","params":null},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"field":"bytes"},"schema":"metric","type":"max"},"type":"number"},"name":"Max bytes"}],"meta":{"source":"logstash-*","statistics":{"totalCount":14004},"type":"esaggs"},"rows":[{"col-0-2":"200","col-1-1":12891,"col-2-1":19986},{"col-0-2":"404","col-1-1":696,"col-2-1":19881},{"col-0-2":"503","col-1-1":417,"col-2-1":0}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/baseline/metric_percentage_mode.json b/test/interpreter_functional/snapshots/baseline/metric_percentage_mode.json index 4ff228305a1d6..2bb96cbcb4c0a 100644 --- a/test/interpreter_functional/snapshots/baseline/metric_percentage_mode.json +++ b/test/interpreter_functional/snapshots/baseline/metric_percentage_mode.json @@ -1 +1 @@ -{"as":"legacyMetricVis","type":"render","value":{"visConfig":{"dimensions":{"metrics":[{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":{"colors":["rgb(0,0,0,0)","rgb(100, 100, 100)"],"continuity":"none","gradient":false,"range":"number","rangeMax":10000,"rangeMin":0,"stops":[0,10000]},"percentageMode":true,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"excludeIsRegex":true,"field":"response.raw","includeIsRegex":true,"missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"emptyAsNull":false},"schema":"metric","type":"count"},"type":"number"},"name":"Count"},{"id":"col-2-1","meta":{"field":"bytes","index":"logstash-*","params":{"id":"bytes","params":null},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"field":"bytes"},"schema":"metric","type":"max"},"type":"number"},"name":"Max bytes"}],"meta":{"source":"logstash-*","statistics":{"totalCount":14004},"type":"esaggs"},"rows":[{"col-0-2":"200","col-1-1":12891,"col-2-1":19986},{"col-0-2":"404","col-1-1":696,"col-2-1":19881},{"col-0-2":"503","col-1-1":417,"col-2-1":0}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"legacyMetricVis","type":"render","value":{"canNavigateToLens":false,"visConfig":{"dimensions":{"metrics":[{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":{"colors":["rgb(0,0,0,0)","rgb(100, 100, 100)"],"continuity":"none","gradient":false,"range":"number","rangeMax":10000,"rangeMin":0,"stops":[0,10000]},"percentageMode":true,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"excludeIsRegex":true,"field":"response.raw","includeIsRegex":true,"missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"emptyAsNull":false},"schema":"metric","type":"count"},"type":"number"},"name":"Count"},{"id":"col-2-1","meta":{"field":"bytes","index":"logstash-*","params":{"id":"bytes","params":null},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"field":"bytes"},"schema":"metric","type":"max"},"type":"number"},"name":"Max bytes"}],"meta":{"source":"logstash-*","statistics":{"totalCount":14004},"type":"esaggs"},"rows":[{"col-0-2":"200","col-1-1":12891,"col-2-1":19986},{"col-0-2":"404","col-1-1":696,"col-2-1":19881},{"col-0-2":"503","col-1-1":417,"col-2-1":0}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/baseline/metric_single_metric_data.json b/test/interpreter_functional/snapshots/baseline/metric_single_metric_data.json index 7a91e2cae2bab..2c9c785e4ab2a 100644 --- a/test/interpreter_functional/snapshots/baseline/metric_single_metric_data.json +++ b/test/interpreter_functional/snapshots/baseline/metric_single_metric_data.json @@ -1 +1 @@ -{"as":"legacyMetricVis","type":"render","value":{"visConfig":{"dimensions":{"metrics":[{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"excludeIsRegex":true,"field":"response.raw","includeIsRegex":true,"missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"emptyAsNull":false},"schema":"metric","type":"count"},"type":"number"},"name":"Count"},{"id":"col-2-1","meta":{"field":"bytes","index":"logstash-*","params":{"id":"bytes","params":null},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"field":"bytes"},"schema":"metric","type":"max"},"type":"number"},"name":"Max bytes"}],"meta":{"source":"logstash-*","statistics":{"totalCount":14004},"type":"esaggs"},"rows":[{"col-0-2":"200","col-1-1":12891,"col-2-1":19986},{"col-0-2":"404","col-1-1":696,"col-2-1":19881},{"col-0-2":"503","col-1-1":417,"col-2-1":0}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"legacyMetricVis","type":"render","value":{"canNavigateToLens":false,"visConfig":{"dimensions":{"metrics":[{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"excludeIsRegex":true,"field":"response.raw","includeIsRegex":true,"missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"emptyAsNull":false},"schema":"metric","type":"count"},"type":"number"},"name":"Count"},{"id":"col-2-1","meta":{"field":"bytes","index":"logstash-*","params":{"id":"bytes","params":null},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"field":"bytes"},"schema":"metric","type":"max"},"type":"number"},"name":"Max bytes"}],"meta":{"source":"logstash-*","statistics":{"totalCount":14004},"type":"esaggs"},"rows":[{"col-0-2":"200","col-1-1":12891,"col-2-1":19986},{"col-0-2":"404","col-1-1":696,"col-2-1":19881},{"col-0-2":"503","col-1-1":417,"col-2-1":0}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/session/metric_all_data.json b/test/interpreter_functional/snapshots/session/metric_all_data.json index 1c7a6cb857ed1..3b8553435624f 100644 --- a/test/interpreter_functional/snapshots/session/metric_all_data.json +++ b/test/interpreter_functional/snapshots/session/metric_all_data.json @@ -1 +1 @@ -{"as":"legacyMetricVis","type":"render","value":{"visConfig":{"dimensions":{"bucket":{"accessor":2,"format":{"id":"bytes","params":null},"type":"vis_dimension"},"metrics":[{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"excludeIsRegex":true,"field":"response.raw","includeIsRegex":true,"missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"emptyAsNull":false},"schema":"metric","type":"count"},"type":"number"},"name":"Count"},{"id":"col-2-1","meta":{"field":"bytes","index":"logstash-*","params":{"id":"bytes","params":null},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"field":"bytes"},"schema":"metric","type":"max"},"type":"number"},"name":"Max bytes"}],"meta":{"source":"logstash-*","statistics":{"totalCount":14004},"type":"esaggs"},"rows":[{"col-0-2":"200","col-1-1":12891,"col-2-1":19986},{"col-0-2":"404","col-1-1":696,"col-2-1":19881},{"col-0-2":"503","col-1-1":417,"col-2-1":0}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"legacyMetricVis","type":"render","value":{"canNavigateToLens":false,"visConfig":{"dimensions":{"bucket":{"accessor":2,"format":{"id":"bytes","params":null},"type":"vis_dimension"},"metrics":[{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"excludeIsRegex":true,"field":"response.raw","includeIsRegex":true,"missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"emptyAsNull":false},"schema":"metric","type":"count"},"type":"number"},"name":"Count"},{"id":"col-2-1","meta":{"field":"bytes","index":"logstash-*","params":{"id":"bytes","params":null},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"field":"bytes"},"schema":"metric","type":"max"},"type":"number"},"name":"Max bytes"}],"meta":{"source":"logstash-*","statistics":{"totalCount":14004},"type":"esaggs"},"rows":[{"col-0-2":"200","col-1-1":12891,"col-2-1":19986},{"col-0-2":"404","col-1-1":696,"col-2-1":19881},{"col-0-2":"503","col-1-1":417,"col-2-1":0}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/session/metric_empty_data.json b/test/interpreter_functional/snapshots/session/metric_empty_data.json index 1f93a487bee2b..ef645bdb30afd 100644 --- a/test/interpreter_functional/snapshots/session/metric_empty_data.json +++ b/test/interpreter_functional/snapshots/session/metric_empty_data.json @@ -1 +1 @@ -{"as":"legacyMetricVis","type":"render","value":{"visConfig":{"dimensions":{"metrics":[{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"excludeIsRegex":true,"field":"response.raw","includeIsRegex":true,"missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"emptyAsNull":false},"schema":"metric","type":"count"},"type":"number"},"name":"Count"},{"id":"col-2-1","meta":{"field":"bytes","index":"logstash-*","params":{"id":"bytes","params":null},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"field":"bytes"},"schema":"metric","type":"max"},"type":"number"},"name":"Max bytes"}],"meta":{"source":"logstash-*","statistics":{"totalCount":14004},"type":"esaggs"},"rows":[],"type":"datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"legacyMetricVis","type":"render","value":{"canNavigateToLens":false,"visConfig":{"dimensions":{"metrics":[{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"excludeIsRegex":true,"field":"response.raw","includeIsRegex":true,"missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"emptyAsNull":false},"schema":"metric","type":"count"},"type":"number"},"name":"Count"},{"id":"col-2-1","meta":{"field":"bytes","index":"logstash-*","params":{"id":"bytes","params":null},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"field":"bytes"},"schema":"metric","type":"max"},"type":"number"},"name":"Max bytes"}],"meta":{"source":"logstash-*","statistics":{"totalCount":14004},"type":"esaggs"},"rows":[],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/session/metric_multi_metric_data.json b/test/interpreter_functional/snapshots/session/metric_multi_metric_data.json index 78135325fac66..90d572ab720f0 100644 --- a/test/interpreter_functional/snapshots/session/metric_multi_metric_data.json +++ b/test/interpreter_functional/snapshots/session/metric_multi_metric_data.json @@ -1 +1 @@ -{"as":"legacyMetricVis","type":"render","value":{"visConfig":{"dimensions":{"metrics":[{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"},{"accessor":1,"format":{"id":"number"},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"excludeIsRegex":true,"field":"response.raw","includeIsRegex":true,"missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"emptyAsNull":false},"schema":"metric","type":"count"},"type":"number"},"name":"Count"},{"id":"col-2-1","meta":{"field":"bytes","index":"logstash-*","params":{"id":"bytes","params":null},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"field":"bytes"},"schema":"metric","type":"max"},"type":"number"},"name":"Max bytes"}],"meta":{"source":"logstash-*","statistics":{"totalCount":14004},"type":"esaggs"},"rows":[{"col-0-2":"200","col-1-1":12891,"col-2-1":19986},{"col-0-2":"404","col-1-1":696,"col-2-1":19881},{"col-0-2":"503","col-1-1":417,"col-2-1":0}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"legacyMetricVis","type":"render","value":{"canNavigateToLens":false,"visConfig":{"dimensions":{"metrics":[{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"},{"accessor":1,"format":{"id":"number"},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"excludeIsRegex":true,"field":"response.raw","includeIsRegex":true,"missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"emptyAsNull":false},"schema":"metric","type":"count"},"type":"number"},"name":"Count"},{"id":"col-2-1","meta":{"field":"bytes","index":"logstash-*","params":{"id":"bytes","params":null},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"field":"bytes"},"schema":"metric","type":"max"},"type":"number"},"name":"Max bytes"}],"meta":{"source":"logstash-*","statistics":{"totalCount":14004},"type":"esaggs"},"rows":[{"col-0-2":"200","col-1-1":12891,"col-2-1":19986},{"col-0-2":"404","col-1-1":696,"col-2-1":19881},{"col-0-2":"503","col-1-1":417,"col-2-1":0}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/session/metric_percentage_mode.json b/test/interpreter_functional/snapshots/session/metric_percentage_mode.json index 4ff228305a1d6..2bb96cbcb4c0a 100644 --- a/test/interpreter_functional/snapshots/session/metric_percentage_mode.json +++ b/test/interpreter_functional/snapshots/session/metric_percentage_mode.json @@ -1 +1 @@ -{"as":"legacyMetricVis","type":"render","value":{"visConfig":{"dimensions":{"metrics":[{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":{"colors":["rgb(0,0,0,0)","rgb(100, 100, 100)"],"continuity":"none","gradient":false,"range":"number","rangeMax":10000,"rangeMin":0,"stops":[0,10000]},"percentageMode":true,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"excludeIsRegex":true,"field":"response.raw","includeIsRegex":true,"missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"emptyAsNull":false},"schema":"metric","type":"count"},"type":"number"},"name":"Count"},{"id":"col-2-1","meta":{"field":"bytes","index":"logstash-*","params":{"id":"bytes","params":null},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"field":"bytes"},"schema":"metric","type":"max"},"type":"number"},"name":"Max bytes"}],"meta":{"source":"logstash-*","statistics":{"totalCount":14004},"type":"esaggs"},"rows":[{"col-0-2":"200","col-1-1":12891,"col-2-1":19986},{"col-0-2":"404","col-1-1":696,"col-2-1":19881},{"col-0-2":"503","col-1-1":417,"col-2-1":0}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"legacyMetricVis","type":"render","value":{"canNavigateToLens":false,"visConfig":{"dimensions":{"metrics":[{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":{"colors":["rgb(0,0,0,0)","rgb(100, 100, 100)"],"continuity":"none","gradient":false,"range":"number","rangeMax":10000,"rangeMin":0,"stops":[0,10000]},"percentageMode":true,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"excludeIsRegex":true,"field":"response.raw","includeIsRegex":true,"missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"emptyAsNull":false},"schema":"metric","type":"count"},"type":"number"},"name":"Count"},{"id":"col-2-1","meta":{"field":"bytes","index":"logstash-*","params":{"id":"bytes","params":null},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"field":"bytes"},"schema":"metric","type":"max"},"type":"number"},"name":"Max bytes"}],"meta":{"source":"logstash-*","statistics":{"totalCount":14004},"type":"esaggs"},"rows":[{"col-0-2":"200","col-1-1":12891,"col-2-1":19986},{"col-0-2":"404","col-1-1":696,"col-2-1":19881},{"col-0-2":"503","col-1-1":417,"col-2-1":0}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/session/metric_single_metric_data.json b/test/interpreter_functional/snapshots/session/metric_single_metric_data.json index 7a91e2cae2bab..2c9c785e4ab2a 100644 --- a/test/interpreter_functional/snapshots/session/metric_single_metric_data.json +++ b/test/interpreter_functional/snapshots/session/metric_single_metric_data.json @@ -1 +1 @@ -{"as":"legacyMetricVis","type":"render","value":{"visConfig":{"dimensions":{"metrics":[{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"excludeIsRegex":true,"field":"response.raw","includeIsRegex":true,"missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"emptyAsNull":false},"schema":"metric","type":"count"},"type":"number"},"name":"Count"},{"id":"col-2-1","meta":{"field":"bytes","index":"logstash-*","params":{"id":"bytes","params":null},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"field":"bytes"},"schema":"metric","type":"max"},"type":"number"},"name":"Max bytes"}],"meta":{"source":"logstash-*","statistics":{"totalCount":14004},"type":"esaggs"},"rows":[{"col-0-2":"200","col-1-1":12891,"col-2-1":19986},{"col-0-2":"404","col-1-1":696,"col-2-1":19881},{"col-0-2":"503","col-1-1":417,"col-2-1":0}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"legacyMetricVis","type":"render","value":{"canNavigateToLens":false,"visConfig":{"dimensions":{"metrics":[{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"excludeIsRegex":true,"field":"response.raw","includeIsRegex":true,"missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"emptyAsNull":false},"schema":"metric","type":"count"},"type":"number"},"name":"Count"},{"id":"col-2-1","meta":{"field":"bytes","index":"logstash-*","params":{"id":"bytes","params":null},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"field":"bytes"},"schema":"metric","type":"max"},"type":"number"},"name":"Max bytes"}],"meta":{"source":"logstash-*","statistics":{"totalCount":14004},"type":"esaggs"},"rows":[{"col-0-2":"200","col-1-1":12891,"col-2-1":19986},{"col-0-2":"404","col-1-1":696,"col-2-1":19881},{"col-0-2":"503","col-1-1":417,"col-2-1":0}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file From 409661e5ee59793afe1465a1c3c010f3e5881220 Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Wed, 5 Oct 2022 11:08:48 +0300 Subject: [PATCH 09/43] Fixed types. --- .../__stories__/metric_renderer.stories.tsx | 1 + .../table/public/convert_to_lens/index.ts | 2 +- .../convert_to_lens/lib/metrics/metrics.ts | 2 +- x-pack/plugins/fleet/cypress.config.d.ts | 3 ++ x-pack/plugins/fleet/cypress.config.js | 40 +++++++++++++++++++ x-pack/plugins/osquery/cypress.config.d.ts | 3 ++ x-pack/plugins/osquery/cypress.config.js | 38 ++++++++++++++++++ 7 files changed, 87 insertions(+), 2 deletions(-) create mode 100644 x-pack/plugins/fleet/cypress.config.d.ts create mode 100644 x-pack/plugins/fleet/cypress.config.js create mode 100644 x-pack/plugins/osquery/cypress.config.d.ts create mode 100644 x-pack/plugins/osquery/cypress.config.js diff --git a/src/plugins/chart_expressions/expression_legacy_metric/public/__stories__/metric_renderer.stories.tsx b/src/plugins/chart_expressions/expression_legacy_metric/public/__stories__/metric_renderer.stories.tsx index 36fc6cd712f83..ba2835806f4f5 100644 --- a/src/plugins/chart_expressions/expression_legacy_metric/public/__stories__/metric_renderer.stories.tsx +++ b/src/plugins/chart_expressions/expression_legacy_metric/public/__stories__/metric_renderer.stories.tsx @@ -43,6 +43,7 @@ const style: MetricStyle = { }; const config: MetricVisRenderConfig = { + canNavigateToLens: false, visType, visData: { type: 'datatable', diff --git a/src/plugins/vis_types/table/public/convert_to_lens/index.ts b/src/plugins/vis_types/table/public/convert_to_lens/index.ts index e236c36e82a10..10db3c3bac607 100644 --- a/src/plugins/vis_types/table/public/convert_to_lens/index.ts +++ b/src/plugins/vis_types/table/public/convert_to_lens/index.ts @@ -54,7 +54,7 @@ export const convertToLens: ConvertTableToLensVisualization = async (vis, timefi buckets: ['bucket'], splits: ['split_row', 'split_column'], }, - { dropEmptyRowsInDateHistogram: true } + { dropEmptyRowsInDateHistogram: true, isPercentageColumn: false } ); if (result === null) { diff --git a/src/plugins/visualizations/common/convert_to_lens/lib/metrics/metrics.ts b/src/plugins/visualizations/common/convert_to_lens/lib/metrics/metrics.ts index aa88a835f3895..ac6072336e81d 100644 --- a/src/plugins/visualizations/common/convert_to_lens/lib/metrics/metrics.ts +++ b/src/plugins/visualizations/common/convert_to_lens/lib/metrics/metrics.ts @@ -28,7 +28,7 @@ export const convertMetricToColumns = ( agg: SchemaConfig, dataView: DataView, aggs: Array>, - percentageModeConfig: PercentageModeConfig + percentageModeConfig: PercentageModeConfig = { isPercentageColumn: false } ): AggBasedColumn[] | null => { const supportedAgg = SUPPORTED_METRICS[agg.aggType]; if (!supportedAgg) { diff --git a/x-pack/plugins/fleet/cypress.config.d.ts b/x-pack/plugins/fleet/cypress.config.d.ts new file mode 100644 index 0000000000000..42cd75f66e3c9 --- /dev/null +++ b/x-pack/plugins/fleet/cypress.config.d.ts @@ -0,0 +1,3 @@ +/// +declare const _default: Cypress.ConfigOptions; +export default _default; diff --git a/x-pack/plugins/fleet/cypress.config.js b/x-pack/plugins/fleet/cypress.config.js new file mode 100644 index 0000000000000..523c0b56b202e --- /dev/null +++ b/x-pack/plugins/fleet/cypress.config.js @@ -0,0 +1,40 @@ +"use strict"; +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +// eslint-disable-next-line import/no-extraneous-dependencies +const cypress_1 = require("cypress"); +// eslint-disable-next-line import/no-default-export +exports.default = (0, cypress_1.defineConfig)({ + defaultCommandTimeout: 60000, + requestTimeout: 60000, + responseTimeout: 60000, + execTimeout: 120000, + pageLoadTimeout: 120000, + retries: { + runMode: 2, + }, + screenshotsFolder: '../../../target/kibana-fleet/cypress/screenshots', + trashAssetsBeforeRuns: false, + video: false, + videosFolder: '../../../target/kibana-fleet/cypress/videos', + viewportHeight: 900, + viewportWidth: 1440, + screenshotOnRunFailure: true, + env: { + protocol: 'http', + hostname: 'localhost', + configport: '5601', + }, + e2e: { + baseUrl: 'http://localhost:5601', + setupNodeEvents(on, config) { + // eslint-disable-next-line @typescript-eslint/no-var-requires, @kbn/imports/no_boundary_crossing + return require('./cypress/plugins')(on, config); + }, + }, +}); diff --git a/x-pack/plugins/osquery/cypress.config.d.ts b/x-pack/plugins/osquery/cypress.config.d.ts new file mode 100644 index 0000000000000..42cd75f66e3c9 --- /dev/null +++ b/x-pack/plugins/osquery/cypress.config.d.ts @@ -0,0 +1,3 @@ +/// +declare const _default: Cypress.ConfigOptions; +export default _default; diff --git a/x-pack/plugins/osquery/cypress.config.js b/x-pack/plugins/osquery/cypress.config.js new file mode 100644 index 0000000000000..9d04870a490bf --- /dev/null +++ b/x-pack/plugins/osquery/cypress.config.js @@ -0,0 +1,38 @@ +"use strict"; +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +// eslint-disable-next-line import/no-extraneous-dependencies +const cypress_1 = require("cypress"); +// eslint-disable-next-line import/no-default-export +exports.default = (0, cypress_1.defineConfig)({ + defaultCommandTimeout: 60000, + execTimeout: 120000, + pageLoadTimeout: 12000, + retries: { + runMode: 1, + openMode: 0, + }, + screenshotsFolder: '../../../target/kibana-osquery/cypress/screenshots', + trashAssetsBeforeRuns: false, + video: false, + videosFolder: '../../../target/kibana-osquery/cypress/videos', + viewportHeight: 900, + viewportWidth: 1440, + experimentalStudio: true, + env: { + 'cypress-react-selector': { + root: '#osquery-app', + }, + }, + e2e: { + baseUrl: 'http://localhost:5601', + setupNodeEvents(on, config) { + // implement node event listeners here + }, + }, +}); From 8369a3106020a28a22a5f04739f13b812e8d6fdc Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Wed, 5 Oct 2022 11:26:12 +0300 Subject: [PATCH 10/43] Fixed checks. --- x-pack/plugins/fleet/cypress.config.d.ts | 3 -- x-pack/plugins/fleet/cypress.config.js | 40 ---------------------- x-pack/plugins/osquery/cypress.config.d.ts | 3 -- x-pack/plugins/osquery/cypress.config.js | 38 -------------------- 4 files changed, 84 deletions(-) delete mode 100644 x-pack/plugins/fleet/cypress.config.d.ts delete mode 100644 x-pack/plugins/fleet/cypress.config.js delete mode 100644 x-pack/plugins/osquery/cypress.config.d.ts delete mode 100644 x-pack/plugins/osquery/cypress.config.js diff --git a/x-pack/plugins/fleet/cypress.config.d.ts b/x-pack/plugins/fleet/cypress.config.d.ts deleted file mode 100644 index 42cd75f66e3c9..0000000000000 --- a/x-pack/plugins/fleet/cypress.config.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -/// -declare const _default: Cypress.ConfigOptions; -export default _default; diff --git a/x-pack/plugins/fleet/cypress.config.js b/x-pack/plugins/fleet/cypress.config.js deleted file mode 100644 index 523c0b56b202e..0000000000000 --- a/x-pack/plugins/fleet/cypress.config.js +++ /dev/null @@ -1,40 +0,0 @@ -"use strict"; -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -// eslint-disable-next-line import/no-extraneous-dependencies -const cypress_1 = require("cypress"); -// eslint-disable-next-line import/no-default-export -exports.default = (0, cypress_1.defineConfig)({ - defaultCommandTimeout: 60000, - requestTimeout: 60000, - responseTimeout: 60000, - execTimeout: 120000, - pageLoadTimeout: 120000, - retries: { - runMode: 2, - }, - screenshotsFolder: '../../../target/kibana-fleet/cypress/screenshots', - trashAssetsBeforeRuns: false, - video: false, - videosFolder: '../../../target/kibana-fleet/cypress/videos', - viewportHeight: 900, - viewportWidth: 1440, - screenshotOnRunFailure: true, - env: { - protocol: 'http', - hostname: 'localhost', - configport: '5601', - }, - e2e: { - baseUrl: 'http://localhost:5601', - setupNodeEvents(on, config) { - // eslint-disable-next-line @typescript-eslint/no-var-requires, @kbn/imports/no_boundary_crossing - return require('./cypress/plugins')(on, config); - }, - }, -}); diff --git a/x-pack/plugins/osquery/cypress.config.d.ts b/x-pack/plugins/osquery/cypress.config.d.ts deleted file mode 100644 index 42cd75f66e3c9..0000000000000 --- a/x-pack/plugins/osquery/cypress.config.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -/// -declare const _default: Cypress.ConfigOptions; -export default _default; diff --git a/x-pack/plugins/osquery/cypress.config.js b/x-pack/plugins/osquery/cypress.config.js deleted file mode 100644 index 9d04870a490bf..0000000000000 --- a/x-pack/plugins/osquery/cypress.config.js +++ /dev/null @@ -1,38 +0,0 @@ -"use strict"; -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -// eslint-disable-next-line import/no-extraneous-dependencies -const cypress_1 = require("cypress"); -// eslint-disable-next-line import/no-default-export -exports.default = (0, cypress_1.defineConfig)({ - defaultCommandTimeout: 60000, - execTimeout: 120000, - pageLoadTimeout: 12000, - retries: { - runMode: 1, - openMode: 0, - }, - screenshotsFolder: '../../../target/kibana-osquery/cypress/screenshots', - trashAssetsBeforeRuns: false, - video: false, - videosFolder: '../../../target/kibana-osquery/cypress/videos', - viewportHeight: 900, - viewportWidth: 1440, - experimentalStudio: true, - env: { - 'cypress-react-selector': { - root: '#osquery-app', - }, - }, - e2e: { - baseUrl: 'http://localhost:5601', - setupNodeEvents(on, config) { - // implement node event listeners here - }, - }, -}); From e1f1c1ab69dba714f8a88176023b2b54e786d2da Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Wed, 5 Oct 2022 11:47:31 +0300 Subject: [PATCH 11/43] Added tests for convertToColumnInPercentageMode. --- .../lib/convert/percentage_mode.test.ts | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 src/plugins/visualizations/common/convert_to_lens/lib/convert/percentage_mode.test.ts diff --git a/src/plugins/visualizations/common/convert_to_lens/lib/convert/percentage_mode.test.ts b/src/plugins/visualizations/common/convert_to_lens/lib/convert/percentage_mode.test.ts new file mode 100644 index 0000000000000..3b7e8ad7e797f --- /dev/null +++ b/src/plugins/visualizations/common/convert_to_lens/lib/convert/percentage_mode.test.ts @@ -0,0 +1,67 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { METRIC_TYPES } from '@kbn/data-plugin/common'; +import { stubLogstashDataView } from '@kbn/data-views-plugin/common/data_view.stub'; +import { SchemaConfig } from '../../..'; +import { convertToColumnInPercentageMode } from './percentage_mode'; + +const mockGetFormulaForAgg = jest.fn(); + +jest.mock('../metrics/formula', () => ({ + getFormulaForAgg: jest.fn(() => mockGetFormulaForAgg()), +})); + +describe('convertToColumnInPercentageMode', () => { + const formula = 'average(some_field)'; + const dataView = stubLogstashDataView; + + const agg: SchemaConfig = { + accessor: 0, + label: '', + format: { + id: undefined, + params: undefined, + }, + params: {}, + aggType: METRIC_TYPES.AVG, + aggParams: { + field: dataView.fields[0].displayName, + }, + }; + + beforeEach(() => { + jest.clearAllMocks(); + mockGetFormulaForAgg.mockReturnValue(formula); + }); + + test('should return null if it is not possible to build the valid formula', () => { + mockGetFormulaForAgg.mockReturnValue(null); + expect(convertToColumnInPercentageMode({ agg, dataView, aggs: [agg] }, {})).toBeNull(); + }); + + test('should return percentage mode over range formula if min and max was passed', () => { + const formulaColumn = { + operationType: 'formula', + params: { format: { id: 'percent' }, formula: `((${formula}) - 0) / (100 - 0)` }, + }; + expect( + convertToColumnInPercentageMode({ agg, dataView, aggs: [agg] }, { min: 0, max: 100 }) + ).toEqual(expect.objectContaining(formulaColumn)); + }); + + test('should return percentage mode formula if min and max was not passed', () => { + const formulaColumn = { + operationType: 'formula', + params: { format: { id: 'percent' }, formula: `(${formula}) / 10000` }, + }; + expect(convertToColumnInPercentageMode({ agg, dataView, aggs: [agg] }, {})).toEqual( + expect.objectContaining(formulaColumn) + ); + }); +}); From c1765c93e4ce4da5882ff1240cc3bc2a41bedbe7 Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Wed, 5 Oct 2022 12:40:13 +0300 Subject: [PATCH 12/43] Added unit tests for convertToLens. --- .../public/convert_to_lens/index.test.ts | 144 ++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 src/plugins/vis_types/metric/public/convert_to_lens/index.test.ts diff --git a/src/plugins/vis_types/metric/public/convert_to_lens/index.test.ts b/src/plugins/vis_types/metric/public/convert_to_lens/index.test.ts new file mode 100644 index 0000000000000..015b19157e91a --- /dev/null +++ b/src/plugins/vis_types/metric/public/convert_to_lens/index.test.ts @@ -0,0 +1,144 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { ColorSchemas } from '@kbn/charts-plugin/common'; +import { Vis } from '@kbn/visualizations-plugin/public'; +import { convertToLens } from '.'; +import { VisParams } from '../types'; + +const mockGetColumnsFromVis = jest.fn(); +const mockGetPercentageColumnFormulaColumn = jest.fn(); +const mockGetConfiguration = jest.fn().mockReturnValue({}); +const mockGetPercentageModeConfig = jest.fn(); + +jest.mock('../services', () => ({ + getDataViewsStart: jest.fn(() => ({ get: () => ({}), getDefault: () => ({}) })), +})); + +jest.mock('@kbn/visualizations-plugin/public', () => ({ + convertToLensModule: Promise.resolve({ + getColumnsFromVis: jest.fn(() => mockGetColumnsFromVis()), + getPercentageColumnFormulaColumn: jest.fn(() => mockGetPercentageColumnFormulaColumn()), + }), + getDataViewByIndexPatternId: jest.fn(() => ({ id: 'index-pattern' })), +})); + +jest.mock('./configurations', () => ({ + getConfiguration: jest.fn(() => mockGetConfiguration()), + getPercentageModeConfig: jest.fn(() => mockGetPercentageModeConfig()), +})); + +const params: VisParams = { + addTooltip: false, + addLegend: false, + dimensions: {} as VisParams['dimensions'], + metric: { + percentageMode: false, + percentageFormatPattern: '', + useRanges: false, + colorSchema: ColorSchemas.Greys, + metricColorMode: 'None', + colorsRange: [], + labels: {}, + invertColors: false, + style: { + bgFill: '', + bgColor: false, + labelColor: false, + subText: '', + fontSize: 10, + }, + }, + type: 'metric', +}; + +const vis = { + isHierarchical: () => false, + type: {}, + params, + data: {}, +} as unknown as Vis; + +const timefilter = { + getAbsoluteTime: () => {}, +} as any; + +describe('convertToLens', () => { + afterEach(() => { + jest.clearAllMocks(); + }); + + test('should return null if getColumnsFromVis returns null', async () => { + mockGetColumnsFromVis.mockReturnValue(null); + const result = await convertToLens(vis, timefilter); + expect(mockGetColumnsFromVis).toBeCalledTimes(1); + expect(result).toBeNull(); + }); + + test('should return null if metrics count is more than 1', async () => { + mockGetColumnsFromVis.mockReturnValue({ + metrics: ['1', '2'], + columns: [{ columnId: '2' }, { columnId: '1' }], + }); + const result = await convertToLens(vis, timefilter); + expect(mockGetColumnsFromVis).toBeCalledTimes(1); + expect(result).toBeNull(); + }); + test('should return null if buckets count is more than 1', async () => { + mockGetColumnsFromVis.mockReturnValue({ + metrics: [], + buckets: ['1', '2'], + columns: [{ columnId: '2' }, { columnId: '1' }], + }); + const result = await convertToLens(vis, timefilter); + expect(mockGetColumnsFromVis).toBeCalledTimes(1); + expect(result).toBeNull(); + }); + + test('should return null if metric column data type is different from number', async () => { + mockGetColumnsFromVis.mockReturnValue({ + metrics: ['1'], + buckets: ['2'], + columns: [{ columnId: '2' }, { columnId: '1', dataType: 'string' }], + }); + const result = await convertToLens(vis, timefilter); + expect(mockGetColumnsFromVis).toBeCalledTimes(1); + expect(result).toBeNull(); + }); + test('should return correct state for valid vis', async () => { + const config = { + layerType: 'data', + metricAccessor: '1', + }; + + mockGetColumnsFromVis.mockReturnValue({ + metrics: ['1'], + buckets: ['2'], + columns: [{ columnId: '2' }, { columnId: '1', dataType: 'number' }], + columnsWithoutReferenced: [ + { columnId: '1', meta: { aggId: 'agg-1' } }, + { columnId: '2', meta: { aggId: 'agg-2' } }, + ], + }); + mockGetConfiguration.mockReturnValue(config); + + const result = await convertToLens(vis, timefilter); + expect(mockGetColumnsFromVis).toBeCalledTimes(1); + expect(mockGetConfiguration).toBeCalledTimes(1); + + expect(result?.type).toEqual('lnsMetric'); + expect(result?.layers.length).toEqual(1); + expect(result?.layers[0]).toEqual( + expect.objectContaining({ + columnOrder: [], + columns: [{ columnId: '2' }, { columnId: '1', dataType: 'number' }], + }) + ); + expect(result?.configuration).toEqual(config); + }); +}); From d1e384be2dbe020d774f6abdd6d21602aae9f516 Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Wed, 5 Oct 2022 14:13:01 +0300 Subject: [PATCH 13/43] Added tests for palette. --- .../configurations/palette.test.ts | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 src/plugins/vis_types/metric/public/convert_to_lens/configurations/palette.test.ts diff --git a/src/plugins/vis_types/metric/public/convert_to_lens/configurations/palette.test.ts b/src/plugins/vis_types/metric/public/convert_to_lens/configurations/palette.test.ts new file mode 100644 index 0000000000000..7458a78b7b554 --- /dev/null +++ b/src/plugins/vis_types/metric/public/convert_to_lens/configurations/palette.test.ts @@ -0,0 +1,79 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { ColorSchemas } from '@kbn/charts-plugin/common'; +import { VisParams } from '../../types'; +import { getPalette } from './palette'; + +describe('getPalette', () => { + const params: VisParams = { + addTooltip: false, + addLegend: false, + dimensions: {} as VisParams['dimensions'], + metric: { + percentageMode: false, + percentageFormatPattern: '', + useRanges: true, + colorSchema: ColorSchemas.Greys, + metricColorMode: 'Labels', + colorsRange: [ + { type: 'range', from: 0, to: 100 }, + { type: 'range', from: 100, to: 200 }, + { type: 'range', from: 200, to: 300 }, + ], + labels: {}, + invertColors: false, + style: {} as VisParams['metric']['style'], + }, + type: 'metric', + }; + + test('should return undefined if metricColorMode is `None`', () => { + const metricColorMode = 'None'; + const paramsWithNoneMetricColorMode: VisParams = { + ...params, + metric: { ...params.metric, metricColorMode }, + }; + expect(getPalette(paramsWithNoneMetricColorMode)).toBeUndefined(); + }); + + test('should return undefined if empty color ranges were passed', () => { + const paramsWithNoneMetricColorMode: VisParams = { + ...params, + metric: { ...params.metric, colorsRange: [] }, + }; + expect(getPalette(paramsWithNoneMetricColorMode)).toBeUndefined(); + }); + + test('should return correct palette', () => { + expect(getPalette(params)).toEqual({ + name: 'custom', + params: { + colorStops: [ + { color: '#FFFFFF', stop: 0 }, + { color: '#979797', stop: 100 }, + { color: '#000000', stop: 200 }, + ], + continuity: 'none', + maxSteps: 5, + name: 'custom', + progression: 'fixed', + rangeMax: 300, + rangeMin: 0, + rangeType: 'number', + reverse: false, + stops: [ + { color: '#FFFFFF', stop: 100 }, + { color: '#979797', stop: 200 }, + { color: '#000000', stop: 300 }, + ], + }, + type: 'palette', + }); + }); +}); From 0bf4eb607337d8f58981edfa5f51d279fcf700c1 Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Wed, 5 Oct 2022 14:23:08 +0300 Subject: [PATCH 14/43] Added tests for getPercentageModeConfig --- .../configurations/index.test.ts | 51 ++++++++++ .../convert_to_lens/configurations/index.ts | 4 +- .../table/public/convert_to_lens/index.ts | 2 +- .../lib/metrics/metrics.test.ts | 96 +++++++++---------- .../convert_to_lens/lib/metrics/metrics.ts | 6 +- .../common/convert_to_lens/types/common.ts | 4 +- .../public/convert_to_lens/schemas.ts | 2 +- 7 files changed, 108 insertions(+), 57 deletions(-) create mode 100644 src/plugins/vis_types/metric/public/convert_to_lens/configurations/index.test.ts diff --git a/src/plugins/vis_types/metric/public/convert_to_lens/configurations/index.test.ts b/src/plugins/vis_types/metric/public/convert_to_lens/configurations/index.test.ts new file mode 100644 index 0000000000000..45ff99338ddc4 --- /dev/null +++ b/src/plugins/vis_types/metric/public/convert_to_lens/configurations/index.test.ts @@ -0,0 +1,51 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { ColorSchemas } from '@kbn/charts-plugin/common'; +import { getPercentageModeConfig } from '.'; +import { VisParams } from '../../types'; + +describe('getPercentageModeConfig', () => { + const params: VisParams = { + addTooltip: false, + addLegend: false, + dimensions: {} as VisParams['dimensions'], + metric: { + percentageMode: false, + percentageFormatPattern: '', + useRanges: true, + colorSchema: ColorSchemas.Greys, + metricColorMode: 'Labels', + colorsRange: [ + { type: 'range', from: 0, to: 100 }, + { type: 'range', from: 100, to: 200 }, + { type: 'range', from: 200, to: 300 }, + ], + labels: {}, + invertColors: false, + style: {} as VisParams['metric']['style'], + }, + type: 'metric', + }; + + test('should return falsy percentage mode if percentage mode is off', () => { + expect(getPercentageModeConfig(params)).toEqual({ isPercentageMode: false }); + }); + + test('should return falsy percentage mode if metric color mode is `None`', () => { + expect( + getPercentageModeConfig({ ...params, metric: { ...params.metric, metricColorMode: `None` } }) + ).toEqual({ isPercentageMode: false }); + }); + + test('should return percentage mode config', () => { + expect( + getPercentageModeConfig({ ...params, metric: { ...params.metric, percentageMode: true } }) + ).toEqual({ isPercentageMode: true, min: 0, max: 300 }); + }); +}); diff --git a/src/plugins/vis_types/metric/public/convert_to_lens/configurations/index.ts b/src/plugins/vis_types/metric/public/convert_to_lens/configurations/index.ts index ad68dd5e263b6..c6c59e7216322 100644 --- a/src/plugins/vis_types/metric/public/convert_to_lens/configurations/index.ts +++ b/src/plugins/vis_types/metric/public/convert_to_lens/configurations/index.ts @@ -13,11 +13,11 @@ import { getPalette } from './palette'; export const getPercentageModeConfig = (params: VisParams): PercentageModeConfig => { if (!params.metric.percentageMode || params.metric.metricColorMode === 'None') { - return { isPercentageColumn: params.metric.percentageMode }; + return { isPercentageMode: params.metric.percentageMode }; } const { colorsRange } = params.metric; return { - isPercentageColumn: true, + isPercentageMode: true, min: colorsRange[0].from, max: colorsRange[colorsRange.length - 1].to, }; diff --git a/src/plugins/vis_types/table/public/convert_to_lens/index.ts b/src/plugins/vis_types/table/public/convert_to_lens/index.ts index 10db3c3bac607..1b37e36f1d982 100644 --- a/src/plugins/vis_types/table/public/convert_to_lens/index.ts +++ b/src/plugins/vis_types/table/public/convert_to_lens/index.ts @@ -54,7 +54,7 @@ export const convertToLens: ConvertTableToLensVisualization = async (vis, timefi buckets: ['bucket'], splits: ['split_row', 'split_column'], }, - { dropEmptyRowsInDateHistogram: true, isPercentageColumn: false } + { dropEmptyRowsInDateHistogram: true, isPercentageMode: false } ); if (result === null) { diff --git a/src/plugins/visualizations/common/convert_to_lens/lib/metrics/metrics.test.ts b/src/plugins/visualizations/common/convert_to_lens/lib/metrics/metrics.test.ts index 740dc7341c324..207dedd133bc9 100644 --- a/src/plugins/visualizations/common/convert_to_lens/lib/metrics/metrics.test.ts +++ b/src/plugins/visualizations/common/convert_to_lens/lib/metrics/metrics.test.ts @@ -62,7 +62,7 @@ describe('convertMetricToColumns invalid cases', () => { { aggType: METRIC_TYPES.GEO_BOUNDS } as unknown as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], null, undefined, @@ -73,7 +73,7 @@ describe('convertMetricToColumns invalid cases', () => { { aggType: METRIC_TYPES.AVG } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], null, mockConvertMetricAggregationColumnWithoutSpecialParams, @@ -84,7 +84,7 @@ describe('convertMetricToColumns invalid cases', () => { { aggType: METRIC_TYPES.MIN } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], null, mockConvertMetricAggregationColumnWithoutSpecialParams, @@ -95,7 +95,7 @@ describe('convertMetricToColumns invalid cases', () => { { aggType: METRIC_TYPES.MAX } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], null, mockConvertMetricAggregationColumnWithoutSpecialParams, @@ -106,7 +106,7 @@ describe('convertMetricToColumns invalid cases', () => { { aggType: METRIC_TYPES.SUM } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], null, mockConvertMetricAggregationColumnWithoutSpecialParams, @@ -117,7 +117,7 @@ describe('convertMetricToColumns invalid cases', () => { { aggType: METRIC_TYPES.COUNT } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], null, mockConvertMetricAggregationColumnWithoutSpecialParams, @@ -128,7 +128,7 @@ describe('convertMetricToColumns invalid cases', () => { { aggType: METRIC_TYPES.CARDINALITY } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], null, mockConvertMetricAggregationColumnWithoutSpecialParams, @@ -139,7 +139,7 @@ describe('convertMetricToColumns invalid cases', () => { { aggType: METRIC_TYPES.VALUE_COUNT } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], null, mockConvertMetricAggregationColumnWithoutSpecialParams, @@ -150,7 +150,7 @@ describe('convertMetricToColumns invalid cases', () => { { aggType: METRIC_TYPES.MEDIAN } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], null, mockConvertMetricAggregationColumnWithoutSpecialParams, @@ -161,7 +161,7 @@ describe('convertMetricToColumns invalid cases', () => { { aggType: METRIC_TYPES.STD_DEV } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], null, mockConvertToStdDeviationFormulaColumns, @@ -172,7 +172,7 @@ describe('convertMetricToColumns invalid cases', () => { { aggType: METRIC_TYPES.PERCENTILES } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], null, mockConvertToPercentileColumn, @@ -183,7 +183,7 @@ describe('convertMetricToColumns invalid cases', () => { { aggType: METRIC_TYPES.SINGLE_PERCENTILE } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], null, mockConvertToPercentileColumn, @@ -194,7 +194,7 @@ describe('convertMetricToColumns invalid cases', () => { { aggType: METRIC_TYPES.PERCENTILE_RANKS } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], null, mockConvertToPercentileRankColumn, @@ -205,7 +205,7 @@ describe('convertMetricToColumns invalid cases', () => { { aggType: METRIC_TYPES.SINGLE_PERCENTILE_RANK } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], null, mockConvertToPercentileRankColumn, @@ -216,7 +216,7 @@ describe('convertMetricToColumns invalid cases', () => { { aggType: METRIC_TYPES.TOP_HITS } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], null, mockConvertToLastValueColumn, @@ -227,7 +227,7 @@ describe('convertMetricToColumns invalid cases', () => { { aggType: METRIC_TYPES.TOP_METRICS } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], null, mockConvertToLastValueColumn, @@ -238,7 +238,7 @@ describe('convertMetricToColumns invalid cases', () => { { aggType: METRIC_TYPES.CUMULATIVE_SUM } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], null, mockConvertToCumulativeSumAggColumn, @@ -249,7 +249,7 @@ describe('convertMetricToColumns invalid cases', () => { { aggType: METRIC_TYPES.DERIVATIVE } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], null, mockConvertToOtherParentPipelineAggColumns, @@ -260,7 +260,7 @@ describe('convertMetricToColumns invalid cases', () => { { aggType: METRIC_TYPES.MOVING_FN } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], null, mockConvertToOtherParentPipelineAggColumns, @@ -271,7 +271,7 @@ describe('convertMetricToColumns invalid cases', () => { { aggType: METRIC_TYPES.SUM_BUCKET } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], null, mockConvertToSiblingPipelineColumns, @@ -282,7 +282,7 @@ describe('convertMetricToColumns invalid cases', () => { { aggType: METRIC_TYPES.MIN_BUCKET } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], null, mockConvertToSiblingPipelineColumns, @@ -293,7 +293,7 @@ describe('convertMetricToColumns invalid cases', () => { { aggType: METRIC_TYPES.MAX_BUCKET } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], null, mockConvertToSiblingPipelineColumns, @@ -304,7 +304,7 @@ describe('convertMetricToColumns invalid cases', () => { { aggType: METRIC_TYPES.AVG_BUCKET } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], null, mockConvertToSiblingPipelineColumns, @@ -315,7 +315,7 @@ describe('convertMetricToColumns invalid cases', () => { { aggType: METRIC_TYPES.SERIAL_DIFF } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], null, undefined, @@ -356,7 +356,7 @@ describe('convertMetricToColumns valid cases', () => { { aggType: METRIC_TYPES.AVG } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], result, mockConvertMetricAggregationColumnWithoutSpecialParams, @@ -367,7 +367,7 @@ describe('convertMetricToColumns valid cases', () => { { aggType: METRIC_TYPES.MIN } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], result, mockConvertMetricAggregationColumnWithoutSpecialParams, @@ -378,7 +378,7 @@ describe('convertMetricToColumns valid cases', () => { { aggType: METRIC_TYPES.MAX } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], result, mockConvertMetricAggregationColumnWithoutSpecialParams, @@ -389,7 +389,7 @@ describe('convertMetricToColumns valid cases', () => { { aggType: METRIC_TYPES.SUM } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], result, mockConvertMetricAggregationColumnWithoutSpecialParams, @@ -400,7 +400,7 @@ describe('convertMetricToColumns valid cases', () => { { aggType: METRIC_TYPES.COUNT } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], result, mockConvertMetricAggregationColumnWithoutSpecialParams, @@ -411,7 +411,7 @@ describe('convertMetricToColumns valid cases', () => { { aggType: METRIC_TYPES.CARDINALITY } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], result, mockConvertMetricAggregationColumnWithoutSpecialParams, @@ -422,7 +422,7 @@ describe('convertMetricToColumns valid cases', () => { { aggType: METRIC_TYPES.VALUE_COUNT } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], result, mockConvertMetricAggregationColumnWithoutSpecialParams, @@ -433,7 +433,7 @@ describe('convertMetricToColumns valid cases', () => { { aggType: METRIC_TYPES.MEDIAN } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], result, mockConvertMetricAggregationColumnWithoutSpecialParams, @@ -444,7 +444,7 @@ describe('convertMetricToColumns valid cases', () => { { aggType: METRIC_TYPES.STD_DEV } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], result, mockConvertToStdDeviationFormulaColumns, @@ -455,7 +455,7 @@ describe('convertMetricToColumns valid cases', () => { { aggType: METRIC_TYPES.PERCENTILES } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], result, mockConvertToPercentileColumn, @@ -466,7 +466,7 @@ describe('convertMetricToColumns valid cases', () => { { aggType: METRIC_TYPES.SINGLE_PERCENTILE } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], result, mockConvertToPercentileColumn, @@ -477,7 +477,7 @@ describe('convertMetricToColumns valid cases', () => { { aggType: METRIC_TYPES.PERCENTILE_RANKS } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], result, mockConvertToPercentileRankColumn, @@ -488,7 +488,7 @@ describe('convertMetricToColumns valid cases', () => { { aggType: METRIC_TYPES.SINGLE_PERCENTILE_RANK } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], result, mockConvertToPercentileRankColumn, @@ -499,7 +499,7 @@ describe('convertMetricToColumns valid cases', () => { { aggType: METRIC_TYPES.TOP_HITS } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], result, mockConvertToLastValueColumn, @@ -510,7 +510,7 @@ describe('convertMetricToColumns valid cases', () => { { aggType: METRIC_TYPES.TOP_METRICS } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], result, mockConvertToLastValueColumn, @@ -521,7 +521,7 @@ describe('convertMetricToColumns valid cases', () => { { aggType: METRIC_TYPES.CUMULATIVE_SUM } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], result, mockConvertToCumulativeSumAggColumn, @@ -532,7 +532,7 @@ describe('convertMetricToColumns valid cases', () => { { aggType: METRIC_TYPES.DERIVATIVE } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], result, mockConvertToOtherParentPipelineAggColumns, @@ -543,7 +543,7 @@ describe('convertMetricToColumns valid cases', () => { { aggType: METRIC_TYPES.MOVING_FN } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], result, mockConvertToOtherParentPipelineAggColumns, @@ -554,7 +554,7 @@ describe('convertMetricToColumns valid cases', () => { { aggType: METRIC_TYPES.SUM_BUCKET } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], result, mockConvertToSiblingPipelineColumns, @@ -565,7 +565,7 @@ describe('convertMetricToColumns valid cases', () => { { aggType: METRIC_TYPES.MIN_BUCKET } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], result, mockConvertToSiblingPipelineColumns, @@ -576,7 +576,7 @@ describe('convertMetricToColumns valid cases', () => { { aggType: METRIC_TYPES.MAX_BUCKET } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], result, mockConvertToSiblingPipelineColumns, @@ -587,7 +587,7 @@ describe('convertMetricToColumns valid cases', () => { { aggType: METRIC_TYPES.AVG_BUCKET } as SchemaConfig, dataView, [], - { isPercentageColumn: false }, + { isPercentageMode: false }, ], result, mockConvertToSiblingPipelineColumns, @@ -598,7 +598,7 @@ describe('convertMetricToColumns valid cases', () => { { aggType: METRIC_TYPES.AVG_BUCKET } as SchemaConfig, dataView, [], - { isPercentageColumn: true }, + { isPercentageMode: true }, ], result, mockConvertToColumnInPercentageMode, @@ -609,7 +609,7 @@ describe('convertMetricToColumns valid cases', () => { { aggType: METRIC_TYPES.AVG_BUCKET } as SchemaConfig, dataView, [], - { isPercentageColumn: true, min: 0, max: 100 }, + { isPercentageMode: true, min: 0, max: 100 }, ], result, mockConvertToColumnInPercentageMode, diff --git a/src/plugins/visualizations/common/convert_to_lens/lib/metrics/metrics.ts b/src/plugins/visualizations/common/convert_to_lens/lib/metrics/metrics.ts index ac6072336e81d..be4c92cd4ec7f 100644 --- a/src/plugins/visualizations/common/convert_to_lens/lib/metrics/metrics.ts +++ b/src/plugins/visualizations/common/convert_to_lens/lib/metrics/metrics.ts @@ -28,15 +28,15 @@ export const convertMetricToColumns = ( agg: SchemaConfig, dataView: DataView, aggs: Array>, - percentageModeConfig: PercentageModeConfig = { isPercentageColumn: false } + percentageModeConfig: PercentageModeConfig = { isPercentageMode: false } ): AggBasedColumn[] | null => { const supportedAgg = SUPPORTED_METRICS[agg.aggType]; if (!supportedAgg) { return null; } - if (percentageModeConfig.isPercentageColumn) { - const { isPercentageColumn, ...minMax } = percentageModeConfig; + if (percentageModeConfig.isPercentageMode) { + const { isPercentageMode, ...minMax } = percentageModeConfig; const formulaColumn = convertToColumnInPercentageMode({ agg, dataView, aggs }, minMax); return getValidColumns(formulaColumn); diff --git a/src/plugins/visualizations/common/convert_to_lens/types/common.ts b/src/plugins/visualizations/common/convert_to_lens/types/common.ts index 8daa9889b04d3..c526a7116877d 100644 --- a/src/plugins/visualizations/common/convert_to_lens/types/common.ts +++ b/src/plugins/visualizations/common/convert_to_lens/types/common.ts @@ -52,5 +52,5 @@ export interface MinMax { } export type PercentageModeConfig = - | ({ isPercentageColumn: true } & MinMax) - | { isPercentageColumn: boolean }; + | ({ isPercentageMode: true } & MinMax) + | { isPercentageMode: boolean }; diff --git a/src/plugins/visualizations/public/convert_to_lens/schemas.ts b/src/plugins/visualizations/public/convert_to_lens/schemas.ts index 06c28455edfcf..ecfbbf34ad9c9 100644 --- a/src/plugins/visualizations/public/convert_to_lens/schemas.ts +++ b/src/plugins/visualizations/public/convert_to_lens/schemas.ts @@ -49,7 +49,7 @@ export const getColumnsFromVis = ( } & (PercentageModeConfig | void) ) => { const { dropEmptyRowsInDateHistogram, ...percentageModeConfig } = config ?? { - isPercentageColumn: false, + isPercentageMode: false, }; const visSchemas = getVisSchemas(vis, { timefilter, From 3b2374994fa399a0939ce4c354bb28095a58002d Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Wed, 5 Oct 2022 14:39:16 +0300 Subject: [PATCH 15/43] Added tests for getConfiguration. --- .../configurations/index.test.ts | 84 ++++++++++++++----- 1 file changed, 61 insertions(+), 23 deletions(-) diff --git a/src/plugins/vis_types/metric/public/convert_to_lens/configurations/index.test.ts b/src/plugins/vis_types/metric/public/convert_to_lens/configurations/index.test.ts index 45ff99338ddc4..46ae744192224 100644 --- a/src/plugins/vis_types/metric/public/convert_to_lens/configurations/index.test.ts +++ b/src/plugins/vis_types/metric/public/convert_to_lens/configurations/index.test.ts @@ -7,32 +7,38 @@ */ import { ColorSchemas } from '@kbn/charts-plugin/common'; -import { getPercentageModeConfig } from '.'; +import { getConfiguration, getPercentageModeConfig } from '.'; import { VisParams } from '../../types'; -describe('getPercentageModeConfig', () => { - const params: VisParams = { - addTooltip: false, - addLegend: false, - dimensions: {} as VisParams['dimensions'], - metric: { - percentageMode: false, - percentageFormatPattern: '', - useRanges: true, - colorSchema: ColorSchemas.Greys, - metricColorMode: 'Labels', - colorsRange: [ - { type: 'range', from: 0, to: 100 }, - { type: 'range', from: 100, to: 200 }, - { type: 'range', from: 200, to: 300 }, - ], - labels: {}, - invertColors: false, - style: {} as VisParams['metric']['style'], - }, - type: 'metric', - }; +const mockGetPalette = jest.fn(); + +jest.mock('./palette', () => ({ + getPalette: jest.fn(() => mockGetPalette()), +})); + +const params: VisParams = { + addTooltip: false, + addLegend: false, + dimensions: {} as VisParams['dimensions'], + metric: { + percentageMode: false, + percentageFormatPattern: '', + useRanges: true, + colorSchema: ColorSchemas.Greys, + metricColorMode: 'Labels', + colorsRange: [ + { type: 'range', from: 0, to: 100 }, + { type: 'range', from: 100, to: 200 }, + { type: 'range', from: 200, to: 300 }, + ], + labels: {}, + invertColors: false, + style: {} as VisParams['metric']['style'], + }, + type: 'metric', +}; +describe('getPercentageModeConfig', () => { test('should return falsy percentage mode if percentage mode is off', () => { expect(getPercentageModeConfig(params)).toEqual({ isPercentageMode: false }); }); @@ -49,3 +55,35 @@ describe('getPercentageModeConfig', () => { ).toEqual({ isPercentageMode: true, min: 0, max: 300 }); }); }); + +describe('getConfiguration', () => { + const palette = { name: 'custom', params: { name: 'custom' }, type: 'palette' }; + + beforeEach(() => { + jest.clearAllMocks(); + mockGetPalette.mockReturnValue(palette); + }); + + test('shourd return correct configuration', () => { + const layerId = 'layer-id'; + const metric = 'metric-id'; + const bucket = 'bucket-id'; + const collapseFn = 'sum'; + expect( + getConfiguration(layerId, params, { + metrics: [metric], + buckets: [bucket], + columnsWithoutReferenced: [], + bucketCollapseFn: { [metric]: collapseFn }, + }) + ).toEqual({ + breakdownByAccessor: bucket, + collapseFn, + layerId, + layerType: 'data', + metricAccessor: metric, + palette, + }); + expect(mockGetPalette).toBeCalledTimes(1); + }); +}); From bc8b690662f8151436ab014960cebf7cc8347cc2 Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Wed, 5 Oct 2022 15:36:24 +0300 Subject: [PATCH 16/43] Fixed invalid behavior. --- .../public/convert_to_lens/configurations/index.test.ts | 6 ------ .../metric/public/convert_to_lens/configurations/index.ts | 4 ++-- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/plugins/vis_types/metric/public/convert_to_lens/configurations/index.test.ts b/src/plugins/vis_types/metric/public/convert_to_lens/configurations/index.test.ts index 46ae744192224..97fb145e74a2f 100644 --- a/src/plugins/vis_types/metric/public/convert_to_lens/configurations/index.test.ts +++ b/src/plugins/vis_types/metric/public/convert_to_lens/configurations/index.test.ts @@ -43,12 +43,6 @@ describe('getPercentageModeConfig', () => { expect(getPercentageModeConfig(params)).toEqual({ isPercentageMode: false }); }); - test('should return falsy percentage mode if metric color mode is `None`', () => { - expect( - getPercentageModeConfig({ ...params, metric: { ...params.metric, metricColorMode: `None` } }) - ).toEqual({ isPercentageMode: false }); - }); - test('should return percentage mode config', () => { expect( getPercentageModeConfig({ ...params, metric: { ...params.metric, percentageMode: true } }) diff --git a/src/plugins/vis_types/metric/public/convert_to_lens/configurations/index.ts b/src/plugins/vis_types/metric/public/convert_to_lens/configurations/index.ts index c6c59e7216322..39e001c1b87b8 100644 --- a/src/plugins/vis_types/metric/public/convert_to_lens/configurations/index.ts +++ b/src/plugins/vis_types/metric/public/convert_to_lens/configurations/index.ts @@ -12,8 +12,8 @@ import { VisParams } from '../../types'; import { getPalette } from './palette'; export const getPercentageModeConfig = (params: VisParams): PercentageModeConfig => { - if (!params.metric.percentageMode || params.metric.metricColorMode === 'None') { - return { isPercentageMode: params.metric.percentageMode }; + if (!params.metric.percentageMode) { + return { isPercentageMode: false }; } const { colorsRange } = params.metric; return { From 9ff78773ae6900468e259bd95f2b68d5152d3d12 Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Wed, 5 Oct 2022 16:16:19 +0300 Subject: [PATCH 17/43] Added functional tests. --- .../group3/open_in_lens/agg_based/index.ts | 1 + .../group3/open_in_lens/agg_based/metric.ts | 52 +++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 x-pack/test/functional/apps/lens/group3/open_in_lens/agg_based/metric.ts diff --git a/x-pack/test/functional/apps/lens/group3/open_in_lens/agg_based/index.ts b/x-pack/test/functional/apps/lens/group3/open_in_lens/agg_based/index.ts index b279f0d8a93cd..66de13c67d94c 100644 --- a/x-pack/test/functional/apps/lens/group3/open_in_lens/agg_based/index.ts +++ b/x-pack/test/functional/apps/lens/group3/open_in_lens/agg_based/index.ts @@ -10,5 +10,6 @@ import { FtrProviderContext } from '../../../../../ftr_provider_context'; export default function ({ loadTestFile }: FtrProviderContext) { describe('Agg based Vis to Lens', function () { loadTestFile(require.resolve('./pie')); + loadTestFile(require.resolve('./metric')); }); } diff --git a/x-pack/test/functional/apps/lens/group3/open_in_lens/agg_based/metric.ts b/x-pack/test/functional/apps/lens/group3/open_in_lens/agg_based/metric.ts new file mode 100644 index 0000000000000..f81f5200e678a --- /dev/null +++ b/x-pack/test/functional/apps/lens/group3/open_in_lens/agg_based/metric.ts @@ -0,0 +1,52 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../../../ftr_provider_context'; + +export default function ({ getPageObjects, getService }: FtrProviderContext) { + const { visualize, lens, timePicker } = getPageObjects(['visualize', 'lens', 'timePicker']); + + const testSubjects = getService('testSubjects'); + + describe('Metric', function describeIndexTests() { + const isNewChartsLibraryEnabled = true; + + before(async () => { + await visualize.initTests(isNewChartsLibraryEnabled); + }); + + beforeEach(async () => { + await visualize.navigateToNewAggBasedVisualization(); + await visualize.clickMetric(); + await visualize.clickNewSearch(); + await timePicker.setDefaultAbsoluteRange(); + }); + + it('should show the "Edit Visualization in Lens" menu item', async () => { + const button = await testSubjects.exists('visualizeEditInLensButton'); + expect(button).to.eql(true); + }); + + it('should convert to Lens', async () => { + const button = await testSubjects.find('visualizeEditInLensButton'); + await button.click(); + await lens.waitForVisualization('mtrVis'); + expect((await lens.getMetricVisualizationData()).length).to.be.equal(1); + expect(await lens.getMetricVisualizationData()).to.eql([ + { + title: 'Count', + subtitle: undefined, + extraText: '', + value: '14.01K', + color: 'rgba(245, 247, 250, 1)', + showingBar: false, + }, + ]); + }); + }); +} From bf3f452b6a9e93a376e738357e1e2cb65e0556dd Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Wed, 5 Oct 2022 16:23:43 +0300 Subject: [PATCH 18/43] Added validation for top_hit percentage mode support. --- .../common/convert_to_lens/lib/convert/percentage_mode.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/plugins/visualizations/common/convert_to_lens/lib/convert/percentage_mode.ts b/src/plugins/visualizations/common/convert_to_lens/lib/convert/percentage_mode.ts index 682dd6aff8148..df49635c97636 100644 --- a/src/plugins/visualizations/common/convert_to_lens/lib/convert/percentage_mode.ts +++ b/src/plugins/visualizations/common/convert_to_lens/lib/convert/percentage_mode.ts @@ -29,6 +29,10 @@ export const convertToColumnInPercentageMode = ( columnConverterArgs: ExtendedColumnConverterArgs, minMax: MinMax | {} ) => { + if (columnConverterArgs.agg.aggType === METRIC_TYPES.TOP_HITS) { + return null; + } + const formula = getFormulaForAgg(columnConverterArgs); if (formula === null) { return null; From fb02520781360affeb671c9579d2c679be138f00 Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Thu, 6 Oct 2022 15:05:49 +0300 Subject: [PATCH 19/43] Refactoring for the purpose of code reusage. --- src/plugins/vis_types/gauge/public/to_ast.ts | 2 +- .../configurations/index.test.ts | 35 +++---------- .../convert_to_lens/configurations/index.ts | 18 ++----- .../metric/public/convert_to_lens/index.ts | 12 ++--- src/plugins/vis_types/metric/public/to_ast.ts | 2 +- .../vis_types/metric/public/utils/palette.ts | 49 ------------------- .../lib/configurations}/index.ts | 3 +- .../lib}/configurations/palette.test.ts | 43 +++++----------- .../lib}/configurations/palette.ts | 13 ++--- .../configurations/percentage_mode.test.ts | 35 +++++++++++++ .../lib/configurations/percentage_mode.ts | 22 +++++++++ .../lib/configurations/types.ts} | 13 ++++- .../common/convert_to_lens/lib/index.ts | 1 + .../visualizations/common/utils/index.ts | 1 + .../common}/utils/palette.ts | 0 .../public/convert_to_lens/index.ts | 6 ++- 16 files changed, 114 insertions(+), 141 deletions(-) delete mode 100644 src/plugins/vis_types/metric/public/utils/palette.ts rename src/plugins/{vis_types/gauge/public/utils => visualizations/common/convert_to_lens/lib/configurations}/index.ts (77%) rename src/plugins/{vis_types/metric/public/convert_to_lens => visualizations/common/convert_to_lens/lib}/configurations/palette.test.ts (56%) rename src/plugins/{vis_types/metric/public/convert_to_lens => visualizations/common/convert_to_lens/lib}/configurations/palette.ts (80%) create mode 100644 src/plugins/visualizations/common/convert_to_lens/lib/configurations/percentage_mode.test.ts create mode 100644 src/plugins/visualizations/common/convert_to_lens/lib/configurations/percentage_mode.ts rename src/plugins/{vis_types/metric/public/utils/index.ts => visualizations/common/convert_to_lens/lib/configurations/types.ts} (52%) rename src/plugins/{vis_types/gauge/public => visualizations/common}/utils/palette.ts (100%) diff --git a/src/plugins/vis_types/gauge/public/to_ast.ts b/src/plugins/vis_types/gauge/public/to_ast.ts index 697b9790468a3..8f7576b0b80c4 100644 --- a/src/plugins/vis_types/gauge/public/to_ast.ts +++ b/src/plugins/vis_types/gauge/public/to_ast.ts @@ -6,6 +6,7 @@ * Side Public License, v 1. */ +import { getStopsWithColorsFromRanges } from '@kbn/visualizations-plugin/common/utils'; import { getVisSchemas, SchemaConfig, VisToExpressionAst } from '@kbn/visualizations-plugin/public'; import { buildExpression, buildExpressionFunction } from '@kbn/expressions-plugin/public'; import type { @@ -13,7 +14,6 @@ import type { GaugeShape, } from '@kbn/expression-gauge-plugin/common'; import { GaugeType, GaugeVisParams } from './types'; -import { getStopsWithColorsFromRanges } from './utils'; const prepareDimension = (params: SchemaConfig) => { const visdimension = buildExpressionFunction('visdimension', { accessor: params.accessor }); diff --git a/src/plugins/vis_types/metric/public/convert_to_lens/configurations/index.test.ts b/src/plugins/vis_types/metric/public/convert_to_lens/configurations/index.test.ts index 97fb145e74a2f..29669c0286529 100644 --- a/src/plugins/vis_types/metric/public/convert_to_lens/configurations/index.test.ts +++ b/src/plugins/vis_types/metric/public/convert_to_lens/configurations/index.test.ts @@ -7,15 +7,10 @@ */ import { ColorSchemas } from '@kbn/charts-plugin/common'; -import { getConfiguration, getPercentageModeConfig } from '.'; +import { CustomPaletteParams, PaletteOutput } from '@kbn/coloring'; +import { getConfiguration } from '.'; import { VisParams } from '../../types'; -const mockGetPalette = jest.fn(); - -jest.mock('./palette', () => ({ - getPalette: jest.fn(() => mockGetPalette()), -})); - const params: VisParams = { addTooltip: false, addLegend: false, @@ -38,25 +33,12 @@ const params: VisParams = { type: 'metric', }; -describe('getPercentageModeConfig', () => { - test('should return falsy percentage mode if percentage mode is off', () => { - expect(getPercentageModeConfig(params)).toEqual({ isPercentageMode: false }); - }); - - test('should return percentage mode config', () => { - expect( - getPercentageModeConfig({ ...params, metric: { ...params.metric, percentageMode: true } }) - ).toEqual({ isPercentageMode: true, min: 0, max: 300 }); - }); -}); - describe('getConfiguration', () => { - const palette = { name: 'custom', params: { name: 'custom' }, type: 'palette' }; - - beforeEach(() => { - jest.clearAllMocks(); - mockGetPalette.mockReturnValue(palette); - }); + const palette = { + name: 'custom', + params: { name: 'custom' }, + type: 'palette', + } as PaletteOutput; test('shourd return correct configuration', () => { const layerId = 'layer-id'; @@ -64,7 +46,7 @@ describe('getConfiguration', () => { const bucket = 'bucket-id'; const collapseFn = 'sum'; expect( - getConfiguration(layerId, params, { + getConfiguration(layerId, params, palette, { metrics: [metric], buckets: [bucket], columnsWithoutReferenced: [], @@ -78,6 +60,5 @@ describe('getConfiguration', () => { metricAccessor: metric, palette, }); - expect(mockGetPalette).toBeCalledTimes(1); }); }); diff --git a/src/plugins/vis_types/metric/public/convert_to_lens/configurations/index.ts b/src/plugins/vis_types/metric/public/convert_to_lens/configurations/index.ts index 39e001c1b87b8..ae62b82408eeb 100644 --- a/src/plugins/vis_types/metric/public/convert_to_lens/configurations/index.ts +++ b/src/plugins/vis_types/metric/public/convert_to_lens/configurations/index.ts @@ -6,26 +6,14 @@ * Side Public License, v 1. */ +import { CustomPaletteParams, PaletteOutput } from '@kbn/coloring'; import { Column, MetricVisConfiguration } from '@kbn/visualizations-plugin/common'; -import { PercentageModeConfig } from '@kbn/visualizations-plugin/common/convert_to_lens'; import { VisParams } from '../../types'; -import { getPalette } from './palette'; - -export const getPercentageModeConfig = (params: VisParams): PercentageModeConfig => { - if (!params.metric.percentageMode) { - return { isPercentageMode: false }; - } - const { colorsRange } = params.metric; - return { - isPercentageMode: true, - min: colorsRange[0].from, - max: colorsRange[colorsRange.length - 1].to, - }; -}; export const getConfiguration = ( layerId: string, params: VisParams, + palette: PaletteOutput | undefined, { metrics, buckets, @@ -43,7 +31,7 @@ export const getConfiguration = ( return { layerId, layerType: 'data', - palette: getPalette(params), + palette: params.metric.metricColorMode !== 'None' ? palette : undefined, metricAccessor, breakdownByAccessor, collapseFn: Object.values(bucketCollapseFn ?? {})[0], diff --git a/src/plugins/vis_types/metric/public/convert_to_lens/index.ts b/src/plugins/vis_types/metric/public/convert_to_lens/index.ts index 7675cbcc1d714..d21731039f788 100644 --- a/src/plugins/vis_types/metric/public/convert_to_lens/index.ts +++ b/src/plugins/vis_types/metric/public/convert_to_lens/index.ts @@ -6,12 +6,12 @@ * Side Public License, v 1. */ +import uuid from 'uuid'; import { Column, ColumnWithMeta } from '@kbn/visualizations-plugin/common'; import { convertToLensModule, getDataViewByIndexPatternId, } from '@kbn/visualizations-plugin/public'; -import uuid from 'uuid'; import { getDataViewsStart } from '../services'; import { ConvertMetricVisToLensVisualization } from './types'; @@ -42,10 +42,8 @@ export const convertToLens: ConvertMetricVisToLensVisualization = async (vis, ti return null; } - const [{ getColumnsFromVis }, { getConfiguration, getPercentageModeConfig }] = await Promise.all([ - convertToLensModule, - import('./configurations'), - ]); + const [{ getColumnsFromVis, getPalette, getPercentageModeConfig }, { getConfiguration }] = + await Promise.all([convertToLensModule, import('./configurations')]); const result = getColumnsFromVis( vis, @@ -54,7 +52,7 @@ export const convertToLens: ConvertMetricVisToLensVisualization = async (vis, ti { splits: ['group'], }, - { dropEmptyRowsInDateHistogram: true, ...getPercentageModeConfig(vis.params) } + { dropEmptyRowsInDateHistogram: true, ...getPercentageModeConfig(vis.params.metric) } ); if (result === null) { @@ -86,7 +84,7 @@ export const convertToLens: ConvertMetricVisToLensVisualization = async (vis, ti columnOrder: [], }, ], - configuration: getConfiguration(layerId, vis.params, result), + configuration: getConfiguration(layerId, vis.params, getPalette(vis.params.metric), result), indexPatternIds: [indexPatternId], }; }; diff --git a/src/plugins/vis_types/metric/public/to_ast.ts b/src/plugins/vis_types/metric/public/to_ast.ts index 0341d5d7b853b..2f4bed8652c62 100644 --- a/src/plugins/vis_types/metric/public/to_ast.ts +++ b/src/plugins/vis_types/metric/public/to_ast.ts @@ -7,13 +7,13 @@ */ import { get } from 'lodash'; +import { getStopsWithColorsFromRanges } from '@kbn/visualizations-plugin/common/utils'; import { getVisSchemas, SchemaConfig, VisToExpressionAst } from '@kbn/visualizations-plugin/public'; import { buildExpression, buildExpressionFunction } from '@kbn/expressions-plugin/public'; import { inter } from '@kbn/expressions-plugin/common'; import { ColorMode } from '@kbn/charts-plugin/public'; import { VisParams } from './types'; -import { getStopsWithColorsFromRanges } from './utils'; const prepareDimension = (params: SchemaConfig) => { const visdimension = buildExpressionFunction('visdimension', { accessor: params.accessor }); diff --git a/src/plugins/vis_types/metric/public/utils/palette.ts b/src/plugins/vis_types/metric/public/utils/palette.ts deleted file mode 100644 index c17e9ccbce0bb..0000000000000 --- a/src/plugins/vis_types/metric/public/utils/palette.ts +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import { ColorSchemas, getHeatmapColors } from '@kbn/charts-plugin/common'; -import { Range } from '@kbn/expressions-plugin/common'; - -export interface PaletteConfig { - color: Array; - stop: number[]; -} - -const TRANSPARENT = 'rgb(0, 0, 0, 0)'; - -const getColor = ( - index: number, - elementsCount: number, - colorSchema: ColorSchemas, - invertColors: boolean = false -) => { - const divider = Math.max(elementsCount - 1, 1); - const value = invertColors ? 1 - index / divider : index / divider; - return getHeatmapColors(value, colorSchema); -}; - -export const getStopsWithColorsFromRanges = ( - ranges: Range[], - colorSchema: ColorSchemas, - invertColors: boolean = false -) => { - return ranges.reduce( - (acc, range, index, rangesArr) => { - if ((index && range.from !== rangesArr[index - 1].to) || index === 0) { - acc.color.push(TRANSPARENT); - acc.stop.push(range.from); - } - - acc.color.push(getColor(index, rangesArr.length, colorSchema, invertColors)); - acc.stop.push(range.to); - - return acc; - }, - { color: [], stop: [] } - ); -}; diff --git a/src/plugins/vis_types/gauge/public/utils/index.ts b/src/plugins/visualizations/common/convert_to_lens/lib/configurations/index.ts similarity index 77% rename from src/plugins/vis_types/gauge/public/utils/index.ts rename to src/plugins/visualizations/common/convert_to_lens/lib/configurations/index.ts index fb23c97d835fe..c4592f50836c5 100644 --- a/src/plugins/vis_types/gauge/public/utils/index.ts +++ b/src/plugins/visualizations/common/convert_to_lens/lib/configurations/index.ts @@ -6,4 +6,5 @@ * Side Public License, v 1. */ -export { getStopsWithColorsFromRanges } from './palette'; +export { getPalette } from './palette'; +export { getPercentageModeConfig } from './percentage_mode'; diff --git a/src/plugins/vis_types/metric/public/convert_to_lens/configurations/palette.test.ts b/src/plugins/visualizations/common/convert_to_lens/lib/configurations/palette.test.ts similarity index 56% rename from src/plugins/vis_types/metric/public/convert_to_lens/configurations/palette.test.ts rename to src/plugins/visualizations/common/convert_to_lens/lib/configurations/palette.test.ts index 7458a78b7b554..0304da03dd9ec 100644 --- a/src/plugins/vis_types/metric/public/convert_to_lens/configurations/palette.test.ts +++ b/src/plugins/visualizations/common/convert_to_lens/lib/configurations/palette.test.ts @@ -7,45 +7,24 @@ */ import { ColorSchemas } from '@kbn/charts-plugin/common'; -import { VisParams } from '../../types'; import { getPalette } from './palette'; +import { PaletteParams } from './types'; describe('getPalette', () => { - const params: VisParams = { - addTooltip: false, - addLegend: false, - dimensions: {} as VisParams['dimensions'], - metric: { - percentageMode: false, - percentageFormatPattern: '', - useRanges: true, - colorSchema: ColorSchemas.Greys, - metricColorMode: 'Labels', - colorsRange: [ - { type: 'range', from: 0, to: 100 }, - { type: 'range', from: 100, to: 200 }, - { type: 'range', from: 200, to: 300 }, - ], - labels: {}, - invertColors: false, - style: {} as VisParams['metric']['style'], - }, - type: 'metric', + const params: PaletteParams = { + colorSchema: ColorSchemas.Greys, + colorsRange: [ + { type: 'range', from: 0, to: 100 }, + { type: 'range', from: 100, to: 200 }, + { type: 'range', from: 200, to: 300 }, + ], + invertColors: false, }; - test('should return undefined if metricColorMode is `None`', () => { - const metricColorMode = 'None'; - const paramsWithNoneMetricColorMode: VisParams = { - ...params, - metric: { ...params.metric, metricColorMode }, - }; - expect(getPalette(paramsWithNoneMetricColorMode)).toBeUndefined(); - }); - test('should return undefined if empty color ranges were passed', () => { - const paramsWithNoneMetricColorMode: VisParams = { + const paramsWithNoneMetricColorMode: PaletteParams = { ...params, - metric: { ...params.metric, colorsRange: [] }, + colorsRange: [], }; expect(getPalette(paramsWithNoneMetricColorMode)).toBeUndefined(); }); diff --git a/src/plugins/vis_types/metric/public/convert_to_lens/configurations/palette.ts b/src/plugins/visualizations/common/convert_to_lens/lib/configurations/palette.ts similarity index 80% rename from src/plugins/vis_types/metric/public/convert_to_lens/configurations/palette.ts rename to src/plugins/visualizations/common/convert_to_lens/lib/configurations/palette.ts index 360de60199efa..a2145e46ec561 100644 --- a/src/plugins/vis_types/metric/public/convert_to_lens/configurations/palette.ts +++ b/src/plugins/visualizations/common/convert_to_lens/lib/configurations/palette.ts @@ -8,9 +8,8 @@ import color from 'color'; import { CustomPaletteParams, PaletteOutput } from '@kbn/coloring'; -import { VisParams } from '../../types'; -import { getStopsWithColorsFromRanges } from '../../utils'; -import { PaletteConfig } from '../../utils/palette'; +import { getStopsWithColorsFromRanges, PaletteConfig } from '../../../utils'; +import { PaletteParams } from './types'; type ColorStopsWithMinMax = Pick< CustomPaletteParams, @@ -53,10 +52,12 @@ const buildCustomPalette = ( }; }; -export const getPalette = (params: VisParams): PaletteOutput | undefined => { - const { colorSchema, colorsRange, invertColors, metricColorMode } = params.metric; +export const getPalette = ( + params: PaletteParams +): PaletteOutput | undefined => { + const { colorSchema, colorsRange, invertColors } = params; - if (metricColorMode === 'None' || !(colorsRange && colorsRange.length)) { + if (!(colorsRange && colorsRange.length)) { return; } diff --git a/src/plugins/visualizations/common/convert_to_lens/lib/configurations/percentage_mode.test.ts b/src/plugins/visualizations/common/convert_to_lens/lib/configurations/percentage_mode.test.ts new file mode 100644 index 0000000000000..9d31887ec1f1f --- /dev/null +++ b/src/plugins/visualizations/common/convert_to_lens/lib/configurations/percentage_mode.test.ts @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { getPercentageModeConfig } from './percentage_mode'; +import { ExtendedPaletteParams } from './types'; + +const params: ExtendedPaletteParams = { + percentageMode: false, + colorSchema: ColorSchemas.Greys, + colorsRange: [ + { type: 'range', from: 0, to: 100 }, + { type: 'range', from: 100, to: 200 }, + { type: 'range', from: 200, to: 300 }, + ], + invertColors: false, +}; + +describe('getPercentageModeConfig', () => { + test('should return falsy percentage mode if percentage mode is off', () => { + expect(getPercentageModeConfig(params)).toEqual({ isPercentageMode: false }); + }); + + test('should return percentage mode config', () => { + expect(getPercentageModeConfig({ ...params, percentageMode: true })).toEqual({ + isPercentageMode: true, + min: 0, + max: 300, + }); + }); +}); diff --git a/src/plugins/visualizations/common/convert_to_lens/lib/configurations/percentage_mode.ts b/src/plugins/visualizations/common/convert_to_lens/lib/configurations/percentage_mode.ts new file mode 100644 index 0000000000000..dd3c8d54043aa --- /dev/null +++ b/src/plugins/visualizations/common/convert_to_lens/lib/configurations/percentage_mode.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { PercentageModeConfig } from '../../types'; +import { ExtendedPaletteParams } from './types'; + +export const getPercentageModeConfig = (params: ExtendedPaletteParams): PercentageModeConfig => { + if (!params.percentageMode) { + return { isPercentageMode: false }; + } + const { colorsRange } = params; + return { + isPercentageMode: true, + min: colorsRange[0].from, + max: colorsRange[colorsRange.length - 1].to, + }; +}; diff --git a/src/plugins/vis_types/metric/public/utils/index.ts b/src/plugins/visualizations/common/convert_to_lens/lib/configurations/types.ts similarity index 52% rename from src/plugins/vis_types/metric/public/utils/index.ts rename to src/plugins/visualizations/common/convert_to_lens/lib/configurations/types.ts index fb23c97d835fe..9bc19946b769f 100644 --- a/src/plugins/vis_types/metric/public/utils/index.ts +++ b/src/plugins/visualizations/common/convert_to_lens/lib/configurations/types.ts @@ -6,4 +6,15 @@ * Side Public License, v 1. */ -export { getStopsWithColorsFromRanges } from './palette'; +import { Range } from '@kbn/expressions-plugin/common'; +import { ColorSchemas } from '@kbn/charts-plugin/common'; + +export interface PaletteParams { + colorSchema: ColorSchemas; + colorsRange: Range[]; + invertColors: boolean; +} + +export interface ExtendedPaletteParams extends PaletteParams { + percentageMode: boolean; +} diff --git a/src/plugins/visualizations/common/convert_to_lens/lib/index.ts b/src/plugins/visualizations/common/convert_to_lens/lib/index.ts index 083450c8ff5d1..3c416dc5b95fa 100644 --- a/src/plugins/visualizations/common/convert_to_lens/lib/index.ts +++ b/src/plugins/visualizations/common/convert_to_lens/lib/index.ts @@ -9,3 +9,4 @@ export * from './buckets'; export * from './metrics'; export * from './convert'; +export * from './configurations'; diff --git a/src/plugins/visualizations/common/utils/index.ts b/src/plugins/visualizations/common/utils/index.ts index 35e01a9121ac4..2f8a14256e650 100644 --- a/src/plugins/visualizations/common/utils/index.ts +++ b/src/plugins/visualizations/common/utils/index.ts @@ -17,3 +17,4 @@ export { getAccessor, getFormatByAccessor, } from './accessors'; +export { getStopsWithColorsFromRanges, PaletteConfig } from './palette'; diff --git a/src/plugins/vis_types/gauge/public/utils/palette.ts b/src/plugins/visualizations/common/utils/palette.ts similarity index 100% rename from src/plugins/vis_types/gauge/public/utils/palette.ts rename to src/plugins/visualizations/common/utils/palette.ts diff --git a/src/plugins/visualizations/public/convert_to_lens/index.ts b/src/plugins/visualizations/public/convert_to_lens/index.ts index 9cd2ba2768ad7..982534b6b875a 100644 --- a/src/plugins/visualizations/public/convert_to_lens/index.ts +++ b/src/plugins/visualizations/public/convert_to_lens/index.ts @@ -7,4 +7,8 @@ */ export { getColumnsFromVis } from './schemas'; -export { getPercentageColumnFormulaColumn } from '../../common/convert_to_lens/lib'; +export { + getPercentageColumnFormulaColumn, + getPalette, + getPercentageModeConfig, +} from '../../common/convert_to_lens/lib'; From e98d59f11e4e2c3df556003a4dd5dbddd2afd94f Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Thu, 6 Oct 2022 15:53:42 +0300 Subject: [PATCH 20/43] Fixed imports. --- .../convert_to_lens/lib/configurations/percentage_mode.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/visualizations/common/convert_to_lens/lib/configurations/percentage_mode.test.ts b/src/plugins/visualizations/common/convert_to_lens/lib/configurations/percentage_mode.test.ts index 9d31887ec1f1f..f148bffc6ea88 100644 --- a/src/plugins/visualizations/common/convert_to_lens/lib/configurations/percentage_mode.test.ts +++ b/src/plugins/visualizations/common/convert_to_lens/lib/configurations/percentage_mode.test.ts @@ -6,6 +6,7 @@ * Side Public License, v 1. */ +import { ColorSchemas } from '@kbn/charts-plugin/common'; import { getPercentageModeConfig } from './percentage_mode'; import { ExtendedPaletteParams } from './types'; From 69dc9dc122915dd5ecba27afae98028ac3774d94 Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Thu, 6 Oct 2022 17:17:37 +0300 Subject: [PATCH 21/43] Added support of gauge. --- .../expression_functions/gauge_function.ts | 1 + .../common/types/expression_functions.ts | 1 + .../expression_renderers/gauge_renderer.tsx | 6 +- src/plugins/vis_types/gauge/kibana.json | 23 ++++- .../convert_to_lens/configurations/gauge.ts | 39 ++++++++ .../convert_to_lens/configurations/index.ts | 9 ++ .../gauge/public/convert_to_lens/index.ts | 92 +++++++++++++++++++ .../gauge/public/convert_to_lens/types.ts | 17 ++++ src/plugins/vis_types/gauge/public/plugin.ts | 13 ++- .../vis_types/gauge/public/services.ts | 13 +++ .../vis_types/gauge/public/vis_type/gauge.tsx | 7 ++ .../common/convert_to_lens/constants.ts | 30 ++++++ .../convert_to_lens/types/configurations.ts | 44 +++++++++ .../visualizations/gauge/visualization.tsx | 34 ++++++- 14 files changed, 317 insertions(+), 12 deletions(-) create mode 100644 src/plugins/vis_types/gauge/public/convert_to_lens/configurations/gauge.ts create mode 100644 src/plugins/vis_types/gauge/public/convert_to_lens/configurations/index.ts create mode 100644 src/plugins/vis_types/gauge/public/convert_to_lens/index.ts create mode 100644 src/plugins/vis_types/gauge/public/convert_to_lens/types.ts create mode 100644 src/plugins/vis_types/gauge/public/services.ts diff --git a/src/plugins/chart_expressions/expression_gauge/common/expression_functions/gauge_function.ts b/src/plugins/chart_expressions/expression_gauge/common/expression_functions/gauge_function.ts index 70ecd25839d19..72919e7c9b414 100644 --- a/src/plugins/chart_expressions/expression_gauge/common/expression_functions/gauge_function.ts +++ b/src/plugins/chart_expressions/expression_gauge/common/expression_functions/gauge_function.ts @@ -231,6 +231,7 @@ export const gaugeFunction = (): GaugeExpressionFunctionDefinition => ({ (handlers.variables?.embeddableTitle as string) ?? handlers.getExecutionContext?.()?.description, }, + canNavigateToLens: Boolean(handlers?.variables?.canNavigateToLens), }, }; }, diff --git a/src/plugins/chart_expressions/expression_gauge/common/types/expression_functions.ts b/src/plugins/chart_expressions/expression_gauge/common/types/expression_functions.ts index ed1098ea96ad8..a7a89a876d699 100644 --- a/src/plugins/chart_expressions/expression_gauge/common/types/expression_functions.ts +++ b/src/plugins/chart_expressions/expression_gauge/common/types/expression_functions.ts @@ -62,6 +62,7 @@ export type GaugeInput = Datatable; export interface GaugeExpressionProps { data: Datatable; args: GaugeArguments; + canNavigateToLens: boolean; } export interface GaugeRender { diff --git a/src/plugins/chart_expressions/expression_gauge/public/expression_renderers/gauge_renderer.tsx b/src/plugins/chart_expressions/expression_gauge/public/expression_renderers/gauge_renderer.tsx index bdaa7f878fd6e..2a18a3891a3a6 100644 --- a/src/plugins/chart_expressions/expression_gauge/public/expression_renderers/gauge_renderer.tsx +++ b/src/plugins/chart_expressions/expression_gauge/public/expression_renderers/gauge_renderer.tsx @@ -57,9 +57,11 @@ export const gaugeRenderer: ( const visualizationType = extractVisualizationType(executionContext); if (containerType && visualizationType) { - plugins.usageCollection?.reportUiCounter(containerType, METRIC_TYPE.COUNT, [ + const events = [ `render_${visualizationType}_${type}`, - ]); + config.canNavigateToLens ? `render_${visualizationType}_${type}_convertable` : undefined, + ].filter((event): event is string => Boolean(event)); + plugins.usageCollection?.reportUiCounter(containerType, METRIC_TYPE.COUNT, events); } handlers.done(); diff --git a/src/plugins/vis_types/gauge/kibana.json b/src/plugins/vis_types/gauge/kibana.json index 5eb2794452de9..428ee970c4e7f 100755 --- a/src/plugins/vis_types/gauge/kibana.json +++ b/src/plugins/vis_types/gauge/kibana.json @@ -4,13 +4,26 @@ "kibanaVersion": "kibana", "server": true, "ui": true, - "requiredPlugins": ["charts", "data", "expressions", "visualizations"], - "requiredBundles": ["visDefaultEditor"], - "optionalPlugins": ["expressionGauge"], - "extraPublicDirs": ["common/index"], + "requiredPlugins": [ + "charts", + "data", + "expressions", + "visualizations", + "dataViews" + ], + "requiredBundles": [ + "visDefaultEditor", + "kibanaUtils" + ], + "optionalPlugins": [ + "expressionGauge" + ], + "extraPublicDirs": [ + "common/index" + ], "owner": { "name": "Vis Editors", "githubTeam": "kibana-vis-editors" }, "description": "Contains the gauge chart implementation using the elastic-charts library. The goal is to eventually deprecate the old implementation and keep only this. Until then, the library used is defined by the Legacy charts library advanced setting." -} +} \ No newline at end of file diff --git a/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/gauge.ts b/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/gauge.ts new file mode 100644 index 0000000000000..2a3108d5dc35f --- /dev/null +++ b/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/gauge.ts @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { CustomPaletteParams, PaletteOutput } from '@kbn/coloring'; +import { Column, GaugeVisConfiguration } from '@kbn/visualizations-plugin/common'; +import { GaugeVisParams } from '../../types'; + +export const getConfigurationForGauge = ( + layerId: string, + params: GaugeVisParams, + palette: PaletteOutput | undefined, + { + metrics, + buckets, + columnsWithoutReferenced, + bucketCollapseFn, + }: { + metrics: string[]; + buckets: string[]; + columnsWithoutReferenced: Column[]; + bucketCollapseFn?: Record; + } +): GaugeVisConfiguration => { + const [metricAccessor] = metrics; + return { + layerId, + layerType: 'data', + palette, + metricAccessor, + shape: 'horizontalBullet', + ticksPosition: 'bands', + labelMajorMode: 'auto', + }; +}; diff --git a/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/index.ts b/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/index.ts new file mode 100644 index 0000000000000..91e7f3cca14fd --- /dev/null +++ b/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export { getConfigurationForGauge } from './gauge'; diff --git a/src/plugins/vis_types/gauge/public/convert_to_lens/index.ts b/src/plugins/vis_types/gauge/public/convert_to_lens/index.ts new file mode 100644 index 0000000000000..d42fbe40e4c4c --- /dev/null +++ b/src/plugins/vis_types/gauge/public/convert_to_lens/index.ts @@ -0,0 +1,92 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import uuid from 'uuid'; +import { Column, ColumnWithMeta } from '@kbn/visualizations-plugin/common'; +import { + convertToLensModule, + getDataViewByIndexPatternId, +} from '@kbn/visualizations-plugin/public'; +import { getDataViewsStart } from '../services'; +import { ConvertGaugeVisToLensVisualization } from './types'; + +export const isColumnWithMeta = (column: Column): column is ColumnWithMeta => { + if ((column as ColumnWithMeta).meta) { + return true; + } + return false; +}; + +export const excludeMetaFromColumn = (column: Column) => { + if (isColumnWithMeta(column)) { + const { meta, ...rest } = column; + return rest; + } + return column; +}; + +export const convertToLens: ConvertGaugeVisToLensVisualization = async (vis, timefilter) => { + if (!timefilter) { + return null; + } + + const dataViews = getDataViewsStart(); + const dataView = await getDataViewByIndexPatternId(vis.data.indexPattern?.id, dataViews); + + if (!dataView) { + return null; + } + + const [{ getColumnsFromVis, getPalette, getPercentageModeConfig }, { getConfigurationForGauge }] = + await Promise.all([convertToLensModule, import('./configurations')]); + + const getConfiguration = getConfigurationForGauge; + + const result = getColumnsFromVis( + vis, + timefilter, + dataView, + { + splits: ['group'], + }, + { dropEmptyRowsInDateHistogram: true, ...getPercentageModeConfig(vis.params.gauge) } + ); + + if (result === null) { + return null; + } + + // for now, multiple metrics are not supported + if (result.metrics.length > 1 || result.buckets.length > 1) { + return null; + } + + if (result.metrics[0]) { + const metric = result.columns.find(({ columnId }) => columnId === result.metrics[0]); + if (metric?.dataType !== 'number') { + return null; + } + } + + const layerId = uuid(); + const indexPatternId = dataView.id!; + + return { + type: 'lnsGauge', + layers: [ + { + indexPatternId, + layerId, + columns: result.columns.map(excludeMetaFromColumn), + columnOrder: [], + }, + ], + configuration: getConfiguration(layerId, vis.params, getPalette(vis.params.gauge), result), + indexPatternIds: [indexPatternId], + }; +}; diff --git a/src/plugins/vis_types/gauge/public/convert_to_lens/types.ts b/src/plugins/vis_types/gauge/public/convert_to_lens/types.ts new file mode 100644 index 0000000000000..05cabcf6009ec --- /dev/null +++ b/src/plugins/vis_types/gauge/public/convert_to_lens/types.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { TimefilterContract } from '@kbn/data-plugin/public'; +import { NavigateToLensContext, GaugeVisConfiguration } from '@kbn/visualizations-plugin/common'; +import { Vis } from '@kbn/visualizations-plugin/public'; +import { GaugeVisParams } from '../types'; + +export type ConvertGaugeVisToLensVisualization = ( + vis: Vis, + timefilter?: TimefilterContract +) => Promise | null>; diff --git a/src/plugins/vis_types/gauge/public/plugin.ts b/src/plugins/vis_types/gauge/public/plugin.ts index 1db42c7cc01df..16e7a0a818487 100755 --- a/src/plugins/vis_types/gauge/public/plugin.ts +++ b/src/plugins/vis_types/gauge/public/plugin.ts @@ -6,12 +6,14 @@ * Side Public License, v 1. */ +import { CoreSetup, CoreStart } from '@kbn/core/public'; import { VisualizationsSetup } from '@kbn/visualizations-plugin/public'; import { DataPublicPluginStart } from '@kbn/data-plugin/public'; -import { CoreSetup } from '@kbn/core/public'; +import { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; import { LEGACY_GAUGE_CHARTS_LIBRARY } from '../common'; import { VisTypeGaugePluginSetup } from './types'; import { gaugeVisType, goalVisType } from './vis_type'; +import { setDataViewsStart } from './services'; /** @internal */ export interface VisTypeGaugeSetupDependencies { @@ -19,13 +21,14 @@ export interface VisTypeGaugeSetupDependencies { } /** @internal */ -export interface VisTypePiePluginStartDependencies { +export interface VisTypeGaugePluginStartDependencies { data: DataPublicPluginStart; + dataViews: DataViewsPublicPluginStart; } export class VisTypeGaugePlugin { public setup( - core: CoreSetup, + core: CoreSetup, { visualizations }: VisTypeGaugeSetupDependencies ): VisTypeGaugePluginSetup { if (!core.uiSettings.get(LEGACY_GAUGE_CHARTS_LIBRARY)) { @@ -37,5 +40,7 @@ export class VisTypeGaugePlugin { return {}; } - public start() {} + public start(core: CoreStart, { dataViews }: VisTypeGaugePluginStartDependencies) { + setDataViewsStart(dataViews); + } } diff --git a/src/plugins/vis_types/gauge/public/services.ts b/src/plugins/vis_types/gauge/public/services.ts new file mode 100644 index 0000000000000..736ad70d49419 --- /dev/null +++ b/src/plugins/vis_types/gauge/public/services.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { createGetterSetter } from '@kbn/kibana-utils-plugin/public'; +import { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; + +export const [getDataViewsStart, setDataViewsStart] = + createGetterSetter('dataViews'); diff --git a/src/plugins/vis_types/gauge/public/vis_type/gauge.tsx b/src/plugins/vis_types/gauge/public/vis_type/gauge.tsx index b6bdf93a8ea89..0afb30a7257d8 100644 --- a/src/plugins/vis_types/gauge/public/vis_type/gauge.tsx +++ b/src/plugins/vis_types/gauge/public/vis_type/gauge.tsx @@ -18,6 +18,7 @@ import { toExpressionAst } from '../to_ast'; import { getGaugeOptions } from '../editor/components'; import { GaugeVisParams } from '../types'; import { SplitTooltip } from './split_tooltip'; +import { convertToLens } from '../convert_to_lens'; export const getGaugeVisTypeDefinition = ( props: GaugeTypeProps @@ -130,4 +131,10 @@ export const getGaugeVisTypeDefinition = ( ], }, requiresSearch: true, + navigateToLens: async (vis, timefilter) => (vis ? convertToLens(vis, timefilter) : null), + getExpressionVariables: async (vis, timeFilter) => { + return { + canNavigateToLens: Boolean(vis?.params ? await convertToLens(vis, timeFilter) : null), + }; + }, }); diff --git a/src/plugins/visualizations/common/convert_to_lens/constants.ts b/src/plugins/visualizations/common/convert_to_lens/constants.ts index 12ed815bc7247..b3af9b9394d67 100644 --- a/src/plugins/visualizations/common/convert_to_lens/constants.ts +++ b/src/plugins/visualizations/common/convert_to_lens/constants.ts @@ -104,3 +104,33 @@ export const RANGE_MODES = { Range: 'range', Histogram: 'histogram', } as const; + +export const GaugeShapes = { + HORIZONTAL_BULLET: 'horizontalBullet', + VERTICAL_BULLET: 'verticalBullet', + ARC: 'arc', + CIRCLE: 'circle', +} as const; + +export const GaugeTicksPositions = { + HIDDEN: 'hidden', + AUTO: 'auto', + BANDS: 'bands', +} as const; + +export const GaugeLabelMajorModes = { + AUTO: 'auto', + CUSTOM: 'custom', + NONE: 'none', +} as const; + +export const GaugeCentralMajorModes = { + AUTO: 'auto', + CUSTOM: 'custom', + NONE: 'none', +} as const; + +export const GaugeColorModes = { + PALETTE: 'palette', + NONE: 'none', +} as const; diff --git a/src/plugins/visualizations/common/convert_to_lens/types/configurations.ts b/src/plugins/visualizations/common/convert_to_lens/types/configurations.ts index a6a771d07e7a6..fbc9e17d77727 100644 --- a/src/plugins/visualizations/common/convert_to_lens/types/configurations.ts +++ b/src/plugins/visualizations/common/convert_to_lens/types/configurations.ts @@ -21,6 +21,11 @@ import { YAxisModes, XYCurveTypes, LayerTypes, + GaugeShapes, + GaugeTicksPositions, + GaugeLabelMajorModes, + GaugeColorModes, + GaugeCentralMajorModes, } from '../constants'; export type FillType = $Values; @@ -32,6 +37,11 @@ export type CategoryDisplayType = $Values; export type NumberDisplayType = $Values; export type LegendDisplayType = $Values; export type LayerType = $Values; +export type GaugeColorMode = $Values; +export type GaugeShape = $Values; +export type GaugeLabelMajorMode = $Values; +export type GaugeCentralMajorMode = $Values; +export type GaugeTicksPosition = $Values; export interface AxisExtentConfig { mode: 'full' | 'custom' | 'dataBounds'; @@ -227,6 +237,40 @@ export interface PartitionVisConfiguration { palette?: PaletteOutput; } +export const LENS_GAUGE_ID = 'lnsGauge'; + +export const GROUP_ID = { + METRIC: 'metric', + MIN: 'min', + MAX: 'max', + GOAL: 'goal', +} as const; + +interface GaugeState { + metricAccessor?: string; + minAccessor?: string; + maxAccessor?: string; + goalAccessor?: string; + ticksPosition: GaugeTicksPosition; + labelMajorMode: GaugeLabelMajorMode; + labelMajor?: string; + labelMinor?: string; + centralMajorMode?: GaugeCentralMajorMode; + centralMajor?: string; + colorMode?: GaugeColorMode; + palette?: PaletteOutput; + shape: GaugeShape; + /** @deprecated This field is deprecated and going to be removed in the futher release versions. */ + percentageMode?: boolean; + respectRanges?: boolean; + commonLabel?: string; +} + +export type GaugeVisConfiguration = GaugeState & { + layerId: string; + layerType: typeof LayerTypes.DATA; +}; + export type Configuration = | XYConfiguration | TableVisConfiguration diff --git a/x-pack/plugins/lens/public/visualizations/gauge/visualization.tsx b/x-pack/plugins/lens/public/visualizations/gauge/visualization.tsx index 19fd46459b2b7..d9c2c07c8df4a 100644 --- a/x-pack/plugins/lens/public/visualizations/gauge/visualization.tsx +++ b/x-pack/plugins/lens/public/visualizations/gauge/visualization.tsx @@ -23,7 +23,7 @@ import { getValueFromAccessor, } from '@kbn/expression-gauge-plugin/public'; import { IconChartHorizontalBullet, IconChartVerticalBullet } from '@kbn/chart-icons'; -import type { DatasourceLayers, OperationMetadata, Visualization } from '../../types'; +import type { DatasourceLayers, OperationMetadata, Suggestion, Visualization } from '../../types'; import { getSuggestions } from './suggestions'; import { GROUP_ID, @@ -37,6 +37,7 @@ import { GaugeDimensionEditor } from './dimension_editor'; import { layerTypes } from '../../../common'; import { generateId } from '../../id_generator'; import { getAccessorsFromState } from './utils'; +import { IndexPatternLayer } from '../..'; const groupLabelForGauge = i18n.translate('xpack.lens.metric.groupLabel', { defaultMessage: 'Goal and single value', @@ -47,6 +48,16 @@ interface GaugeVisualizationDeps { theme: ThemeServiceStart; } +interface GaugeDatasourceState { + [prop: string]: unknown; + layers: IndexPatternLayer[]; +} + +export interface GaugeSuggestion extends Suggestion { + datasourceState: GaugeDatasourceState; + visualizationState: GaugeVisualizationState; +} + export const isNumericMetric = (op: OperationMetadata) => !op.isBucketed && op.dataType === 'number'; @@ -543,4 +554,25 @@ export const getGaugeVisualization = ({ return warnings; }, + + getSuggestionFromConvertToLensContext({ suggestions, context }) { + const allSuggestions = suggestions as GaugeSuggestion[]; + return { + ...allSuggestions[0], + datasourceState: { + ...allSuggestions[0].datasourceState, + layers: allSuggestions.reduce( + (acc, s) => ({ + ...acc, + ...s.datasourceState.layers, + }), + {} + ), + }, + visualizationState: { + ...allSuggestions[0].visualizationState, + ...context.configuration, + }, + }; + }, }); From f65b7c5b1e829238444fd5f967e75736b2c0f242 Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Thu, 6 Oct 2022 18:15:28 +0300 Subject: [PATCH 22/43] Added color ranges and min/max support. --- .../convert_to_lens/configurations/gauge.ts | 23 +++++++------- .../gauge/public/convert_to_lens/index.ts | 31 ++++++++++++++----- .../lib/configurations/percentage_mode.ts | 18 ++++++++--- .../convert_to_lens/lib/convert/index.ts | 1 + .../lib/convert/static_value.ts | 22 +++++++++++++ .../common/convert_to_lens/types/common.ts | 10 ++++-- .../public/convert_to_lens/index.ts | 1 + .../visualizations/gauge/suggestions.ts | 2 +- 8 files changed, 81 insertions(+), 27 deletions(-) create mode 100644 src/plugins/visualizations/common/convert_to_lens/lib/convert/static_value.ts diff --git a/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/gauge.ts b/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/gauge.ts index 2a3108d5dc35f..5fb6660bd0a81 100644 --- a/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/gauge.ts +++ b/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/gauge.ts @@ -7,7 +7,7 @@ */ import { CustomPaletteParams, PaletteOutput } from '@kbn/coloring'; -import { Column, GaugeVisConfiguration } from '@kbn/visualizations-plugin/common'; +import { GaugeVisConfiguration } from '@kbn/visualizations-plugin/common'; import { GaugeVisParams } from '../../types'; export const getConfigurationForGauge = ( @@ -15,25 +15,26 @@ export const getConfigurationForGauge = ( params: GaugeVisParams, palette: PaletteOutput | undefined, { - metrics, - buckets, - columnsWithoutReferenced, - bucketCollapseFn, + metricAccessor, + minAccessor, + maxAccessor, }: { - metrics: string[]; - buckets: string[]; - columnsWithoutReferenced: Column[]; - bucketCollapseFn?: Record; + metricAccessor: string; + bucket?: string; + minAccessor: string; + maxAccessor: string; } ): GaugeVisConfiguration => { - const [metricAccessor] = metrics; return { layerId, layerType: 'data', palette, metricAccessor, + minAccessor, + maxAccessor, shape: 'horizontalBullet', - ticksPosition: 'bands', + ticksPosition: 'auto', labelMajorMode: 'auto', + colorMode: palette ? 'palette' : 'none', }; }; diff --git a/src/plugins/vis_types/gauge/public/convert_to_lens/index.ts b/src/plugins/vis_types/gauge/public/convert_to_lens/index.ts index d42fbe40e4c4c..c704666bf8521 100644 --- a/src/plugins/vis_types/gauge/public/convert_to_lens/index.ts +++ b/src/plugins/vis_types/gauge/public/convert_to_lens/index.ts @@ -7,7 +7,11 @@ */ import uuid from 'uuid'; -import { Column, ColumnWithMeta } from '@kbn/visualizations-plugin/common'; +import { + Column, + ColumnWithMeta, + PercentageModeConfigWithMinMax, +} from '@kbn/visualizations-plugin/common'; import { convertToLensModule, getDataViewByIndexPatternId, @@ -42,10 +46,13 @@ export const convertToLens: ConvertGaugeVisToLensVisualization = async (vis, tim return null; } - const [{ getColumnsFromVis, getPalette, getPercentageModeConfig }, { getConfigurationForGauge }] = - await Promise.all([convertToLensModule, import('./configurations')]); + const [ + { getColumnsFromVis, createStaticValueColumn, getPalette, getPercentageModeConfig }, + { getConfigurationForGauge }, + ] = await Promise.all([convertToLensModule, import('./configurations')]); const getConfiguration = getConfigurationForGauge; + const percentageModeConfig = getPercentageModeConfig(vis.params.gauge, false); const result = getColumnsFromVis( vis, @@ -54,7 +61,7 @@ export const convertToLens: ConvertGaugeVisToLensVisualization = async (vis, tim { splits: ['group'], }, - { dropEmptyRowsInDateHistogram: true, ...getPercentageModeConfig(vis.params.gauge) } + { dropEmptyRowsInDateHistogram: true, ...percentageModeConfig } ); if (result === null) { @@ -62,7 +69,7 @@ export const convertToLens: ConvertGaugeVisToLensVisualization = async (vis, tim } // for now, multiple metrics are not supported - if (result.metrics.length > 1 || result.buckets.length > 1) { + if (result.metrics.length > 1 || result.buckets.length) { return null; } @@ -76,17 +83,27 @@ export const convertToLens: ConvertGaugeVisToLensVisualization = async (vis, tim const layerId = uuid(); const indexPatternId = dataView.id!; + const metricAccessor = result.metrics[0]; + const { min, max } = percentageModeConfig as PercentageModeConfigWithMinMax; + const minColumn = createStaticValueColumn(min); + const maxColumn = createStaticValueColumn(max); + const columns = [...result.columns, minColumn, maxColumn]; + return { type: 'lnsGauge', layers: [ { indexPatternId, layerId, - columns: result.columns.map(excludeMetaFromColumn), + columns: columns.map(excludeMetaFromColumn), columnOrder: [], }, ], - configuration: getConfiguration(layerId, vis.params, getPalette(vis.params.gauge), result), + configuration: getConfiguration(layerId, vis.params, getPalette(vis.params.gauge), { + metricAccessor, + minAccessor: minColumn.columnId, + maxAccessor: maxColumn.columnId, + }), indexPatternIds: [indexPatternId], }; }; diff --git a/src/plugins/visualizations/common/convert_to_lens/lib/configurations/percentage_mode.ts b/src/plugins/visualizations/common/convert_to_lens/lib/configurations/percentage_mode.ts index dd3c8d54043aa..d375856c620fe 100644 --- a/src/plugins/visualizations/common/convert_to_lens/lib/configurations/percentage_mode.ts +++ b/src/plugins/visualizations/common/convert_to_lens/lib/configurations/percentage_mode.ts @@ -9,14 +9,22 @@ import { PercentageModeConfig } from '../../types'; import { ExtendedPaletteParams } from './types'; -export const getPercentageModeConfig = (params: ExtendedPaletteParams): PercentageModeConfig => { +export const getPercentageModeConfig = ( + params: ExtendedPaletteParams, + respectPercentageMode: boolean = true +): PercentageModeConfig => { + const { colorsRange } = params; + const minMax = { + min: colorsRange[0].from, + max: colorsRange[colorsRange.length - 1].to, + }; if (!params.percentageMode) { - return { isPercentageMode: false }; + return respectPercentageMode + ? { isPercentageMode: false } + : { isPercentageMode: false, ...minMax }; } - const { colorsRange } = params; return { isPercentageMode: true, - min: colorsRange[0].from, - max: colorsRange[colorsRange.length - 1].to, + ...minMax, }; }; diff --git a/src/plugins/visualizations/common/convert_to_lens/lib/convert/index.ts b/src/plugins/visualizations/common/convert_to_lens/lib/convert/index.ts index 9da33607be2a9..7f1fb81fd20b8 100644 --- a/src/plugins/visualizations/common/convert_to_lens/lib/convert/index.ts +++ b/src/plugins/visualizations/common/convert_to_lens/lib/convert/index.ts @@ -21,3 +21,4 @@ export * from './types'; export * from './last_value'; export * from './range'; export * from './percentage_mode'; +export * from './static_value'; diff --git a/src/plugins/visualizations/common/convert_to_lens/lib/convert/static_value.ts b/src/plugins/visualizations/common/convert_to_lens/lib/convert/static_value.ts new file mode 100644 index 0000000000000..0310e162b8e85 --- /dev/null +++ b/src/plugins/visualizations/common/convert_to_lens/lib/convert/static_value.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import uuid from 'uuid'; +import { StaticValueColumn } from '../../types'; + +export const createStaticValueColumn = (value: number): StaticValueColumn => ({ + operationType: 'static_value', + columnId: uuid(), + isBucketed: false, + isSplit: false, + dataType: 'number', + references: [], + params: { + value: value.toString(), + }, +}); diff --git a/src/plugins/visualizations/common/convert_to_lens/types/common.ts b/src/plugins/visualizations/common/convert_to_lens/types/common.ts index c526a7116877d..fc62803c06cd6 100644 --- a/src/plugins/visualizations/common/convert_to_lens/types/common.ts +++ b/src/plugins/visualizations/common/convert_to_lens/types/common.ts @@ -51,6 +51,10 @@ export interface MinMax { max: number; } -export type PercentageModeConfig = - | ({ isPercentageMode: true } & MinMax) - | { isPercentageMode: boolean }; +export interface BasicPercentageModeConfig { + isPercentageMode: boolean; +} + +export type PercentageModeConfigWithMinMax = BasicPercentageModeConfig & MinMax; + +export type PercentageModeConfig = BasicPercentageModeConfig | PercentageModeConfigWithMinMax; diff --git a/src/plugins/visualizations/public/convert_to_lens/index.ts b/src/plugins/visualizations/public/convert_to_lens/index.ts index 982534b6b875a..73509d49157ae 100644 --- a/src/plugins/visualizations/public/convert_to_lens/index.ts +++ b/src/plugins/visualizations/public/convert_to_lens/index.ts @@ -11,4 +11,5 @@ export { getPercentageColumnFormulaColumn, getPalette, getPercentageModeConfig, + createStaticValueColumn, } from '../../common/convert_to_lens/lib'; diff --git a/x-pack/plugins/lens/public/visualizations/gauge/suggestions.ts b/x-pack/plugins/lens/public/visualizations/gauge/suggestions.ts index 46688d3021fe6..b198d3aced918 100644 --- a/x-pack/plugins/lens/public/visualizations/gauge/suggestions.ts +++ b/x-pack/plugins/lens/public/visualizations/gauge/suggestions.ts @@ -41,7 +41,7 @@ export const getSuggestions: Visualization['getSuggesti if ( hasLayerMismatch(keptLayerIds, table) || isNotNumericMetric(table) || - (!isGauge && table.columns.length > 1) || + (state && !isGauge && table.columns.length > 1) || (isGauge && (numberOfAccessors !== table.columns.length || table.changeType === 'initial')) ) { return []; From 5eb9382d48a28f057f567cbb40cbfee814fa45f4 Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Fri, 7 Oct 2022 11:49:41 +0300 Subject: [PATCH 23/43] Finished gauge configuration. --- .../gauge/public/convert_to_lens/configurations/gauge.ts | 6 ++++-- src/plugins/vis_types/gauge/public/convert_to_lens/index.ts | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/gauge.ts b/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/gauge.ts index 5fb6660bd0a81..79ed7e41143b5 100644 --- a/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/gauge.ts +++ b/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/gauge.ts @@ -25,6 +25,7 @@ export const getConfigurationForGauge = ( maxAccessor: string; } ): GaugeVisConfiguration => { + const showLabels = Boolean(params.gauge.labels.show); return { layerId, layerType: 'data', @@ -33,8 +34,9 @@ export const getConfigurationForGauge = ( minAccessor, maxAccessor, shape: 'horizontalBullet', - ticksPosition: 'auto', - labelMajorMode: 'auto', + ticksPosition: 'bands', + labelMajorMode: showLabels ? 'auto' : 'none', colorMode: palette ? 'palette' : 'none', + labelMinor: showLabels ? params.gauge.style.subText : undefined, }; }; diff --git a/src/plugins/vis_types/gauge/public/convert_to_lens/index.ts b/src/plugins/vis_types/gauge/public/convert_to_lens/index.ts index c704666bf8521..bc01639adf7b0 100644 --- a/src/plugins/vis_types/gauge/public/convert_to_lens/index.ts +++ b/src/plugins/vis_types/gauge/public/convert_to_lens/index.ts @@ -59,7 +59,7 @@ export const convertToLens: ConvertGaugeVisToLensVisualization = async (vis, tim timefilter, dataView, { - splits: ['group'], + unsupported: ['group'], }, { dropEmptyRowsInDateHistogram: true, ...percentageModeConfig } ); @@ -69,7 +69,7 @@ export const convertToLens: ConvertGaugeVisToLensVisualization = async (vis, tim } // for now, multiple metrics are not supported - if (result.metrics.length > 1 || result.buckets.length) { + if (result.metrics.length > 1) { return null; } From 242c18a04288c674ce6ddf5db89a9bd272032706 Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Fri, 7 Oct 2022 15:56:54 +0300 Subject: [PATCH 24/43] Added goal config support. --- .../convert_to_lens/configurations/gauge.ts | 1 - .../convert_to_lens/configurations/goal.ts | 41 +++++++++++++++++++ .../convert_to_lens/configurations/index.ts | 1 + .../gauge/public/convert_to_lens/index.ts | 6 ++- .../vis_types/gauge/public/vis_type/goal.tsx | 7 ++++ 5 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 src/plugins/vis_types/gauge/public/convert_to_lens/configurations/goal.ts diff --git a/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/gauge.ts b/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/gauge.ts index 79ed7e41143b5..1f2e82f62e970 100644 --- a/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/gauge.ts +++ b/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/gauge.ts @@ -20,7 +20,6 @@ export const getConfigurationForGauge = ( maxAccessor, }: { metricAccessor: string; - bucket?: string; minAccessor: string; maxAccessor: string; } diff --git a/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/goal.ts b/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/goal.ts new file mode 100644 index 0000000000000..dc831cfcca0c8 --- /dev/null +++ b/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/goal.ts @@ -0,0 +1,41 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { CustomPaletteParams, PaletteOutput } from '@kbn/coloring'; +import { GaugeVisConfiguration } from '@kbn/visualizations-plugin/common'; +import { GaugeVisParams } from '../../types'; + +export const getConfigurationForGoal = ( + layerId: string, + params: GaugeVisParams, + palette: PaletteOutput | undefined, + { + metricAccessor, + minAccessor, + maxAccessor, + }: { + metricAccessor: string; + minAccessor: string; + maxAccessor: string; + } +): GaugeVisConfiguration => { + const showLabels = Boolean(params.gauge.labels.show); + return { + layerId, + layerType: 'data', + palette, + metricAccessor, + minAccessor, + maxAccessor, + shape: 'horizontalBullet', + ticksPosition: 'hidden', + labelMajorMode: showLabels ? 'auto' : 'none', + colorMode: palette ? 'palette' : 'none', + labelMinor: showLabels ? params.gauge.style.subText : undefined, + }; +}; diff --git a/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/index.ts b/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/index.ts index 91e7f3cca14fd..03b34869842fc 100644 --- a/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/index.ts +++ b/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/index.ts @@ -7,3 +7,4 @@ */ export { getConfigurationForGauge } from './gauge'; +export { getConfigurationForGoal } from './goal'; diff --git a/src/plugins/vis_types/gauge/public/convert_to_lens/index.ts b/src/plugins/vis_types/gauge/public/convert_to_lens/index.ts index bc01639adf7b0..34ca74abdddeb 100644 --- a/src/plugins/vis_types/gauge/public/convert_to_lens/index.ts +++ b/src/plugins/vis_types/gauge/public/convert_to_lens/index.ts @@ -48,10 +48,12 @@ export const convertToLens: ConvertGaugeVisToLensVisualization = async (vis, tim const [ { getColumnsFromVis, createStaticValueColumn, getPalette, getPercentageModeConfig }, - { getConfigurationForGauge }, + { getConfigurationForGauge, getConfigurationForGoal }, ] = await Promise.all([convertToLensModule, import('./configurations')]); - const getConfiguration = getConfigurationForGauge; + const getConfiguration = + vis.type.name === 'gauge' ? getConfigurationForGauge : getConfigurationForGoal; + const percentageModeConfig = getPercentageModeConfig(vis.params.gauge, false); const result = getColumnsFromVis( diff --git a/src/plugins/vis_types/gauge/public/vis_type/goal.tsx b/src/plugins/vis_types/gauge/public/vis_type/goal.tsx index c43e9c8cd46f5..2cfbd349d6b3e 100644 --- a/src/plugins/vis_types/gauge/public/vis_type/goal.tsx +++ b/src/plugins/vis_types/gauge/public/vis_type/goal.tsx @@ -17,6 +17,7 @@ import { getGaugeOptions } from '../editor/components'; import { toExpressionAst } from '../to_ast'; import { GaugeVisParams, GaugeType, GaugeTypeProps } from '../types'; import { SplitTooltip } from './split_tooltip'; +import { convertToLens } from '../convert_to_lens'; export const getGoalVisTypeDefinition = ( props: GaugeTypeProps @@ -122,4 +123,10 @@ export const getGoalVisTypeDefinition = ( ], }, requiresSearch: true, + navigateToLens: async (vis, timefilter) => (vis ? convertToLens(vis, timefilter) : null), + getExpressionVariables: async (vis, timeFilter) => { + return { + canNavigateToLens: Boolean(vis?.params ? await convertToLens(vis, timeFilter) : null), + }; + }, }); From a0a5c917c193c4b36a954630f9c312000a792aee Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Fri, 7 Oct 2022 15:57:39 +0300 Subject: [PATCH 25/43] Fixed tests. --- .../__snapshots__/gauge_function.test.ts.snap | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/plugins/chart_expressions/expression_gauge/common/expression_functions/__snapshots__/gauge_function.test.ts.snap b/src/plugins/chart_expressions/expression_gauge/common/expression_functions/__snapshots__/gauge_function.test.ts.snap index bb2fe700f6f19..3a1f13de9c525 100644 --- a/src/plugins/chart_expressions/expression_gauge/common/expression_functions/__snapshots__/gauge_function.test.ts.snap +++ b/src/plugins/chart_expressions/expression_gauge/common/expression_functions/__snapshots__/gauge_function.test.ts.snap @@ -53,6 +53,7 @@ Object { "shape": "arc", "ticksPosition": "auto", }, + "canNavigateToLens": false, "data": Object { "columns": Array [ Object { @@ -105,6 +106,7 @@ Object { "shape": "arc", "ticksPosition": "auto", }, + "canNavigateToLens": false, "data": Object { "columns": Array [ Object { @@ -155,6 +157,7 @@ Object { "shape": "horizontalBullet", "ticksPosition": "auto", }, + "canNavigateToLens": false, "data": Object { "columns": Array [ Object { @@ -205,6 +208,7 @@ Object { "shape": "horizontalBullet", "ticksPosition": "auto", }, + "canNavigateToLens": false, "data": Object { "columns": Array [ Object { @@ -255,6 +259,7 @@ Object { "shape": "horizontalBullet", "ticksPosition": "bands", }, + "canNavigateToLens": false, "data": Object { "columns": Array [ Object { @@ -307,6 +312,7 @@ Object { "shape": "circle", "ticksPosition": "auto", }, + "canNavigateToLens": false, "data": Object { "columns": Array [ Object { @@ -359,6 +365,7 @@ Object { "shape": "circle", "ticksPosition": "auto", }, + "canNavigateToLens": false, "data": Object { "columns": Array [ Object { @@ -409,6 +416,7 @@ Object { "shape": "horizontalBullet", "ticksPosition": "auto", }, + "canNavigateToLens": false, "data": Object { "columns": Array [ Object { @@ -459,6 +467,7 @@ Object { "shape": "horizontalBullet", "ticksPosition": "hidden", }, + "canNavigateToLens": false, "data": Object { "columns": Array [ Object { @@ -509,6 +518,7 @@ Object { "shape": "horizontalBullet", "ticksPosition": "auto", }, + "canNavigateToLens": false, "data": Object { "columns": Array [ Object { @@ -559,6 +569,7 @@ Object { "shape": "horizontalBullet", "ticksPosition": "auto", }, + "canNavigateToLens": false, "data": Object { "columns": Array [ Object { @@ -609,6 +620,7 @@ Object { "shape": "horizontalBullet", "ticksPosition": "auto", }, + "canNavigateToLens": false, "data": Object { "columns": Array [ Object { @@ -659,6 +671,7 @@ Object { "shape": "horizontalBullet", "ticksPosition": "auto", }, + "canNavigateToLens": false, "data": Object { "columns": Array [ Object { @@ -709,6 +722,7 @@ Object { "shape": "verticalBullet", "ticksPosition": "auto", }, + "canNavigateToLens": false, "data": Object { "columns": Array [ Object { From 2a7aca69847f0224af2e17db71d76f5f9c40fc69 Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Fri, 7 Oct 2022 15:59:50 +0300 Subject: [PATCH 26/43] Fixed types. --- .../expression_gauge/public/components/gauge_component.test.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/chart_expressions/expression_gauge/public/components/gauge_component.test.tsx b/src/plugins/chart_expressions/expression_gauge/public/components/gauge_component.test.tsx index 6588cefdb8f2b..640a8e17b47c7 100644 --- a/src/plugins/chart_expressions/expression_gauge/public/components/gauge_component.test.tsx +++ b/src/plugins/chart_expressions/expression_gauge/public/components/gauge_component.test.tsx @@ -94,6 +94,7 @@ describe('GaugeComponent', function () { beforeAll(async () => { wrapperProps = { + canNavigateToLens: false, data: createData(), chartsThemeService, args, From 5eec23d7c1df2e343d1bba722ab72f743f62b317 Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Fri, 7 Oct 2022 16:09:17 +0300 Subject: [PATCH 27/43] Fixed tests. --- .../vis_types/metric/public/convert_to_lens/index.test.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/plugins/vis_types/metric/public/convert_to_lens/index.test.ts b/src/plugins/vis_types/metric/public/convert_to_lens/index.test.ts index 015b19157e91a..e0c50cad16719 100644 --- a/src/plugins/vis_types/metric/public/convert_to_lens/index.test.ts +++ b/src/plugins/vis_types/metric/public/convert_to_lens/index.test.ts @@ -15,6 +15,7 @@ const mockGetColumnsFromVis = jest.fn(); const mockGetPercentageColumnFormulaColumn = jest.fn(); const mockGetConfiguration = jest.fn().mockReturnValue({}); const mockGetPercentageModeConfig = jest.fn(); +const mockGetPalette = jest.fn(); jest.mock('../services', () => ({ getDataViewsStart: jest.fn(() => ({ get: () => ({}), getDefault: () => ({}) })), @@ -24,13 +25,14 @@ jest.mock('@kbn/visualizations-plugin/public', () => ({ convertToLensModule: Promise.resolve({ getColumnsFromVis: jest.fn(() => mockGetColumnsFromVis()), getPercentageColumnFormulaColumn: jest.fn(() => mockGetPercentageColumnFormulaColumn()), + getPercentageModeConfig: jest.fn(() => mockGetPercentageModeConfig()), + getPalette: jest.fn(() => mockGetPalette()), }), getDataViewByIndexPatternId: jest.fn(() => ({ id: 'index-pattern' })), })); jest.mock('./configurations', () => ({ getConfiguration: jest.fn(() => mockGetConfiguration()), - getPercentageModeConfig: jest.fn(() => mockGetPercentageModeConfig()), })); const params: VisParams = { @@ -130,7 +132,7 @@ describe('convertToLens', () => { const result = await convertToLens(vis, timefilter); expect(mockGetColumnsFromVis).toBeCalledTimes(1); expect(mockGetConfiguration).toBeCalledTimes(1); - + expect(mockGetPalette).toBeCalledTimes(1); expect(result?.type).toEqual('lnsMetric'); expect(result?.layers.length).toEqual(1); expect(result?.layers[0]).toEqual( From dc608a7642f07a8583bf8174eac0564dd5ad77dd Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Fri, 7 Oct 2022 16:38:23 +0300 Subject: [PATCH 28/43] Removed goal. --- .../convert_to_lens/configurations/goal.ts | 41 ------------------- .../convert_to_lens/configurations/index.ts | 1 - .../gauge/public/convert_to_lens/index.ts | 7 +--- 3 files changed, 2 insertions(+), 47 deletions(-) delete mode 100644 src/plugins/vis_types/gauge/public/convert_to_lens/configurations/goal.ts diff --git a/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/goal.ts b/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/goal.ts deleted file mode 100644 index dc831cfcca0c8..0000000000000 --- a/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/goal.ts +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import { CustomPaletteParams, PaletteOutput } from '@kbn/coloring'; -import { GaugeVisConfiguration } from '@kbn/visualizations-plugin/common'; -import { GaugeVisParams } from '../../types'; - -export const getConfigurationForGoal = ( - layerId: string, - params: GaugeVisParams, - palette: PaletteOutput | undefined, - { - metricAccessor, - minAccessor, - maxAccessor, - }: { - metricAccessor: string; - minAccessor: string; - maxAccessor: string; - } -): GaugeVisConfiguration => { - const showLabels = Boolean(params.gauge.labels.show); - return { - layerId, - layerType: 'data', - palette, - metricAccessor, - minAccessor, - maxAccessor, - shape: 'horizontalBullet', - ticksPosition: 'hidden', - labelMajorMode: showLabels ? 'auto' : 'none', - colorMode: palette ? 'palette' : 'none', - labelMinor: showLabels ? params.gauge.style.subText : undefined, - }; -}; diff --git a/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/index.ts b/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/index.ts index 03b34869842fc..91e7f3cca14fd 100644 --- a/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/index.ts +++ b/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/index.ts @@ -7,4 +7,3 @@ */ export { getConfigurationForGauge } from './gauge'; -export { getConfigurationForGoal } from './goal'; diff --git a/src/plugins/vis_types/gauge/public/convert_to_lens/index.ts b/src/plugins/vis_types/gauge/public/convert_to_lens/index.ts index 34ca74abdddeb..1505d3f91685c 100644 --- a/src/plugins/vis_types/gauge/public/convert_to_lens/index.ts +++ b/src/plugins/vis_types/gauge/public/convert_to_lens/index.ts @@ -48,12 +48,9 @@ export const convertToLens: ConvertGaugeVisToLensVisualization = async (vis, tim const [ { getColumnsFromVis, createStaticValueColumn, getPalette, getPercentageModeConfig }, - { getConfigurationForGauge, getConfigurationForGoal }, + { getConfigurationForGauge }, ] = await Promise.all([convertToLensModule, import('./configurations')]); - const getConfiguration = - vis.type.name === 'gauge' ? getConfigurationForGauge : getConfigurationForGoal; - const percentageModeConfig = getPercentageModeConfig(vis.params.gauge, false); const result = getColumnsFromVis( @@ -101,7 +98,7 @@ export const convertToLens: ConvertGaugeVisToLensVisualization = async (vis, tim columnOrder: [], }, ], - configuration: getConfiguration(layerId, vis.params, getPalette(vis.params.gauge), { + configuration: getConfigurationForGauge(layerId, vis.params, getPalette(vis.params.gauge), { metricAccessor, minAccessor: minColumn.columnId, maxAccessor: maxColumn.columnId, From dd07c208363e1b12a5ba1a99c17686365c409612 Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Fri, 7 Oct 2022 16:42:52 +0300 Subject: [PATCH 29/43] Fixed types (linter warning). --- src/plugins/visualizations/common/utils/index.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/plugins/visualizations/common/utils/index.ts b/src/plugins/visualizations/common/utils/index.ts index 2f8a14256e650..d960607238394 100644 --- a/src/plugins/visualizations/common/utils/index.ts +++ b/src/plugins/visualizations/common/utils/index.ts @@ -17,4 +17,5 @@ export { getAccessor, getFormatByAccessor, } from './accessors'; -export { getStopsWithColorsFromRanges, PaletteConfig } from './palette'; +export { getStopsWithColorsFromRanges } from './palette'; +export type { PaletteConfig } from './palette'; From 96c3c0d2bed14a1ba069870fab6a2aa19d6ed114 Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Fri, 7 Oct 2022 17:07:34 +0300 Subject: [PATCH 30/43] Added tests for gauge convertToLens. --- .../public/convert_to_lens/index.test.ts | 156 ++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 src/plugins/vis_types/gauge/public/convert_to_lens/index.test.ts diff --git a/src/plugins/vis_types/gauge/public/convert_to_lens/index.test.ts b/src/plugins/vis_types/gauge/public/convert_to_lens/index.test.ts new file mode 100644 index 0000000000000..4202734ba7575 --- /dev/null +++ b/src/plugins/vis_types/gauge/public/convert_to_lens/index.test.ts @@ -0,0 +1,156 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { ColorSchemas } from '@kbn/charts-plugin/common'; +import { Vis } from '@kbn/visualizations-plugin/public'; +import { convertToLens } from '.'; +import { GaugeVisParams } from '../types'; + +const mockGetColumnsFromVis = jest.fn(); +const mockGetPercentageColumnFormulaColumn = jest.fn(); +const mockGetConfigurationForGauge = jest.fn().mockReturnValue({}); +const mockGetPercentageModeConfig = jest.fn(); +const mockGetPalette = jest.fn(); +const mockCreateStaticValueColumn = jest.fn(); + +jest.mock('../services', () => ({ + getDataViewsStart: jest.fn(() => ({ get: () => ({}), getDefault: () => ({}) })), +})); + +jest.mock('@kbn/visualizations-plugin/public', () => ({ + convertToLensModule: Promise.resolve({ + getColumnsFromVis: jest.fn(() => mockGetColumnsFromVis()), + getPercentageColumnFormulaColumn: jest.fn(() => mockGetPercentageColumnFormulaColumn()), + getPercentageModeConfig: jest.fn(() => mockGetPercentageModeConfig()), + getPalette: jest.fn(() => mockGetPalette()), + createStaticValueColumn: jest.fn(() => mockCreateStaticValueColumn()), + }), + getDataViewByIndexPatternId: jest.fn(() => ({ id: 'index-pattern' })), +})); + +jest.mock('./configurations', () => ({ + getConfigurationForGauge: jest.fn(() => mockGetConfigurationForGauge()), +})); + +const params: GaugeVisParams = { + addTooltip: false, + addLegend: false, + isDisplayWarning: true, + gauge: { + type: 'meter', + orientation: 'vertical', + alignment: 'automatic', + gaugeType: 'Arc', + scale: { + color: 'rgba(105,112,125,0.2)', + labels: false, + show: false, + }, + gaugeStyle: 'Full', + extendRange: false, + backStyle: 'Full', + percentageMode: false, + percentageFormatPattern: '', + colorSchema: ColorSchemas.Greys, + colorsRange: [], + labels: {}, + invertColors: false, + style: { + bgFill: '', + bgColor: false, + labelColor: false, + subText: '', + fontSize: 10, + }, + }, + type: 'gauge', +}; + +const vis = { + isHierarchical: () => false, + type: {}, + params, + data: {}, +} as unknown as Vis; + +const timefilter = { + getAbsoluteTime: () => {}, +} as any; + +describe('convertToLens', () => { + beforeEach(() => { + mockGetPercentageModeConfig.mockReturnValue({ + isPercentageMode: false, + min: 0, + max: 1000, + }); + mockCreateStaticValueColumn.mockReturnValue({}); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + test('should return null if getColumnsFromVis returns null', async () => { + mockGetColumnsFromVis.mockReturnValue(null); + const result = await convertToLens(vis, timefilter); + expect(mockGetColumnsFromVis).toBeCalledTimes(1); + expect(result).toBeNull(); + }); + + test('should return null if metrics count is more than 1', async () => { + mockGetColumnsFromVis.mockReturnValue({ + metrics: ['1', '2'], + columns: [{ columnId: '2' }, { columnId: '1' }], + }); + const result = await convertToLens(vis, timefilter); + expect(mockGetColumnsFromVis).toBeCalledTimes(1); + expect(result).toBeNull(); + }); + + test('should return null if metric column data type is different from number', async () => { + mockGetColumnsFromVis.mockReturnValue({ + metrics: ['1'], + columns: [{ columnId: '2' }, { columnId: '1', dataType: 'string' }], + }); + const result = await convertToLens(vis, timefilter); + expect(mockGetColumnsFromVis).toBeCalledTimes(1); + expect(result).toBeNull(); + }); + test('should return correct state for valid vis', async () => { + const config = { + layerType: 'data', + }; + + mockGetColumnsFromVis.mockReturnValue({ + metrics: ['1'], + columns: [{ columnId: '1', dataType: 'number' }], + columnsWithoutReferenced: [ + { columnId: '1', meta: { aggId: 'agg-1' } }, + { columnId: '2', meta: { aggId: 'agg-2' } }, + ], + }); + mockGetConfigurationForGauge.mockReturnValue(config); + + const result = await convertToLens(vis, timefilter); + expect(mockGetColumnsFromVis).toBeCalledTimes(1); + expect(mockGetConfigurationForGauge).toBeCalledTimes(1); + expect(mockGetPalette).toBeCalledTimes(1); + expect(mockCreateStaticValueColumn).toBeCalledTimes(2); + expect(result?.type).toEqual('lnsGauge'); + expect(result?.layers.length).toEqual(1); + expect(result?.layers[0]).toEqual( + expect.objectContaining({ + columnOrder: [], + columns: [{ columnId: '1', dataType: 'number' }, {}, {}], + indexPatternId: 'index-pattern', + }) + ); + expect(result?.configuration).toEqual(config); + }); +}); From bd5fca5e5b39e8c1f56794ad799dac91b130f26a Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Fri, 7 Oct 2022 17:15:44 +0300 Subject: [PATCH 31/43] Added tests for getConfigurationForGauge. --- .../configurations/gauge.test.ts | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 src/plugins/vis_types/gauge/public/convert_to_lens/configurations/gauge.test.ts diff --git a/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/gauge.test.ts b/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/gauge.test.ts new file mode 100644 index 0000000000000..3378dd06e1c0b --- /dev/null +++ b/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/gauge.test.ts @@ -0,0 +1,83 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { ColorSchemas } from '@kbn/charts-plugin/common'; +import { CustomPaletteParams, PaletteOutput } from '@kbn/coloring'; +import { getConfigurationForGauge } from '.'; +import { GaugeVisParams } from '../../types'; + +const params: GaugeVisParams = { + addTooltip: false, + addLegend: false, + isDisplayWarning: true, + gauge: { + type: 'meter', + orientation: 'vertical', + alignment: 'automatic', + gaugeType: 'Arc', + scale: { + color: 'rgba(105,112,125,0.2)', + labels: false, + show: false, + }, + gaugeStyle: 'Full', + extendRange: false, + backStyle: 'Full', + percentageMode: false, + percentageFormatPattern: '', + colorSchema: ColorSchemas.Greys, + colorsRange: [ + { type: 'range', from: 0, to: 100 }, + { type: 'range', from: 100, to: 200 }, + ], + labels: {}, + invertColors: false, + style: { + bgFill: '', + bgColor: false, + labelColor: false, + subText: '', + fontSize: 10, + }, + }, + type: 'gauge', +}; + +describe('getConfiguration', () => { + const palette = { + name: 'custom', + params: { name: 'custom' }, + type: 'palette', + } as PaletteOutput; + + test('shourd return correct configuration', () => { + const layerId = 'layer-id'; + const metricAccessor = 'metric-id'; + const minAccessor = 'min-accessor'; + const maxAccessor = 'max-accessor'; + expect( + getConfigurationForGauge(layerId, params, palette, { + metricAccessor, + minAccessor, + maxAccessor, + }) + ).toEqual({ + colorMode: 'palette', + labelMajorMode: 'none', + labelMinor: undefined, + layerId: 'layer-id', + layerType: 'data', + maxAccessor: 'max-accessor', + metricAccessor: 'metric-id', + minAccessor: 'min-accessor', + palette: { name: 'custom', params: { name: 'custom' }, type: 'palette' }, + shape: 'horizontalBullet', + ticksPosition: 'bands', + }); + }); +}); From 7a9d4170a514472a9905a39e71781aa1f63dd1a0 Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Fri, 7 Oct 2022 17:38:16 +0300 Subject: [PATCH 32/43] Added functional tests. --- .../group3/open_in_lens/agg_based/gauge.ts | 41 +++++++++++++++++++ .../group3/open_in_lens/agg_based/index.ts | 1 + 2 files changed, 42 insertions(+) create mode 100644 x-pack/test/functional/apps/lens/group3/open_in_lens/agg_based/gauge.ts diff --git a/x-pack/test/functional/apps/lens/group3/open_in_lens/agg_based/gauge.ts b/x-pack/test/functional/apps/lens/group3/open_in_lens/agg_based/gauge.ts new file mode 100644 index 0000000000000..a5d348b4ed6f5 --- /dev/null +++ b/x-pack/test/functional/apps/lens/group3/open_in_lens/agg_based/gauge.ts @@ -0,0 +1,41 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../../../ftr_provider_context'; + +export default function ({ getPageObjects, getService }: FtrProviderContext) { + const { visualize, lens, timePicker } = getPageObjects(['visualize', 'lens', 'timePicker']); + + const testSubjects = getService('testSubjects'); + + describe('Gauge', function describeIndexTests() { + const isNewChartsLibraryEnabled = true; + + before(async () => { + await visualize.initTests(isNewChartsLibraryEnabled); + }); + + beforeEach(async () => { + await visualize.navigateToNewAggBasedVisualization(); + await visualize.clickGauge(); + await visualize.clickNewSearch(); + await timePicker.setDefaultAbsoluteRange(); + }); + + it('should show the "Edit Visualization in Lens" menu item', async () => { + const button = await testSubjects.exists('visualizeEditInLensButton'); + expect(button).to.eql(true); + }); + + it('should convert to Lens', async () => { + const button = await testSubjects.find('visualizeEditInLensButton'); + await button.click(); + await lens.waitForVisualization('gaugeChart'); + }); + }); +} diff --git a/x-pack/test/functional/apps/lens/group3/open_in_lens/agg_based/index.ts b/x-pack/test/functional/apps/lens/group3/open_in_lens/agg_based/index.ts index 66de13c67d94c..53e1302816466 100644 --- a/x-pack/test/functional/apps/lens/group3/open_in_lens/agg_based/index.ts +++ b/x-pack/test/functional/apps/lens/group3/open_in_lens/agg_based/index.ts @@ -11,5 +11,6 @@ export default function ({ loadTestFile }: FtrProviderContext) { describe('Agg based Vis to Lens', function () { loadTestFile(require.resolve('./pie')); loadTestFile(require.resolve('./metric')); + loadTestFile(require.resolve('./gauge')); }); } From d25aaac1f6afd90616222f12df8f9cc79d12a03d Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Mon, 10 Oct 2022 17:37:25 +0300 Subject: [PATCH 33/43] Added convertToLens for goal. --- .../configurations/gauge.test.ts | 4 +- .../convert_to_lens/configurations/gauge.ts | 2 +- .../convert_to_lens/configurations/goal.ts | 40 +++++++ .../convert_to_lens/configurations/index.ts | 9 -- .../{index.test.ts => gauge.test.ts} | 12 +- .../gauge/public/convert_to_lens/gauge.ts | 113 ++++++++++++++++++ .../gauge/public/convert_to_lens/goal.ts | 107 +++++++++++++++++ .../gauge/public/convert_to_lens/index.ts | 102 +--------------- .../gauge/public/convert_to_lens/types.ts | 11 +- .../vis_types/gauge/public/vis_type/gauge.tsx | 6 +- .../vis_types/gauge/public/vis_type/goal.tsx | 6 +- .../metric/public/convert_to_lens/index.ts | 10 +- .../lib/configurations/palette.test.ts | 4 +- .../lib/configurations/palette.ts | 39 +++++- .../common/convert_to_lens/types/common.ts | 8 +- 15 files changed, 338 insertions(+), 135 deletions(-) create mode 100644 src/plugins/vis_types/gauge/public/convert_to_lens/configurations/goal.ts delete mode 100644 src/plugins/vis_types/gauge/public/convert_to_lens/configurations/index.ts rename src/plugins/vis_types/gauge/public/convert_to_lens/{index.test.ts => gauge.test.ts} (93%) create mode 100644 src/plugins/vis_types/gauge/public/convert_to_lens/gauge.ts create mode 100644 src/plugins/vis_types/gauge/public/convert_to_lens/goal.ts diff --git a/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/gauge.test.ts b/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/gauge.test.ts index 3378dd06e1c0b..0b2bab509341d 100644 --- a/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/gauge.test.ts +++ b/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/gauge.test.ts @@ -8,7 +8,7 @@ import { ColorSchemas } from '@kbn/charts-plugin/common'; import { CustomPaletteParams, PaletteOutput } from '@kbn/coloring'; -import { getConfigurationForGauge } from '.'; +import { getConfiguration } from './gauge'; import { GaugeVisParams } from '../../types'; const params: GaugeVisParams = { @@ -61,7 +61,7 @@ describe('getConfiguration', () => { const minAccessor = 'min-accessor'; const maxAccessor = 'max-accessor'; expect( - getConfigurationForGauge(layerId, params, palette, { + getConfiguration(layerId, params, palette, { metricAccessor, minAccessor, maxAccessor, diff --git a/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/gauge.ts b/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/gauge.ts index 1f2e82f62e970..9a5483d038c2e 100644 --- a/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/gauge.ts +++ b/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/gauge.ts @@ -10,7 +10,7 @@ import { CustomPaletteParams, PaletteOutput } from '@kbn/coloring'; import { GaugeVisConfiguration } from '@kbn/visualizations-plugin/common'; import { GaugeVisParams } from '../../types'; -export const getConfigurationForGauge = ( +export const getConfiguration = ( layerId: string, params: GaugeVisParams, palette: PaletteOutput | undefined, diff --git a/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/goal.ts b/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/goal.ts new file mode 100644 index 0000000000000..0a0a538b71082 --- /dev/null +++ b/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/goal.ts @@ -0,0 +1,40 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { CustomPaletteParams, PaletteOutput } from '@kbn/coloring'; +import { Column, MetricVisConfiguration } from '@kbn/visualizations-plugin/common'; + +export const getConfiguration = ( + layerId: string, + palette: PaletteOutput | undefined, + { + metrics, + buckets, + maxAccessor, + columnsWithoutReferenced, + bucketCollapseFn, + }: { + metrics: string[]; + buckets: string[]; + maxAccessor: string; + columnsWithoutReferenced: Column[]; + bucketCollapseFn?: Record; + } +): MetricVisConfiguration => { + const [metricAccessor] = metrics; + const [breakdownByAccessor] = buckets; + return { + layerId, + layerType: 'data', + palette, + metricAccessor, + breakdownByAccessor, + maxAccessor, + collapseFn: Object.values(bucketCollapseFn ?? {})[0], + }; +}; diff --git a/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/index.ts b/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/index.ts deleted file mode 100644 index 91e7f3cca14fd..0000000000000 --- a/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -export { getConfigurationForGauge } from './gauge'; diff --git a/src/plugins/vis_types/gauge/public/convert_to_lens/index.test.ts b/src/plugins/vis_types/gauge/public/convert_to_lens/gauge.test.ts similarity index 93% rename from src/plugins/vis_types/gauge/public/convert_to_lens/index.test.ts rename to src/plugins/vis_types/gauge/public/convert_to_lens/gauge.test.ts index 4202734ba7575..bc71e913fe85b 100644 --- a/src/plugins/vis_types/gauge/public/convert_to_lens/index.test.ts +++ b/src/plugins/vis_types/gauge/public/convert_to_lens/gauge.test.ts @@ -8,12 +8,12 @@ import { ColorSchemas } from '@kbn/charts-plugin/common'; import { Vis } from '@kbn/visualizations-plugin/public'; -import { convertToLens } from '.'; +import { convertToLens } from './gauge'; import { GaugeVisParams } from '../types'; const mockGetColumnsFromVis = jest.fn(); const mockGetPercentageColumnFormulaColumn = jest.fn(); -const mockGetConfigurationForGauge = jest.fn().mockReturnValue({}); +const mockGetConfiguration = jest.fn().mockReturnValue({}); const mockGetPercentageModeConfig = jest.fn(); const mockGetPalette = jest.fn(); const mockCreateStaticValueColumn = jest.fn(); @@ -33,8 +33,8 @@ jest.mock('@kbn/visualizations-plugin/public', () => ({ getDataViewByIndexPatternId: jest.fn(() => ({ id: 'index-pattern' })), })); -jest.mock('./configurations', () => ({ - getConfigurationForGauge: jest.fn(() => mockGetConfigurationForGauge()), +jest.mock('./configurations/gauge', () => ({ + getConfiguration: jest.fn(() => mockGetConfiguration()), })); const params: GaugeVisParams = { @@ -135,11 +135,11 @@ describe('convertToLens', () => { { columnId: '2', meta: { aggId: 'agg-2' } }, ], }); - mockGetConfigurationForGauge.mockReturnValue(config); + mockGetConfiguration.mockReturnValue(config); const result = await convertToLens(vis, timefilter); expect(mockGetColumnsFromVis).toBeCalledTimes(1); - expect(mockGetConfigurationForGauge).toBeCalledTimes(1); + expect(mockGetConfiguration).toBeCalledTimes(1); expect(mockGetPalette).toBeCalledTimes(1); expect(mockCreateStaticValueColumn).toBeCalledTimes(2); expect(result?.type).toEqual('lnsGauge'); diff --git a/src/plugins/vis_types/gauge/public/convert_to_lens/gauge.ts b/src/plugins/vis_types/gauge/public/convert_to_lens/gauge.ts new file mode 100644 index 0000000000000..1cac4aa906b22 --- /dev/null +++ b/src/plugins/vis_types/gauge/public/convert_to_lens/gauge.ts @@ -0,0 +1,113 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import uuid from 'uuid'; +import { + Column, + ColumnWithMeta, + PercentageModeConfigWithMinMax, +} from '@kbn/visualizations-plugin/common'; +import { + convertToLensModule, + getDataViewByIndexPatternId, +} from '@kbn/visualizations-plugin/public'; +import { getDataViewsStart } from '../services'; +import { ConvertGaugeVisToLensVisualization } from './types'; + +export const isColumnWithMeta = (column: Column): column is ColumnWithMeta => { + if ((column as ColumnWithMeta).meta) { + return true; + } + return false; +}; + +export const excludeMetaFromColumn = (column: Column) => { + if (isColumnWithMeta(column)) { + const { meta, ...rest } = column; + return rest; + } + return column; +}; + +export const convertToLens: ConvertGaugeVisToLensVisualization = async (vis, timefilter) => { + if (!timefilter) { + return null; + } + + const dataViews = getDataViewsStart(); + const dataView = await getDataViewByIndexPatternId(vis.data.indexPattern?.id, dataViews); + + if (!dataView) { + return null; + } + + const [ + { getColumnsFromVis, createStaticValueColumn, getPalette, getPercentageModeConfig }, + { getConfiguration }, + ] = await Promise.all([convertToLensModule, import('./configurations/gauge')]); + + const percentageModeConfig = getPercentageModeConfig(vis.params.gauge, false); + + const result = getColumnsFromVis( + vis, + timefilter, + dataView, + { + unsupported: ['group'], + }, + { dropEmptyRowsInDateHistogram: true, ...percentageModeConfig } + ); + + if (result === null) { + return null; + } + + // for now, multiple metrics are not supported + if (result.metrics.length > 1) { + return null; + } + + if (result.metrics[0]) { + const metric = result.columns.find(({ columnId }) => columnId === result.metrics[0]); + if (metric?.dataType !== 'number') { + return null; + } + } + + const layerId = uuid(); + const indexPatternId = dataView.id!; + + const metricAccessor = result.metrics[0]; + const { min, max } = percentageModeConfig as PercentageModeConfigWithMinMax; + const minColumn = createStaticValueColumn(min); + const maxColumn = createStaticValueColumn(max); + const columns = [...result.columns, minColumn, maxColumn]; + + return { + type: 'lnsGauge', + layers: [ + { + indexPatternId, + layerId, + columns: columns.map(excludeMetaFromColumn), + columnOrder: [], + }, + ], + configuration: getConfiguration( + layerId, + vis.params, + getPalette(vis.params.gauge, percentageModeConfig, true), + { + metricAccessor, + minAccessor: minColumn.columnId, + maxAccessor: maxColumn.columnId, + } + ), + indexPatternIds: [indexPatternId], + }; +}; diff --git a/src/plugins/vis_types/gauge/public/convert_to_lens/goal.ts b/src/plugins/vis_types/gauge/public/convert_to_lens/goal.ts new file mode 100644 index 0000000000000..566e917cd1cf5 --- /dev/null +++ b/src/plugins/vis_types/gauge/public/convert_to_lens/goal.ts @@ -0,0 +1,107 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import uuid from 'uuid'; +import { + Column, + ColumnWithMeta, + PercentageModeConfigWithMinMax, +} from '@kbn/visualizations-plugin/common'; +import { + convertToLensModule, + getDataViewByIndexPatternId, +} from '@kbn/visualizations-plugin/public'; +import { getDataViewsStart } from '../services'; +import { ConvertGoalVisToLensVisualization } from './types'; + +export const isColumnWithMeta = (column: Column): column is ColumnWithMeta => { + if ((column as ColumnWithMeta).meta) { + return true; + } + return false; +}; + +export const excludeMetaFromColumn = (column: Column) => { + if (isColumnWithMeta(column)) { + const { meta, ...rest } = column; + return rest; + } + return column; +}; + +export const convertToLens: ConvertGoalVisToLensVisualization = async (vis, timefilter) => { + if (!timefilter) { + return null; + } + + const dataViews = getDataViewsStart(); + const dataView = await getDataViewByIndexPatternId(vis.data.indexPattern?.id, dataViews); + + if (!dataView) { + return null; + } + + const [ + { getColumnsFromVis, getPalette, getPercentageModeConfig, createStaticValueColumn }, + { getConfiguration }, + ] = await Promise.all([convertToLensModule, import('./configurations/goal')]); + + const percentageModeConfig = getPercentageModeConfig(vis.params.gauge, false); + + const result = getColumnsFromVis( + vis, + timefilter, + dataView, + { + splits: ['group'], + }, + { dropEmptyRowsInDateHistogram: true, ...percentageModeConfig } + ); + + if (result === null) { + return null; + } + + // for now, multiple metrics are not supported + if (result.metrics.length > 1 || result.buckets.length > 1) { + return null; + } + + if (result.metrics[0]) { + const metric = result.columns.find(({ columnId }) => columnId === result.metrics[0]); + if (metric?.dataType !== 'number') { + return null; + } + } + const { isPercentageMode, max } = percentageModeConfig as PercentageModeConfigWithMinMax; + const maxColumn = createStaticValueColumn(isPercentageMode ? 1 : max); + + const columns = [...result.columns, maxColumn]; + const layerId = uuid(); + const indexPatternId = dataView.id!; + return { + type: 'lnsMetric', + layers: [ + { + indexPatternId, + layerId, + columns: columns.map(excludeMetaFromColumn), + columnOrder: [], + }, + ], + configuration: getConfiguration( + layerId, + getPalette(vis.params.gauge, percentageModeConfig, true), + { + ...result, + maxAccessor: maxColumn.columnId, + } + ), + indexPatternIds: [indexPatternId], + }; +}; diff --git a/src/plugins/vis_types/gauge/public/convert_to_lens/index.ts b/src/plugins/vis_types/gauge/public/convert_to_lens/index.ts index 1505d3f91685c..6bbf661086a54 100644 --- a/src/plugins/vis_types/gauge/public/convert_to_lens/index.ts +++ b/src/plugins/vis_types/gauge/public/convert_to_lens/index.ts @@ -6,103 +6,5 @@ * Side Public License, v 1. */ -import uuid from 'uuid'; -import { - Column, - ColumnWithMeta, - PercentageModeConfigWithMinMax, -} from '@kbn/visualizations-plugin/common'; -import { - convertToLensModule, - getDataViewByIndexPatternId, -} from '@kbn/visualizations-plugin/public'; -import { getDataViewsStart } from '../services'; -import { ConvertGaugeVisToLensVisualization } from './types'; - -export const isColumnWithMeta = (column: Column): column is ColumnWithMeta => { - if ((column as ColumnWithMeta).meta) { - return true; - } - return false; -}; - -export const excludeMetaFromColumn = (column: Column) => { - if (isColumnWithMeta(column)) { - const { meta, ...rest } = column; - return rest; - } - return column; -}; - -export const convertToLens: ConvertGaugeVisToLensVisualization = async (vis, timefilter) => { - if (!timefilter) { - return null; - } - - const dataViews = getDataViewsStart(); - const dataView = await getDataViewByIndexPatternId(vis.data.indexPattern?.id, dataViews); - - if (!dataView) { - return null; - } - - const [ - { getColumnsFromVis, createStaticValueColumn, getPalette, getPercentageModeConfig }, - { getConfigurationForGauge }, - ] = await Promise.all([convertToLensModule, import('./configurations')]); - - const percentageModeConfig = getPercentageModeConfig(vis.params.gauge, false); - - const result = getColumnsFromVis( - vis, - timefilter, - dataView, - { - unsupported: ['group'], - }, - { dropEmptyRowsInDateHistogram: true, ...percentageModeConfig } - ); - - if (result === null) { - return null; - } - - // for now, multiple metrics are not supported - if (result.metrics.length > 1) { - return null; - } - - if (result.metrics[0]) { - const metric = result.columns.find(({ columnId }) => columnId === result.metrics[0]); - if (metric?.dataType !== 'number') { - return null; - } - } - - const layerId = uuid(); - const indexPatternId = dataView.id!; - - const metricAccessor = result.metrics[0]; - const { min, max } = percentageModeConfig as PercentageModeConfigWithMinMax; - const minColumn = createStaticValueColumn(min); - const maxColumn = createStaticValueColumn(max); - const columns = [...result.columns, minColumn, maxColumn]; - - return { - type: 'lnsGauge', - layers: [ - { - indexPatternId, - layerId, - columns: columns.map(excludeMetaFromColumn), - columnOrder: [], - }, - ], - configuration: getConfigurationForGauge(layerId, vis.params, getPalette(vis.params.gauge), { - metricAccessor, - minAccessor: minColumn.columnId, - maxAccessor: maxColumn.columnId, - }), - indexPatternIds: [indexPatternId], - }; -}; +export { convertToLens as convertGaugeToLens } from './gauge'; +export { convertToLens as convertGoalToLens } from './goal'; diff --git a/src/plugins/vis_types/gauge/public/convert_to_lens/types.ts b/src/plugins/vis_types/gauge/public/convert_to_lens/types.ts index 05cabcf6009ec..522c2931e3c0e 100644 --- a/src/plugins/vis_types/gauge/public/convert_to_lens/types.ts +++ b/src/plugins/vis_types/gauge/public/convert_to_lens/types.ts @@ -7,7 +7,11 @@ */ import { TimefilterContract } from '@kbn/data-plugin/public'; -import { NavigateToLensContext, GaugeVisConfiguration } from '@kbn/visualizations-plugin/common'; +import { + NavigateToLensContext, + GaugeVisConfiguration, + MetricVisConfiguration, +} from '@kbn/visualizations-plugin/common'; import { Vis } from '@kbn/visualizations-plugin/public'; import { GaugeVisParams } from '../types'; @@ -15,3 +19,8 @@ export type ConvertGaugeVisToLensVisualization = ( vis: Vis, timefilter?: TimefilterContract ) => Promise | null>; + +export type ConvertGoalVisToLensVisualization = ( + vis: Vis, + timefilter?: TimefilterContract +) => Promise | null>; diff --git a/src/plugins/vis_types/gauge/public/vis_type/gauge.tsx b/src/plugins/vis_types/gauge/public/vis_type/gauge.tsx index 0afb30a7257d8..d2e722c88717a 100644 --- a/src/plugins/vis_types/gauge/public/vis_type/gauge.tsx +++ b/src/plugins/vis_types/gauge/public/vis_type/gauge.tsx @@ -18,7 +18,7 @@ import { toExpressionAst } from '../to_ast'; import { getGaugeOptions } from '../editor/components'; import { GaugeVisParams } from '../types'; import { SplitTooltip } from './split_tooltip'; -import { convertToLens } from '../convert_to_lens'; +import { convertGaugeToLens } from '../convert_to_lens'; export const getGaugeVisTypeDefinition = ( props: GaugeTypeProps @@ -131,10 +131,10 @@ export const getGaugeVisTypeDefinition = ( ], }, requiresSearch: true, - navigateToLens: async (vis, timefilter) => (vis ? convertToLens(vis, timefilter) : null), + navigateToLens: async (vis, timefilter) => (vis ? convertGaugeToLens(vis, timefilter) : null), getExpressionVariables: async (vis, timeFilter) => { return { - canNavigateToLens: Boolean(vis?.params ? await convertToLens(vis, timeFilter) : null), + canNavigateToLens: Boolean(vis?.params ? await convertGaugeToLens(vis, timeFilter) : null), }; }, }); diff --git a/src/plugins/vis_types/gauge/public/vis_type/goal.tsx b/src/plugins/vis_types/gauge/public/vis_type/goal.tsx index 2cfbd349d6b3e..1e63652f5bd5f 100644 --- a/src/plugins/vis_types/gauge/public/vis_type/goal.tsx +++ b/src/plugins/vis_types/gauge/public/vis_type/goal.tsx @@ -17,7 +17,7 @@ import { getGaugeOptions } from '../editor/components'; import { toExpressionAst } from '../to_ast'; import { GaugeVisParams, GaugeType, GaugeTypeProps } from '../types'; import { SplitTooltip } from './split_tooltip'; -import { convertToLens } from '../convert_to_lens'; +import { convertGoalToLens } from '../convert_to_lens'; export const getGoalVisTypeDefinition = ( props: GaugeTypeProps @@ -123,10 +123,10 @@ export const getGoalVisTypeDefinition = ( ], }, requiresSearch: true, - navigateToLens: async (vis, timefilter) => (vis ? convertToLens(vis, timefilter) : null), + navigateToLens: async (vis, timefilter) => (vis ? convertGoalToLens(vis, timefilter) : null), getExpressionVariables: async (vis, timeFilter) => { return { - canNavigateToLens: Boolean(vis?.params ? await convertToLens(vis, timeFilter) : null), + canNavigateToLens: Boolean(vis?.params ? await convertGoalToLens(vis, timeFilter) : null), }; }, }); diff --git a/src/plugins/vis_types/metric/public/convert_to_lens/index.ts b/src/plugins/vis_types/metric/public/convert_to_lens/index.ts index d21731039f788..55f9e500b0a29 100644 --- a/src/plugins/vis_types/metric/public/convert_to_lens/index.ts +++ b/src/plugins/vis_types/metric/public/convert_to_lens/index.ts @@ -45,6 +45,7 @@ export const convertToLens: ConvertMetricVisToLensVisualization = async (vis, ti const [{ getColumnsFromVis, getPalette, getPercentageModeConfig }, { getConfiguration }] = await Promise.all([convertToLensModule, import('./configurations')]); + const percentageModeConfig = getPercentageModeConfig(vis.params.metric); const result = getColumnsFromVis( vis, timefilter, @@ -52,7 +53,7 @@ export const convertToLens: ConvertMetricVisToLensVisualization = async (vis, ti { splits: ['group'], }, - { dropEmptyRowsInDateHistogram: true, ...getPercentageModeConfig(vis.params.metric) } + { dropEmptyRowsInDateHistogram: true, ...percentageModeConfig } ); if (result === null) { @@ -84,7 +85,12 @@ export const convertToLens: ConvertMetricVisToLensVisualization = async (vis, ti columnOrder: [], }, ], - configuration: getConfiguration(layerId, vis.params, getPalette(vis.params.metric), result), + configuration: getConfiguration( + layerId, + vis.params, + getPalette(vis.params.metric, percentageModeConfig), + result + ), indexPatternIds: [indexPatternId], }; }; diff --git a/src/plugins/visualizations/common/convert_to_lens/lib/configurations/palette.test.ts b/src/plugins/visualizations/common/convert_to_lens/lib/configurations/palette.test.ts index 0304da03dd9ec..70a824b6c43b7 100644 --- a/src/plugins/visualizations/common/convert_to_lens/lib/configurations/palette.test.ts +++ b/src/plugins/visualizations/common/convert_to_lens/lib/configurations/palette.test.ts @@ -26,11 +26,11 @@ describe('getPalette', () => { ...params, colorsRange: [], }; - expect(getPalette(paramsWithNoneMetricColorMode)).toBeUndefined(); + expect(getPalette(paramsWithNoneMetricColorMode, { isPercentageMode: false })).toBeUndefined(); }); test('should return correct palette', () => { - expect(getPalette(params)).toEqual({ + expect(getPalette(params, { isPercentageMode: false, min: 0, max: 300 })).toEqual({ name: 'custom', params: { colorStops: [ diff --git a/src/plugins/visualizations/common/convert_to_lens/lib/configurations/palette.ts b/src/plugins/visualizations/common/convert_to_lens/lib/configurations/palette.ts index a2145e46ec561..a89177c914996 100644 --- a/src/plugins/visualizations/common/convert_to_lens/lib/configurations/palette.ts +++ b/src/plugins/visualizations/common/convert_to_lens/lib/configurations/palette.ts @@ -10,6 +10,7 @@ import color from 'color'; import { CustomPaletteParams, PaletteOutput } from '@kbn/coloring'; import { getStopsWithColorsFromRanges, PaletteConfig } from '../../../utils'; import { PaletteParams } from './types'; +import { PercentageModeConfig, PercentageModeConfigWithMinMax } from '../../types'; type ColorStopsWithMinMax = Pick< CustomPaletteParams, @@ -34,7 +35,8 @@ const buildPaletteParams = ({ color: colors, stop }: PaletteConfig): ColorStopsW }; const buildCustomPalette = ( - colorStopsWithMinMax: ColorStopsWithMinMax + colorStopsWithMinMax: ColorStopsWithMinMax, + isPercentRangeType: boolean = false ): PaletteOutput => { return { name: 'custom', @@ -44,7 +46,7 @@ const buildCustomPalette = ( progression: 'fixed', rangeMax: Infinity, rangeMin: -Infinity, - rangeType: 'number', + rangeType: isPercentRangeType ? 'percent' : 'number', reverse: false, ...colorStopsWithMinMax, }, @@ -52,8 +54,30 @@ const buildCustomPalette = ( }; }; +const convertToPercents = ( + value: number, + { min, max }: PercentageModeConfigWithMinMax, + isPercentPaletteSupported: boolean +) => { + const percent = (value - min) / (max - min); + return isPercentPaletteSupported ? percent * 100 : percent; +}; + +const convertToPercentColorStops = ( + colorStops: PaletteConfig, + percentageModeConfig: PercentageModeConfigWithMinMax, + isPercentPaletteSupported: boolean = false +) => { + const stop = colorStops.stop.map((stopValue) => + convertToPercents(stopValue, percentageModeConfig, isPercentPaletteSupported) + ); + return { ...colorStops, stop }; +}; + export const getPalette = ( - params: PaletteParams + params: PaletteParams, + percentageModeConfig: PercentageModeConfig, + isPercentPaletteSupported: boolean = false ): PaletteOutput | undefined => { const { colorSchema, colorsRange, invertColors } = params; @@ -62,5 +86,12 @@ export const getPalette = ( } const stopsWithColors = getStopsWithColorsFromRanges(colorsRange, colorSchema, invertColors); - return buildCustomPalette(buildPaletteParams(stopsWithColors)); + const percentStopsWithColors = percentageModeConfig.isPercentageMode + ? convertToPercentColorStops(stopsWithColors, percentageModeConfig, isPercentPaletteSupported) + : stopsWithColors; + + return buildCustomPalette( + buildPaletteParams(percentStopsWithColors), + isPercentPaletteSupported && percentageModeConfig.isPercentageMode + ); }; diff --git a/src/plugins/visualizations/common/convert_to_lens/types/common.ts b/src/plugins/visualizations/common/convert_to_lens/types/common.ts index fc62803c06cd6..63f9dcd482c58 100644 --- a/src/plugins/visualizations/common/convert_to_lens/types/common.ts +++ b/src/plugins/visualizations/common/convert_to_lens/types/common.ts @@ -51,10 +51,14 @@ export interface MinMax { max: number; } -export interface BasicPercentageModeConfig { +export interface BasicFullPercentageModeConfig { isPercentageMode: boolean; } -export type PercentageModeConfigWithMinMax = BasicPercentageModeConfig & MinMax; +export interface BasicPercentageModeConfig { + isPercentageMode: false; +} + +export type PercentageModeConfigWithMinMax = BasicFullPercentageModeConfig & MinMax; export type PercentageModeConfig = BasicPercentageModeConfig | PercentageModeConfigWithMinMax; From a3fc9eff5780c2ebb2023c571fc7a9ab3bc54fb8 Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Mon, 10 Oct 2022 17:39:34 +0300 Subject: [PATCH 34/43] Fixed percentage mode of gauge. --- src/plugins/vis_types/gauge/public/convert_to_lens/gauge.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/plugins/vis_types/gauge/public/convert_to_lens/gauge.ts b/src/plugins/vis_types/gauge/public/convert_to_lens/gauge.ts index 1cac4aa906b22..2d5a547e5d9de 100644 --- a/src/plugins/vis_types/gauge/public/convert_to_lens/gauge.ts +++ b/src/plugins/vis_types/gauge/public/convert_to_lens/gauge.ts @@ -83,9 +83,9 @@ export const convertToLens: ConvertGaugeVisToLensVisualization = async (vis, tim const indexPatternId = dataView.id!; const metricAccessor = result.metrics[0]; - const { min, max } = percentageModeConfig as PercentageModeConfigWithMinMax; - const minColumn = createStaticValueColumn(min); - const maxColumn = createStaticValueColumn(max); + const { min, max, isPercentageMode } = percentageModeConfig as PercentageModeConfigWithMinMax; + const minColumn = createStaticValueColumn(isPercentageMode ? 0 : min); + const maxColumn = createStaticValueColumn(isPercentageMode ? 1 : max); const columns = [...result.columns, minColumn, maxColumn]; return { From ad9f9f47284d1b9d42bce4b8030e8d5643c1700d Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Mon, 10 Oct 2022 17:59:41 +0300 Subject: [PATCH 35/43] palette tests added. --- .../lib/configurations/palette.test.ts | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/src/plugins/visualizations/common/convert_to_lens/lib/configurations/palette.test.ts b/src/plugins/visualizations/common/convert_to_lens/lib/configurations/palette.test.ts index 70a824b6c43b7..e157803df1edb 100644 --- a/src/plugins/visualizations/common/convert_to_lens/lib/configurations/palette.test.ts +++ b/src/plugins/visualizations/common/convert_to_lens/lib/configurations/palette.test.ts @@ -29,6 +29,60 @@ describe('getPalette', () => { expect(getPalette(paramsWithNoneMetricColorMode, { isPercentageMode: false })).toBeUndefined(); }); + test('should return correct palette for percentage mode', () => { + expect(getPalette(params, { isPercentageMode: true, min: 0, max: 300 })).toEqual({ + name: 'custom', + params: { + colorStops: [ + { color: '#FFFFFF', stop: 0 }, + { color: '#979797', stop: 0.3333333333333333 }, + { color: '#000000', stop: 0.6666666666666666 }, + ], + continuity: 'none', + maxSteps: 5, + name: 'custom', + progression: 'fixed', + rangeMax: 1, + rangeMin: 0, + rangeType: 'number', + reverse: false, + stops: [ + { color: '#FFFFFF', stop: 0.3333333333333333 }, + { color: '#979797', stop: 0.6666666666666666 }, + { color: '#000000', stop: 1 }, + ], + }, + type: 'palette', + }); + }); + + test('should return correct palette for percentage mode with percent range type', () => { + expect(getPalette(params, { isPercentageMode: true, min: 0, max: 300 }, true)).toEqual({ + name: 'custom', + params: { + colorStops: [ + { color: '#FFFFFF', stop: 0 }, + { color: '#979797', stop: 33.33333333333333 }, + { color: '#000000', stop: 66.66666666666666 }, + ], + continuity: 'none', + maxSteps: 5, + name: 'custom', + progression: 'fixed', + rangeMax: 100, + rangeMin: 0, + rangeType: 'percent', + reverse: false, + stops: [ + { color: '#FFFFFF', stop: 33.33333333333333 }, + { color: '#979797', stop: 66.66666666666666 }, + { color: '#000000', stop: 100 }, + ], + }, + type: 'palette', + }); + }); + test('should return correct palette', () => { expect(getPalette(params, { isPercentageMode: false, min: 0, max: 300 })).toEqual({ name: 'custom', From 01770f4cb947e30db9660fdbe6b54be332ab09bb Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Mon, 10 Oct 2022 18:01:52 +0300 Subject: [PATCH 36/43] Fixed types. --- .../common/convert_to_lens/lib/metrics/metrics.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/visualizations/common/convert_to_lens/lib/metrics/metrics.test.ts b/src/plugins/visualizations/common/convert_to_lens/lib/metrics/metrics.test.ts index 207dedd133bc9..1cf3ff0b84064 100644 --- a/src/plugins/visualizations/common/convert_to_lens/lib/metrics/metrics.test.ts +++ b/src/plugins/visualizations/common/convert_to_lens/lib/metrics/metrics.test.ts @@ -598,7 +598,7 @@ describe('convertMetricToColumns valid cases', () => { { aggType: METRIC_TYPES.AVG_BUCKET } as SchemaConfig, dataView, [], - { isPercentageMode: true }, + { isPercentageMode: true, min: 0, max: 100 }, ], result, mockConvertToColumnInPercentageMode, From a5b2f498c4ed13d168b5083b6220c45cfd82e904 Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Mon, 10 Oct 2022 18:18:10 +0300 Subject: [PATCH 37/43] Added tests for goal. --- .../configurations/goal.test.ts | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/plugins/vis_types/gauge/public/convert_to_lens/configurations/goal.test.ts diff --git a/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/goal.test.ts b/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/goal.test.ts new file mode 100644 index 0000000000000..badafcdfebc92 --- /dev/null +++ b/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/goal.test.ts @@ -0,0 +1,45 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { CustomPaletteParams, PaletteOutput } from '@kbn/coloring'; +import { getConfiguration } from './goal'; + +describe('getConfiguration', () => { + const palette = { + name: 'custom', + params: { name: 'custom' }, + type: 'palette', + } as PaletteOutput; + + test('shourd return correct configuration', () => { + const layerId = 'layer-id'; + const metricAccessor = 'metric-id'; + const breakdownByAccessor = 'bucket-id'; + const metrics = [metricAccessor]; + const buckets = [breakdownByAccessor]; + const maxAccessor = 'max-accessor-id'; + const collapseFn = 'sum'; + expect( + getConfiguration(layerId, palette, { + metrics, + buckets, + maxAccessor, + columnsWithoutReferenced: [], + bucketCollapseFn: { [metricAccessor]: collapseFn }, + }) + ).toEqual({ + breakdownByAccessor, + collapseFn, + layerId, + layerType: 'data', + maxAccessor, + metricAccessor, + palette, + }); + }); +}); From 2b7985e61fdabd594421845f61d59311e1c5b0a5 Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Mon, 10 Oct 2022 18:33:33 +0300 Subject: [PATCH 38/43] Added tests for goal. --- .../gauge/public/convert_to_lens/goal.test.ts | 168 ++++++++++++++++++ 1 file changed, 168 insertions(+) create mode 100644 src/plugins/vis_types/gauge/public/convert_to_lens/goal.test.ts diff --git a/src/plugins/vis_types/gauge/public/convert_to_lens/goal.test.ts b/src/plugins/vis_types/gauge/public/convert_to_lens/goal.test.ts new file mode 100644 index 0000000000000..4d9247293e7a8 --- /dev/null +++ b/src/plugins/vis_types/gauge/public/convert_to_lens/goal.test.ts @@ -0,0 +1,168 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { ColorSchemas } from '@kbn/charts-plugin/common'; +import { Vis } from '@kbn/visualizations-plugin/public'; +import { convertToLens } from './goal'; +import { GaugeVisParams } from '../types'; + +const mockGetColumnsFromVis = jest.fn(); +const mockGetPercentageColumnFormulaColumn = jest.fn(); +const mockGetConfiguration = jest.fn().mockReturnValue({}); +const mockGetPercentageModeConfig = jest.fn(); +const mockGetPalette = jest.fn(); +const mockCreateStaticValueColumn = jest.fn(); + +jest.mock('../services', () => ({ + getDataViewsStart: jest.fn(() => ({ get: () => ({}), getDefault: () => ({}) })), +})); + +jest.mock('@kbn/visualizations-plugin/public', () => ({ + convertToLensModule: Promise.resolve({ + getColumnsFromVis: jest.fn(() => mockGetColumnsFromVis()), + getPercentageColumnFormulaColumn: jest.fn(() => mockGetPercentageColumnFormulaColumn()), + getPercentageModeConfig: jest.fn(() => mockGetPercentageModeConfig()), + getPalette: jest.fn(() => mockGetPalette()), + createStaticValueColumn: jest.fn(() => mockCreateStaticValueColumn()), + }), + getDataViewByIndexPatternId: jest.fn(() => ({ id: 'index-pattern' })), +})); + +jest.mock('./configurations/goal', () => ({ + getConfiguration: jest.fn(() => mockGetConfiguration()), +})); + +const params: GaugeVisParams = { + addTooltip: false, + addLegend: false, + isDisplayWarning: true, + gauge: { + type: 'meter', + orientation: 'vertical', + alignment: 'automatic', + gaugeType: 'Arc', + scale: { + color: 'rgba(105,112,125,0.2)', + labels: false, + show: false, + }, + gaugeStyle: 'Full', + extendRange: false, + backStyle: 'Full', + percentageMode: false, + percentageFormatPattern: '', + colorSchema: ColorSchemas.Greys, + colorsRange: [], + labels: {}, + invertColors: false, + style: { + bgFill: '', + bgColor: false, + labelColor: false, + subText: '', + fontSize: 10, + }, + }, + type: 'gauge', +}; + +const vis = { + isHierarchical: () => false, + type: {}, + params, + data: {}, +} as unknown as Vis; + +const timefilter = { + getAbsoluteTime: () => {}, +} as any; + +describe('convertToLens', () => { + beforeEach(() => { + mockGetPercentageModeConfig.mockReturnValue({ + isPercentageMode: false, + min: 0, + max: 100, + }); + mockCreateStaticValueColumn.mockReturnValue({}); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + test('should return null if getColumnsFromVis returns null', async () => { + mockGetColumnsFromVis.mockReturnValue(null); + const result = await convertToLens(vis, timefilter); + expect(mockGetColumnsFromVis).toBeCalledTimes(1); + expect(result).toBeNull(); + }); + + test('should return null if metrics count is more than 1', async () => { + mockGetColumnsFromVis.mockReturnValue({ + metrics: ['1', '2'], + columns: [{ columnId: '2' }, { columnId: '1' }], + }); + const result = await convertToLens(vis, timefilter); + expect(mockGetColumnsFromVis).toBeCalledTimes(1); + expect(result).toBeNull(); + }); + test('should return null if buckets count is more than 1', async () => { + mockGetColumnsFromVis.mockReturnValue({ + metrics: [], + buckets: ['1', '2'], + columns: [{ columnId: '2' }, { columnId: '1' }], + }); + const result = await convertToLens(vis, timefilter); + expect(mockGetColumnsFromVis).toBeCalledTimes(1); + expect(result).toBeNull(); + }); + + test('should return null if metric column data type is different from number', async () => { + mockGetColumnsFromVis.mockReturnValue({ + metrics: ['1'], + buckets: ['2'], + columns: [{ columnId: '2' }, { columnId: '1', dataType: 'string' }], + }); + const result = await convertToLens(vis, timefilter); + expect(mockGetColumnsFromVis).toBeCalledTimes(1); + expect(result).toBeNull(); + }); + test('should return correct state for valid vis', async () => { + const config = { + layerType: 'data', + metricAccessor: '1', + }; + + mockGetColumnsFromVis.mockReturnValue({ + metrics: ['1'], + buckets: ['2'], + columns: [{ columnId: '2' }, { columnId: '1', dataType: 'number' }], + columnsWithoutReferenced: [ + { columnId: '1', meta: { aggId: 'agg-1' } }, + { columnId: '2', meta: { aggId: 'agg-2' } }, + ], + }); + mockGetConfiguration.mockReturnValue(config); + + const result = await convertToLens(vis, timefilter); + expect(mockGetColumnsFromVis).toBeCalledTimes(1); + expect(mockGetConfiguration).toBeCalledTimes(1); + expect(mockGetPalette).toBeCalledTimes(1); + expect(result?.type).toEqual('lnsMetric'); + expect(result?.layers.length).toEqual(1); + expect(result?.layers[0]).toEqual( + expect.objectContaining({ + columnOrder: [], + columns: [{ columnId: '2' }, { columnId: '1', dataType: 'number' }, {}], + indexPatternId: 'index-pattern', + }) + ); + expect(result?.configuration).toEqual(config); + }); +}); From b2200076c06a49dc5ea3925f23a36cea57e3860d Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Mon, 10 Oct 2022 19:17:36 +0300 Subject: [PATCH 39/43] Added tests for goal. --- .../functional/page_objects/visualize_page.ts | 4 ++ .../group3/open_in_lens/agg_based/goal.ts | 52 +++++++++++++++++++ .../group3/open_in_lens/agg_based/index.ts | 1 + 3 files changed, 57 insertions(+) create mode 100644 x-pack/test/functional/apps/lens/group3/open_in_lens/agg_based/goal.ts diff --git a/test/functional/page_objects/visualize_page.ts b/test/functional/page_objects/visualize_page.ts index 95adb7e64b1ec..a75e54c6bcdd7 100644 --- a/test/functional/page_objects/visualize_page.ts +++ b/test/functional/page_objects/visualize_page.ts @@ -180,6 +180,10 @@ export class VisualizePageObject extends FtrService { await this.clickVisType('gauge'); } + public async clickGoal() { + await this.clickVisType('goal'); + } + public async clickPieChart() { await this.clickVisType('pie'); } diff --git a/x-pack/test/functional/apps/lens/group3/open_in_lens/agg_based/goal.ts b/x-pack/test/functional/apps/lens/group3/open_in_lens/agg_based/goal.ts new file mode 100644 index 0000000000000..0aa44c8dcd6e9 --- /dev/null +++ b/x-pack/test/functional/apps/lens/group3/open_in_lens/agg_based/goal.ts @@ -0,0 +1,52 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../../../ftr_provider_context'; + +export default function ({ getPageObjects, getService }: FtrProviderContext) { + const { visualize, lens, timePicker } = getPageObjects(['visualize', 'lens', 'timePicker']); + + const testSubjects = getService('testSubjects'); + + describe('Goal', function describeIndexTests() { + const isNewChartsLibraryEnabled = true; + + before(async () => { + await visualize.initTests(isNewChartsLibraryEnabled); + }); + + beforeEach(async () => { + await visualize.navigateToNewAggBasedVisualization(); + await visualize.clickGoal(); + await visualize.clickNewSearch(); + await timePicker.setDefaultAbsoluteRange(); + }); + + it('should show the "Edit Visualization in Lens" menu item', async () => { + const button = await testSubjects.exists('visualizeEditInLensButton'); + expect(button).to.eql(true); + }); + + it('should convert to Lens', async () => { + const button = await testSubjects.find('visualizeEditInLensButton'); + await button.click(); + await lens.waitForVisualization('mtrVis'); + expect((await lens.getMetricVisualizationData()).length).to.be.equal(1); + expect(await lens.getMetricVisualizationData()).to.eql([ + { + title: 'Count', + subtitle: undefined, + extraText: '', + value: '140.05%', + color: 'rgba(245, 247, 250, 1)', + showingBar: true, + }, + ]); + }); + }); +} diff --git a/x-pack/test/functional/apps/lens/group3/open_in_lens/agg_based/index.ts b/x-pack/test/functional/apps/lens/group3/open_in_lens/agg_based/index.ts index 53e1302816466..cc28ead0c55cd 100644 --- a/x-pack/test/functional/apps/lens/group3/open_in_lens/agg_based/index.ts +++ b/x-pack/test/functional/apps/lens/group3/open_in_lens/agg_based/index.ts @@ -12,5 +12,6 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./pie')); loadTestFile(require.resolve('./metric')); loadTestFile(require.resolve('./gauge')); + loadTestFile(require.resolve('./goal')); }); } From 10dfb1bd08c23fda6cfaadaa8927e8bbe93444d7 Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Tue, 11 Oct 2022 10:29:46 +0300 Subject: [PATCH 40/43] Added support of subtitle and tests. --- .../configurations/goal.test.ts | 41 ++++++++++++++++++- .../convert_to_lens/configurations/goal.ts | 3 ++ .../gauge/public/convert_to_lens/goal.ts | 2 + 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/goal.test.ts b/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/goal.test.ts index badafcdfebc92..7c04f19400272 100644 --- a/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/goal.test.ts +++ b/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/goal.test.ts @@ -6,9 +6,48 @@ * Side Public License, v 1. */ +import { ColorSchemas } from '@kbn/charts-plugin/common'; import { CustomPaletteParams, PaletteOutput } from '@kbn/coloring'; +import { GaugeVisParams } from '../../types'; import { getConfiguration } from './goal'; +const params: GaugeVisParams = { + addTooltip: false, + addLegend: false, + isDisplayWarning: true, + gauge: { + type: 'meter', + orientation: 'vertical', + alignment: 'automatic', + gaugeType: 'Arc', + scale: { + color: 'rgba(105,112,125,0.2)', + labels: false, + show: false, + }, + gaugeStyle: 'Full', + extendRange: false, + backStyle: 'Full', + percentageMode: false, + percentageFormatPattern: '', + colorSchema: ColorSchemas.Greys, + colorsRange: [ + { type: 'range', from: 0, to: 100 }, + { type: 'range', from: 100, to: 200 }, + ], + labels: {}, + invertColors: false, + style: { + bgFill: '', + bgColor: false, + labelColor: false, + subText: '', + fontSize: 10, + }, + }, + type: 'gauge', +}; + describe('getConfiguration', () => { const palette = { name: 'custom', @@ -25,7 +64,7 @@ describe('getConfiguration', () => { const maxAccessor = 'max-accessor-id'; const collapseFn = 'sum'; expect( - getConfiguration(layerId, palette, { + getConfiguration(layerId, params, palette, { metrics, buckets, maxAccessor, diff --git a/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/goal.ts b/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/goal.ts index 0a0a538b71082..91e58333e8d56 100644 --- a/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/goal.ts +++ b/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/goal.ts @@ -8,9 +8,11 @@ import { CustomPaletteParams, PaletteOutput } from '@kbn/coloring'; import { Column, MetricVisConfiguration } from '@kbn/visualizations-plugin/common'; +import { GaugeVisParams } from '../../types'; export const getConfiguration = ( layerId: string, + { gauge }: GaugeVisParams, palette: PaletteOutput | undefined, { metrics, @@ -36,5 +38,6 @@ export const getConfiguration = ( breakdownByAccessor, maxAccessor, collapseFn: Object.values(bucketCollapseFn ?? {})[0], + subtitle: gauge.labels.show && gauge.style.subText ? gauge.style.subText : undefined, }; }; diff --git a/src/plugins/vis_types/gauge/public/convert_to_lens/goal.ts b/src/plugins/vis_types/gauge/public/convert_to_lens/goal.ts index 566e917cd1cf5..a57dfedb02581 100644 --- a/src/plugins/vis_types/gauge/public/convert_to_lens/goal.ts +++ b/src/plugins/vis_types/gauge/public/convert_to_lens/goal.ts @@ -84,6 +84,7 @@ export const convertToLens: ConvertGoalVisToLensVisualization = async (vis, time const columns = [...result.columns, maxColumn]; const layerId = uuid(); const indexPatternId = dataView.id!; + return { type: 'lnsMetric', layers: [ @@ -96,6 +97,7 @@ export const convertToLens: ConvertGoalVisToLensVisualization = async (vis, time ], configuration: getConfiguration( layerId, + vis.params, getPalette(vis.params.gauge, percentageModeConfig, true), { ...result, From e7c8e8993b575382ebcd4b444628fea745db43c9 Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Tue, 11 Oct 2022 10:35:33 +0300 Subject: [PATCH 41/43] Fixed the problem with siblings. --- src/plugins/vis_types/gauge/public/convert_to_lens/gauge.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/vis_types/gauge/public/convert_to_lens/gauge.ts b/src/plugins/vis_types/gauge/public/convert_to_lens/gauge.ts index 2d5a547e5d9de..be664d3500a7c 100644 --- a/src/plugins/vis_types/gauge/public/convert_to_lens/gauge.ts +++ b/src/plugins/vis_types/gauge/public/convert_to_lens/gauge.ts @@ -68,7 +68,7 @@ export const convertToLens: ConvertGaugeVisToLensVisualization = async (vis, tim } // for now, multiple metrics are not supported - if (result.metrics.length > 1) { + if (result.metrics.length > 1 || result.buckets.length) { return null; } From f25bc57560d7182a23417b06f4c943fa3ee4da98 Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Tue, 11 Oct 2022 11:29:21 +0300 Subject: [PATCH 42/43] Fixed tests. --- .../vis_types/gauge/public/convert_to_lens/gauge.test.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/plugins/vis_types/gauge/public/convert_to_lens/gauge.test.ts b/src/plugins/vis_types/gauge/public/convert_to_lens/gauge.test.ts index bc71e913fe85b..f7c07dafd85c6 100644 --- a/src/plugins/vis_types/gauge/public/convert_to_lens/gauge.test.ts +++ b/src/plugins/vis_types/gauge/public/convert_to_lens/gauge.test.ts @@ -106,6 +106,7 @@ describe('convertToLens', () => { test('should return null if metrics count is more than 1', async () => { mockGetColumnsFromVis.mockReturnValue({ metrics: ['1', '2'], + buckets: [], columns: [{ columnId: '2' }, { columnId: '1' }], }); const result = await convertToLens(vis, timefilter); @@ -116,6 +117,7 @@ describe('convertToLens', () => { test('should return null if metric column data type is different from number', async () => { mockGetColumnsFromVis.mockReturnValue({ metrics: ['1'], + buckets: [], columns: [{ columnId: '2' }, { columnId: '1', dataType: 'string' }], }); const result = await convertToLens(vis, timefilter); @@ -129,6 +131,7 @@ describe('convertToLens', () => { mockGetColumnsFromVis.mockReturnValue({ metrics: ['1'], + buckets: [], columns: [{ columnId: '1', dataType: 'number' }], columnsWithoutReferenced: [ { columnId: '1', meta: { aggId: 'agg-1' } }, From d5df1eb4b5b5e6553e5a245b162b5b32a4a7b235 Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Tue, 11 Oct 2022 12:20:08 +0300 Subject: [PATCH 43/43] Fixed problems with dataTypes. --- .../common/convert_to_lens/lib/convert/metric.ts | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/plugins/visualizations/common/convert_to_lens/lib/convert/metric.ts b/src/plugins/visualizations/common/convert_to_lens/lib/convert/metric.ts index f46adea9538dc..eb21b9f0fe91d 100644 --- a/src/plugins/visualizations/common/convert_to_lens/lib/convert/metric.ts +++ b/src/plugins/visualizations/common/convert_to_lens/lib/convert/metric.ts @@ -23,6 +23,7 @@ import { } from './types'; import { getFieldNameFromField } from '../utils'; import { isFieldValid } from '../../utils'; +import { Operation } from '../../types'; type MetricAggregationWithoutParams = | typeof Operations.AVERAGE @@ -97,12 +98,19 @@ export const convertMetricAggregationColumnWithoutSpecialParams = ( return null; } + const column = createColumn(agg, field, { + reducedTimeRange, + }); + return { operationType: aggregation.name, sourceField, - ...createColumn(agg, field, { - reducedTimeRange, - }), + ...column, + dataType: ([Operations.COUNT, Operations.UNIQUE_COUNT] as Operation[]).includes( + aggregation.name + ) + ? 'number' + : column.dataType, params: { ...getFormat() }, timeShift: agg.aggParams?.timeShift, };