From 33cc09e7ca057a91986f3da40ab76175138e0ec8 Mon Sep 17 00:00:00 2001 From: Diana Derevyankina Date: Fri, 14 Aug 2020 14:27:16 +0300 Subject: [PATCH 01/10] KQL support in filter ratio in TSVB Closes #67503 --- .../vis_type_timeseries/common/vis_schema.ts | 14 ++++++- .../components/aggs/filter_ratio.js | 28 +++++++++---- .../series/filter_ratios.js | 20 ++++++---- .../visualization_migrations.test.ts | 34 ++++++++++++++++ .../saved_objects/visualization_migrations.ts | 40 +++++++++++++++++++ 5 files changed, 120 insertions(+), 16 deletions(-) diff --git a/src/plugins/vis_type_timeseries/common/vis_schema.ts b/src/plugins/vis_type_timeseries/common/vis_schema.ts index c1730e6a154358..14abd4c884cc41 100644 --- a/src/plugins/vis_type_timeseries/common/vis_schema.ts +++ b/src/plugins/vis_type_timeseries/common/vis_schema.ts @@ -80,8 +80,18 @@ export const metricsItems = schema.object({ field: stringOptionalNullable, id: stringRequired, metric_agg: stringOptionalNullable, - numerator: stringOptionalNullable, - denominator: stringOptionalNullable, + numerator: schema.maybe( + schema.object({ + language: schema.string(), + query: schema.string(), + }) + ), + denominator: schema.maybe( + schema.object({ + language: schema.string(), + query: schema.string(), + }) + ), sigma: stringOptionalNullable, unit: stringOptionalNullable, model_type: stringOptionalNullable, diff --git a/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.js index 2aa994c09a2ad3..bf27ec32f4082b 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.js +++ b/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.js @@ -24,19 +24,19 @@ import { FieldSelect } from './field_select'; import { AggRow } from './agg_row'; import { createChangeHandler } from '../lib/create_change_handler'; import { createSelectHandler } from '../lib/create_select_handler'; -import { createTextHandler } from '../lib/create_text_handler'; import { htmlIdGenerator, EuiFlexGroup, EuiFlexItem, EuiFormLabel, - EuiFieldText, EuiSpacer, EuiFormRow, } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { KBN_FIELD_TYPES } from '../../../../../../plugins/data/public'; import { getSupportedFieldsByMetricType } from '../lib/get_supported_fields_by_metric_type'; +import { getDefaultQueryLanguage } from '../lib/get_default_query_language'; +import { QueryBarWrapper } from '../query_bar_wrapper'; const isFieldHistogram = (fields, indexPattern, field) => { const indexFields = fields[indexPattern]; @@ -51,13 +51,13 @@ export const FilterRatioAgg = (props) => { const handleChange = createChangeHandler(props.onChange, props.model); const handleSelectChange = createSelectHandler(handleChange); - const handleTextChange = createTextHandler(handleChange); + const handleQueryChange = (name, value) => handleChange?.({ [name]: value }); const indexPattern = (series.override_index_pattern && series.series_index_pattern) || panel.index_pattern; const defaults = { - numerator: '*', - denominator: '*', + numerator: { query: '', language: getDefaultQueryLanguage() }, + denominator: { query: '', language: getDefaultQueryLanguage() }, metric_agg: 'count', }; @@ -101,7 +101,14 @@ export const FilterRatioAgg = (props) => { /> } > - + handleQueryChange('numerator', query)} + indexPatterns={[indexPattern]} + /> @@ -115,7 +122,14 @@ export const FilterRatioAgg = (props) => { /> } > - + handleQueryChange('denominator', query)} + indexPatterns={[indexPattern]} + /> diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/filter_ratios.js b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/filter_ratios.js index 0706ab6be96ea5..f68d8ea25ecaf9 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/filter_ratios.js +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/filter_ratios.js @@ -20,17 +20,23 @@ const filter = (metric) => metric.type === 'filter_ratio'; import { bucketTransform } from '../../helpers/bucket_transform'; import { overwrite } from '../../helpers'; +import { esQuery } from '../../../../../../data/server'; -export function ratios(req, panel, series) { +export function ratios(req, panel, series, esQueryConfig, indexPatternObject) { return (next) => (doc) => { + const filters = !panel.ignore_global_filter ? req.payload.filters : []; if (series.metrics.some(filter)) { series.metrics.filter(filter).forEach((metric) => { - overwrite(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}-numerator.filter`, { - query_string: { query: metric.numerator || '*', analyze_wildcard: true }, - }); - overwrite(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}-denominator.filter`, { - query_string: { query: metric.denominator || '*', analyze_wildcard: true }, - }); + overwrite( + doc, + `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}-numerator.filter`, + esQuery.buildEsQuery(indexPatternObject, metric.numerator, filters, esQueryConfig) + ); + overwrite( + doc, + `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}-denominator.filter`, + esQuery.buildEsQuery(indexPatternObject, metric.denominator, filters, esQueryConfig) + ); let numeratorPath = `${metric.id}-numerator>_count`; let denominatorPath = `${metric.id}-denominator>_count`; diff --git a/src/plugins/visualizations/server/saved_objects/visualization_migrations.test.ts b/src/plugins/visualizations/server/saved_objects/visualization_migrations.test.ts index d27d021465dc93..05f00e12c172e0 100644 --- a/src/plugins/visualizations/server/saved_objects/visualization_migrations.test.ts +++ b/src/plugins/visualizations/server/saved_objects/visualization_migrations.test.ts @@ -1544,4 +1544,38 @@ describe('migration visualization', () => { expect(series[0].split_color_mode).toBeUndefined(); }); }); + + describe('7.10.0 tsvb filter_ratio migration', () => { + const migrate = (doc: any) => + visualizationSavedObjectTypeMigrations['7.10.0']( + doc as Parameters[0], + savedObjectMigrationContext + ); + + const testDoc1 = { + attributes: { + title: 'My Vis', + description: 'This is my super cool vis.', + visState: `{"type":"metrics","params":{"id":"61ca57f0-469d-11e7-af02-69e470af7417","type":"timeseries", + "series":[{"id":"61ca57f1-469d-11e7-af02-69e470af7417","metrics":[{"id":"61ca57f2-469d-11e7-af02-69e470af7417", + "type":"filter_ratio","numerator":"Filter Bytes Test:>1000","denominator":"Filter Bytes Test:<1000"}]}]}}`, + }, + }; + + it('should replace numerator string with a query object', () => { + const migratedTestDoc1 = migrate(testDoc1); + const metric = JSON.parse(migratedTestDoc1.attributes.visState).params.series[0].metrics[0]; + + expect(metric.numerator).toHaveProperty('query'); + expect(metric.numerator).toHaveProperty('language'); + }); + + it('should replace denominator string with a query object', () => { + const migratedTestDoc1 = migrate(testDoc1); + const metric = JSON.parse(migratedTestDoc1.attributes.visState).params.series[0].metrics[0]; + + expect(metric.denominator).toHaveProperty('query'); + expect(metric.denominator).toHaveProperty('language'); + }); + }); }); diff --git a/src/plugins/visualizations/server/saved_objects/visualization_migrations.ts b/src/plugins/visualizations/server/saved_objects/visualization_migrations.ts index 74881b9d99ae8c..f108a524bb0336 100644 --- a/src/plugins/visualizations/server/saved_objects/visualization_migrations.ts +++ b/src/plugins/visualizations/server/saved_objects/visualization_migrations.ts @@ -99,6 +99,45 @@ const migratePercentileRankAggregation: SavedObjectMigrationFn = (doc) return doc; }; +// [TSVB] Replace string query with object +const migrateFilterRatioQuery: SavedObjectMigrationFn = (doc) => { + const visStateJSON = get(doc, 'attributes.visState'); + let visState; + + if (visStateJSON) { + try { + visState = JSON.parse(visStateJSON); + } catch (e) { + // Let it go, the data is invalid and we'll leave it as is + } + if (visState && visState.type === 'metrics') { + const series: any[] = get(visState, 'params.series') || []; + + series.forEach((part) => { + (part.metrics || []).forEach((metric: any) => { + if (metric.type === 'filter_ratio') { + if (metric.numerator && typeof metric.numerator === 'string') { + metric.numerator = { query: metric.numerator, language: 'lucene' }; + } + if (metric.denominator && typeof metric.denominator === 'string') { + metric.denominator = { query: metric.denominator, language: 'lucene' }; + } + } + }); + }); + + return { + ...doc, + attributes: { + ...doc.attributes, + visState: JSON.stringify(visState), + }, + }; + } + } + return doc; +}; + // [TSVB] Remove stale opperator key const migrateOperatorKeyTypo: SavedObjectMigrationFn = (doc) => { const visStateJSON = get(doc, 'attributes.visState'); @@ -713,4 +752,5 @@ export const visualizationSavedObjectTypeMigrations = { '7.4.2': flow(transformSplitFiltersStringToQueryObject), '7.7.0': flow(migrateOperatorKeyTypo, migrateSplitByChartRow), '7.8.0': flow(migrateTsvbDefaultColorPalettes), + '7.10.0': flow(migrateFilterRatioQuery), }; From f1c790fc7b0c3e6eefdd8851472f78948e11f4f8 Mon Sep 17 00:00:00 2001 From: Diana Derevyankina Date: Sat, 15 Aug 2020 18:49:58 +0300 Subject: [PATCH 02/10] Fix filter_ratio and filter_ratios tests --- .../components/aggs/filter_ratio.test.js | 4 + .../series/filter_ratios.test.js | 80 ++++++++++++++----- 2 files changed, 66 insertions(+), 18 deletions(-) diff --git a/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.test.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.test.js index 275aa5a252479f..b92a5069534557 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.test.js +++ b/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.test.js @@ -23,6 +23,10 @@ import { FilterRatioAgg } from './filter_ratio'; import { FIELDS, METRIC, SERIES, PANEL } from '../../../test_utils'; import { EuiComboBox } from '@elastic/eui'; +jest.mock('../query_bar_wrapper', () => ({ + QueryBarWrapper: jest.fn(() => null), +})); + describe('TSVB Filter Ratio', () => { const setup = (metric) => { const series = { ...SERIES, metrics: [metric] }; diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/filter_ratios.test.js b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/filter_ratios.test.js index e15f0459898392..dbc941c4eb29a4 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/filter_ratios.test.js +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/filter_ratios.test.js @@ -19,10 +19,12 @@ import { ratios } from './filter_ratios'; -describe('ratios(req, panel, series)', () => { +describe('ratios(req, panel, series, esQueryConfig, indexPatternObject)', () => { let panel; let series; let req; + let esQueryConfig; + let indexPatternObject; beforeEach(() => { panel = { time_field: 'timestamp', @@ -36,8 +38,8 @@ describe('ratios(req, panel, series)', () => { { id: 'metric-1', type: 'filter_ratio', - numerator: 'errors', - denominator: '*', + numerator: { query: 'errors', language: 'lucene' }, + denominator: { query: '*', language: 'lucene' }, metric_agg: 'avg', field: 'cpu', }, @@ -51,17 +53,23 @@ describe('ratios(req, panel, series)', () => { }, }, }; + esQueryConfig = { + allowLeadingWildcards: true, + queryStringOptions: { analyze_wildcard: true }, + ignoreFilterIfFieldNotInIndex: false, + }; + indexPatternObject = {}; }); test('calls next when finished', () => { const next = jest.fn(); - ratios(req, panel, series)(next)({}); + ratios(req, panel, series, esQueryConfig, indexPatternObject)(next)({}); expect(next.mock.calls.length).toEqual(1); }); test('returns filter ratio aggs', () => { const next = (doc) => doc; - const doc = ratios(req, panel, series)(next)({}); + const doc = ratios(req, panel, series, esQueryConfig, indexPatternObject)(next)({}); expect(doc).toEqual({ aggs: { test: { @@ -88,9 +96,18 @@ describe('ratios(req, panel, series)', () => { }, }, filter: { - query_string: { - analyze_wildcard: true, - query: '*', + bool: { + must: [ + { + query_string: { + query: '*', + analyze_wildcard: true, + }, + }, + ], + filter: [], + should: [], + must_not: [], }, }, }, @@ -103,9 +120,18 @@ describe('ratios(req, panel, series)', () => { }, }, filter: { - query_string: { - analyze_wildcard: true, - query: 'errors', + bool: { + must: [ + { + query_string: { + query: 'errors', + analyze_wildcard: true, + }, + }, + ], + filter: [], + should: [], + must_not: [], }, }, }, @@ -120,7 +146,7 @@ describe('ratios(req, panel, series)', () => { test('returns empty object when field is not set', () => { delete series.metrics[0].field; const next = (doc) => doc; - const doc = ratios(req, panel, series)(next)({}); + const doc = ratios(req, panel, series, esQueryConfig, indexPatternObject)(next)({}); expect(doc).toEqual({ aggs: { test: { @@ -141,18 +167,36 @@ describe('ratios(req, panel, series)', () => { 'metric-1-denominator': { aggs: { metric: {} }, filter: { - query_string: { - analyze_wildcard: true, - query: '*', + bool: { + must: [ + { + query_string: { + analyze_wildcard: true, + query: '*', + }, + }, + ], + filter: [], + should: [], + must_not: [], }, }, }, 'metric-1-numerator': { aggs: { metric: {} }, filter: { - query_string: { - analyze_wildcard: true, - query: 'errors', + bool: { + must: [ + { + query_string: { + analyze_wildcard: true, + query: 'errors', + }, + }, + ], + filter: [], + should: [], + must_not: [], }, }, }, From ee340b2ae15a5b225c0aa9f333ca473a8efd49aa Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Mon, 17 Aug 2020 15:03:53 +0300 Subject: [PATCH 03/10] fix JEST --- .../application/components/aggs/filter_ratio.test.js | 4 ++++ .../components/aggs/histogram_support.test.js | 9 +++++++++ 2 files changed, 13 insertions(+) diff --git a/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.test.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.test.js index b92a5069534557..43b248f9fce99d 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.test.js +++ b/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.test.js @@ -27,6 +27,10 @@ jest.mock('../query_bar_wrapper', () => ({ QueryBarWrapper: jest.fn(() => null), })); +jest.mock('../lib/get_default_query_language', () => ({ + getDefaultQueryLanguage: jest.fn(() => 'lucene'), +})); + describe('TSVB Filter Ratio', () => { const setup = (metric) => { const series = { ...SERIES, metrics: [metric] }; diff --git a/src/plugins/vis_type_timeseries/public/application/components/aggs/histogram_support.test.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/histogram_support.test.js index 7af33ba11f247a..50d79c7fcb796c 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/aggs/histogram_support.test.js +++ b/src/plugins/vis_type_timeseries/public/application/components/aggs/histogram_support.test.js @@ -22,6 +22,15 @@ import { mountWithIntl } from 'test_utils/enzyme_helpers'; import { Agg } from './agg'; import { FieldSelect } from './field_select'; import { FIELDS, METRIC, SERIES, PANEL } from '../../../test_utils'; + +jest.mock('../query_bar_wrapper', () => ({ + QueryBarWrapper: jest.fn(() => null), +})); + +jest.mock('../lib/get_default_query_language', () => ({ + getDefaultQueryLanguage: jest.fn(() => 'lucene'), +})); + const runTest = (aggType, name, test, additionalProps = {}) => { describe(aggType, () => { const metric = { From cfa58f2f39e6e95d353ab2840f0f070fc84e1053 Mon Sep 17 00:00:00 2001 From: Diana Derevyankina Date: Mon, 17 Aug 2020 15:35:08 +0300 Subject: [PATCH 04/10] Refactor some code in filter_ratio, filter_ratios, filter_ratios.test --- .../application/components/aggs/filter_ratio.js | 4 ++-- .../request_processors/series/filter_ratios.js | 5 ++--- .../request_processors/series/filter_ratios.test.js | 12 +++--------- 3 files changed, 7 insertions(+), 14 deletions(-) diff --git a/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.js index bf27ec32f4082b..a9e71bfb540313 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.js +++ b/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.js @@ -103,7 +103,7 @@ export const FilterRatioAgg = (props) => { > handleQueryChange('numerator', query)} @@ -124,7 +124,7 @@ export const FilterRatioAgg = (props) => { > handleQueryChange('denominator', query)} diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/filter_ratios.js b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/filter_ratios.js index f68d8ea25ecaf9..6c1699912f76f6 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/filter_ratios.js +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/filter_ratios.js @@ -24,18 +24,17 @@ import { esQuery } from '../../../../../../data/server'; export function ratios(req, panel, series, esQueryConfig, indexPatternObject) { return (next) => (doc) => { - const filters = !panel.ignore_global_filter ? req.payload.filters : []; if (series.metrics.some(filter)) { series.metrics.filter(filter).forEach((metric) => { overwrite( doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}-numerator.filter`, - esQuery.buildEsQuery(indexPatternObject, metric.numerator, filters, esQueryConfig) + esQuery.buildEsQuery(indexPatternObject, metric.numerator, [], esQueryConfig) ); overwrite( doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}-denominator.filter`, - esQuery.buildEsQuery(indexPatternObject, metric.denominator, filters, esQueryConfig) + esQuery.buildEsQuery(indexPatternObject, metric.denominator, [], esQueryConfig) ); let numeratorPath = `${metric.id}-numerator>_count`; diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/filter_ratios.test.js b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/filter_ratios.test.js index dbc941c4eb29a4..9155a5053fe124 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/filter_ratios.test.js +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/filter_ratios.test.js @@ -39,7 +39,7 @@ describe('ratios(req, panel, series, esQueryConfig, indexPatternObject)', () => id: 'metric-1', type: 'filter_ratio', numerator: { query: 'errors', language: 'lucene' }, - denominator: { query: '*', language: 'lucene' }, + denominator: { query: '', language: 'lucene' }, metric_agg: 'avg', field: 'cpu', }, @@ -99,10 +99,7 @@ describe('ratios(req, panel, series, esQueryConfig, indexPatternObject)', () => bool: { must: [ { - query_string: { - query: '*', - analyze_wildcard: true, - }, + match_all: {}, }, ], filter: [], @@ -170,10 +167,7 @@ describe('ratios(req, panel, series, esQueryConfig, indexPatternObject)', () => bool: { must: [ { - query_string: { - analyze_wildcard: true, - query: '*', - }, + match_all: {}, }, ], filter: [], From 47151361f93741423821af0ab8d3f52e65c3019d Mon Sep 17 00:00:00 2001 From: Diana Derevyankina Date: Mon, 17 Aug 2020 16:49:21 +0300 Subject: [PATCH 05/10] Edit query value in filter_ratio and filter_ratios.test --- .../application/components/aggs/filter_ratio.js | 4 ++-- .../request_processors/series/filter_ratios.test.js | 12 +++++++++--- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.js index a9e71bfb540313..0f86b112764724 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.js +++ b/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.js @@ -104,7 +104,7 @@ export const FilterRatioAgg = (props) => { handleQueryChange('numerator', query)} indexPatterns={[indexPattern]} @@ -125,7 +125,7 @@ export const FilterRatioAgg = (props) => { handleQueryChange('denominator', query)} indexPatterns={[indexPattern]} diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/filter_ratios.test.js b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/filter_ratios.test.js index 9155a5053fe124..d0216ebab7771c 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/filter_ratios.test.js +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/filter_ratios.test.js @@ -39,7 +39,7 @@ describe('ratios(req, panel, series, esQueryConfig, indexPatternObject)', () => id: 'metric-1', type: 'filter_ratio', numerator: { query: 'errors', language: 'lucene' }, - denominator: { query: '', language: 'lucene' }, + denominator: { query: 'warnings', language: 'lucene' }, metric_agg: 'avg', field: 'cpu', }, @@ -99,7 +99,10 @@ describe('ratios(req, panel, series, esQueryConfig, indexPatternObject)', () => bool: { must: [ { - match_all: {}, + query_string: { + query: 'warnings', + analyze_wildcard: true, + }, }, ], filter: [], @@ -167,7 +170,10 @@ describe('ratios(req, panel, series, esQueryConfig, indexPatternObject)', () => bool: { must: [ { - match_all: {}, + query_string: { + query: 'warnings', + analyze_wildcard: true, + }, }, ], filter: [], From e1024e72f76b8af666d18c0c5f909158ece849ea Mon Sep 17 00:00:00 2001 From: Diana Derevyankina Date: Thu, 20 Aug 2020 17:45:46 +0300 Subject: [PATCH 06/10] Refacor some code in filter_ratio.js and visualization_migrations.ts --- .../application/components/aggs/filter_ratio.js | 12 +++--------- .../server/saved_objects/visualization_migrations.ts | 4 ++-- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.js index 0f86b112764724..ba1b8c0126f61f 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.js +++ b/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.js @@ -51,7 +51,7 @@ export const FilterRatioAgg = (props) => { const handleChange = createChangeHandler(props.onChange, props.model); const handleSelectChange = createSelectHandler(handleChange); - const handleQueryChange = (name, value) => handleChange?.({ [name]: value }); + const handleQueryChange = (name, value) => handleChange({ [name]: value }); const indexPattern = (series.override_index_pattern && series.series_index_pattern) || panel.index_pattern; @@ -102,10 +102,7 @@ export const FilterRatioAgg = (props) => { } > handleQueryChange('numerator', query)} indexPatterns={[indexPattern]} /> @@ -123,10 +120,7 @@ export const FilterRatioAgg = (props) => { } > handleQueryChange('denominator', query)} indexPatterns={[indexPattern]} /> diff --git a/src/plugins/visualizations/server/saved_objects/visualization_migrations.ts b/src/plugins/visualizations/server/saved_objects/visualization_migrations.ts index f108a524bb0336..64491d02aa0a3b 100644 --- a/src/plugins/visualizations/server/saved_objects/visualization_migrations.ts +++ b/src/plugins/visualizations/server/saved_objects/visualization_migrations.ts @@ -116,10 +116,10 @@ const migrateFilterRatioQuery: SavedObjectMigrationFn = (doc) => { series.forEach((part) => { (part.metrics || []).forEach((metric: any) => { if (metric.type === 'filter_ratio') { - if (metric.numerator && typeof metric.numerator === 'string') { + if (typeof metric.numerator === 'string') { metric.numerator = { query: metric.numerator, language: 'lucene' }; } - if (metric.denominator && typeof metric.denominator === 'string') { + if (typeof metric.denominator === 'string') { metric.denominator = { query: metric.denominator, language: 'lucene' }; } } From 60081d898eead071c3ec9db0610ea35647757cee Mon Sep 17 00:00:00 2001 From: Diana Derevyankina Date: Fri, 21 Aug 2020 15:00:44 +0300 Subject: [PATCH 07/10] Remove duplications in vis_schema and refactor filter_ratio --- .../vis_type_timeseries/common/vis_schema.ts | 21 +++---------------- .../components/aggs/filter_ratio.js | 11 +++++++--- 2 files changed, 11 insertions(+), 21 deletions(-) diff --git a/src/plugins/vis_type_timeseries/common/vis_schema.ts b/src/plugins/vis_type_timeseries/common/vis_schema.ts index 14abd4c884cc41..d3d863df8617f9 100644 --- a/src/plugins/vis_type_timeseries/common/vis_schema.ts +++ b/src/plugins/vis_type_timeseries/common/vis_schema.ts @@ -80,18 +80,8 @@ export const metricsItems = schema.object({ field: stringOptionalNullable, id: stringRequired, metric_agg: stringOptionalNullable, - numerator: schema.maybe( - schema.object({ - language: schema.string(), - query: schema.string(), - }) - ), - denominator: schema.maybe( - schema.object({ - language: schema.string(), - query: schema.string(), - }) - ), + numerator: schema.maybe(queryObject), + denominator: schema.maybe(queryObject), sigma: stringOptionalNullable, unit: stringOptionalNullable, model_type: stringOptionalNullable, @@ -138,12 +128,7 @@ export const metricsItems = schema.object({ const splitFiltersItems = schema.object({ id: stringOptionalNullable, color: stringOptionalNullable, - filter: schema.maybe( - schema.object({ - language: schema.string(), - query: schema.string(), - }) - ), + filter: schema.maybe(queryObject), label: stringOptionalNullable, }); diff --git a/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.js index ba1b8c0126f61f..14851d1c964fd3 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.js +++ b/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.js @@ -18,7 +18,7 @@ */ import PropTypes from 'prop-types'; -import React from 'react'; +import React, { useCallback, useMemo } from 'react'; import { AggSelect } from './agg_select'; import { FieldSelect } from './field_select'; import { AggRow } from './agg_row'; @@ -49,9 +49,14 @@ const isFieldHistogram = (fields, indexPattern, field) => { export const FilterRatioAgg = (props) => { const { series, fields, panel } = props; - const handleChange = createChangeHandler(props.onChange, props.model); + const handleChange = useMemo(() => createChangeHandler(props.onChange, props.model), [ + props.model, + props.onChange, + ]); const handleSelectChange = createSelectHandler(handleChange); - const handleQueryChange = (name, value) => handleChange({ [name]: value }); + const handleQueryChange = useCallback((name, value) => handleChange({ [name]: value }), [ + handleChange, + ]); const indexPattern = (series.override_index_pattern && series.series_index_pattern) || panel.index_pattern; From b6823414caabb088e6b9fc224b51c71dca0bb62b Mon Sep 17 00:00:00 2001 From: Diana Derevyankina Date: Fri, 21 Aug 2020 17:17:08 +0300 Subject: [PATCH 08/10] Refactor filter_ratio.js --- .../public/application/components/aggs/filter_ratio.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.js index 14851d1c964fd3..4286af7fd6402d 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.js +++ b/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.js @@ -54,9 +54,13 @@ export const FilterRatioAgg = (props) => { props.onChange, ]); const handleSelectChange = createSelectHandler(handleChange); - const handleQueryChange = useCallback((name, value) => handleChange({ [name]: value }), [ + const handleNumeratorQueryChange = useCallback((query) => handleChange({ numerator: query }), [ handleChange, ]); + const handleDenominatorQueryChange = useCallback( + (query) => handleChange({ denominator: query }), + [handleChange] + ); const indexPattern = (series.override_index_pattern && series.series_index_pattern) || panel.index_pattern; @@ -108,7 +112,7 @@ export const FilterRatioAgg = (props) => { > handleQueryChange('numerator', query)} + onChange={handleNumeratorQueryChange} indexPatterns={[indexPattern]} /> @@ -126,7 +130,7 @@ export const FilterRatioAgg = (props) => { > handleQueryChange('denominator', query)} + onChange={handleDenominatorQueryChange} indexPatterns={[indexPattern]} /> From 93a533ea8f13309a680856756fee1303626f21c2 Mon Sep 17 00:00:00 2001 From: Diana Derevyankina Date: Wed, 26 Aug 2020 17:16:33 +0300 Subject: [PATCH 09/10] Update default query with getDefaultQuery() --- .../public/application/components/aggs/filter_ratio.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.js index 4286af7fd6402d..1c7ab65ecd2989 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.js +++ b/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.js @@ -35,7 +35,7 @@ import { import { FormattedMessage } from '@kbn/i18n/react'; import { KBN_FIELD_TYPES } from '../../../../../../plugins/data/public'; import { getSupportedFieldsByMetricType } from '../lib/get_supported_fields_by_metric_type'; -import { getDefaultQueryLanguage } from '../lib/get_default_query_language'; +import { getDataStart } from '../../../services'; import { QueryBarWrapper } from '../query_bar_wrapper'; const isFieldHistogram = (fields, indexPattern, field) => { @@ -65,8 +65,8 @@ export const FilterRatioAgg = (props) => { (series.override_index_pattern && series.series_index_pattern) || panel.index_pattern; const defaults = { - numerator: { query: '', language: getDefaultQueryLanguage() }, - denominator: { query: '', language: getDefaultQueryLanguage() }, + numerator: getDataStart().query.queryString.getDefaultQuery(), + denominator: getDataStart().query.queryString.getDefaultQuery(), metric_agg: 'count', }; From 84fe1148e38aa92bbcaac516e96b860fe70fb240 Mon Sep 17 00:00:00 2001 From: Diana Derevyankina Date: Thu, 27 Aug 2020 10:57:21 +0300 Subject: [PATCH 10/10] Fix filter_ratio and histogram_support tests --- .../application/components/aggs/filter_ratio.test.js | 8 ++++---- .../application/components/aggs/histogram_support.test.js | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.test.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.test.js index 43b248f9fce99d..f25cd310f63531 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.test.js +++ b/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.test.js @@ -22,16 +22,16 @@ import { mountWithIntl } from 'test_utils/enzyme_helpers'; import { FilterRatioAgg } from './filter_ratio'; import { FIELDS, METRIC, SERIES, PANEL } from '../../../test_utils'; import { EuiComboBox } from '@elastic/eui'; +import { dataPluginMock } from '../../../../../data/public/mocks'; +import { setDataStart } from '../../../services'; jest.mock('../query_bar_wrapper', () => ({ QueryBarWrapper: jest.fn(() => null), })); -jest.mock('../lib/get_default_query_language', () => ({ - getDefaultQueryLanguage: jest.fn(() => 'lucene'), -})); - describe('TSVB Filter Ratio', () => { + beforeAll(() => setDataStart(dataPluginMock.createStartContract())); + const setup = (metric) => { const series = { ...SERIES, metrics: [metric] }; const panel = { ...PANEL, series }; diff --git a/src/plugins/vis_type_timeseries/public/application/components/aggs/histogram_support.test.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/histogram_support.test.js index 50d79c7fcb796c..aa4afda028a291 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/aggs/histogram_support.test.js +++ b/src/plugins/vis_type_timeseries/public/application/components/aggs/histogram_support.test.js @@ -22,15 +22,13 @@ import { mountWithIntl } from 'test_utils/enzyme_helpers'; import { Agg } from './agg'; import { FieldSelect } from './field_select'; import { FIELDS, METRIC, SERIES, PANEL } from '../../../test_utils'; +import { setDataStart } from '../../../services'; +import { dataPluginMock } from '../../../../../data/public/mocks'; jest.mock('../query_bar_wrapper', () => ({ QueryBarWrapper: jest.fn(() => null), })); -jest.mock('../lib/get_default_query_language', () => ({ - getDefaultQueryLanguage: jest.fn(() => 'lucene'), -})); - const runTest = (aggType, name, test, additionalProps = {}) => { describe(aggType, () => { const metric = { @@ -64,6 +62,8 @@ const runTest = (aggType, name, test, additionalProps = {}) => { }; describe('Histogram Types', () => { + beforeAll(() => setDataStart(dataPluginMock.createStartContract())); + describe('supported', () => { const shouldHaveHistogramSupport = (aggType, additionalProps = {}) => { runTest(