From 1d90c3af87df921199c3aa6b5dc6798b7bf082a6 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Thu, 22 May 2025 22:30:04 +0200 Subject: [PATCH 1/5] use correct timeFieldName --- .../expression_xy/public/components/xy_chart.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/platform/plugins/shared/chart_expressions/expression_xy/public/components/xy_chart.tsx b/src/platform/plugins/shared/chart_expressions/expression_xy/public/components/xy_chart.tsx index 5234f9ef8e88c..887e11aea2ed0 100644 --- a/src/platform/plugins/shared/chart_expressions/expression_xy/public/components/xy_chart.tsx +++ b/src/platform/plugins/shared/chart_expressions/expression_xy/public/components/xy_chart.tsx @@ -660,12 +660,16 @@ export function XYChart({ ? getAccessorByDimension(dataLayers[0].xAccessor, table.columns) : undefined; const xAxisColumnIndex = table.columns.findIndex((el) => el.id === xAccessor); - const context: BrushEvent['data'] = { range: [min, max], table, column: xAxisColumnIndex, - ...(isEsqlMode ? { timeFieldName: table.columns[xAxisColumnIndex].name } : {}), + ...(isEsqlMode + ? { + timeFieldName: + table.columns[xAxisColumnIndex].meta.sourceParams?.sourceField?.toString(), + } + : {}), }; onSelectRange(context); }; From a4908eb903c4506ef9f90b488f359eae4e964226 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Thu, 22 May 2025 22:30:22 +0200 Subject: [PATCH 2/5] small refactor to cleanup code --- .../filters/helpers/extract_time_filter.ts | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/src/platform/packages/shared/kbn-es-query/src/filters/helpers/extract_time_filter.ts b/src/platform/packages/shared/kbn-es-query/src/filters/helpers/extract_time_filter.ts index 3f0254fc40f37..0c71a8d3dc4cd 100644 --- a/src/platform/packages/shared/kbn-es-query/src/filters/helpers/extract_time_filter.ts +++ b/src/platform/packages/shared/kbn-es-query/src/filters/helpers/extract_time_filter.ts @@ -7,25 +7,22 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { keys, partition } from 'lodash'; -import { Filter, isRangeFilter, RangeFilter } from '../build_filters'; -import { TimeRange } from './types'; +import { isRangeFilter, type Filter, type RangeFilter } from '../build_filters'; +import type { TimeRange } from './types'; import { convertRangeFilterToTimeRangeString } from './convert_range_filter'; -export function extractTimeFilter(timeFieldName: string, filters: Filter[]) { - const [timeRangeFilter, restOfFilters] = partition(filters, (obj: Filter) => { - let key; - - if (isRangeFilter(obj)) { - key = keys(obj.query.range)[0]; - } - - return Boolean(key && key === timeFieldName); - }); +export function extractTimeFilter( + timeFieldName: string, + filters: Filter[] +): { restOfFilters: Filter[]; timeRangeFilter?: RangeFilter } { + const restOfFilters = filters.filter((f) => !isRangeFilter(f)); + const timeRangeFilter = filters.find( + (f): f is RangeFilter => isRangeFilter(f) && timeFieldName === Object.keys(f.query.range)[0] + ); return { restOfFilters, - timeRangeFilter: timeRangeFilter[0] as RangeFilter | undefined, + timeRangeFilter, }; } @@ -33,7 +30,9 @@ export function extractTimeRange( filters: Filter[], timeFieldName?: string ): { restOfFilters: Filter[]; timeRange?: TimeRange } { - if (!timeFieldName) return { restOfFilters: filters, timeRange: undefined }; + if (!timeFieldName) { + return { restOfFilters: filters }; + } const { timeRangeFilter, restOfFilters } = extractTimeFilter(timeFieldName, filters); return { restOfFilters, From e877bafa3e4725d3e7cfd3b2ca0be4bc6d88a0b9 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Thu, 22 May 2025 23:29:45 +0200 Subject: [PATCH 3/5] add functional test --- .../apps/discover/esql/_esql_view.ts | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/platform/test/functional/apps/discover/esql/_esql_view.ts b/src/platform/test/functional/apps/discover/esql/_esql_view.ts index a15d541fdd3b5..853a45a0a0664 100644 --- a/src/platform/test/functional/apps/discover/esql/_esql_view.ts +++ b/src/platform/test/functional/apps/discover/esql/_esql_view.ts @@ -26,6 +26,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const esql = getService('esql'); const dashboardAddPanel = getService('dashboardAddPanel'); const dataViews = getService('dataViews'); + const elasticChart = getService('elasticChart'); + const filterBar = getService('filterBar'); + const { common, discover, dashboard, header, timePicker, unifiedFieldList, unifiedSearch } = getPageObjects([ 'common', @@ -236,6 +239,28 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const cell = await dataGrid.getCellElementExcludingControlColumns(0, 0); expect(await cell.getVisibleText()).to.be('1'); }); + + it('should allow brushing time series', async () => { + await timePicker.setDefaultAbsoluteRange(); + await discover.selectTextBaseLang(); + await header.waitUntilLoadingHasFinished(); + await discover.waitUntilSearchingHasFinished(); + + const initialTimeConfig = await timePicker.getTimeConfigAsAbsoluteTimes(); + expect(initialTimeConfig.start).to.equal(timePicker.defaultStartTime); + expect(initialTimeConfig.end).to.equal(timePicker.defaultEndTime); + + const renderingCount = await elasticChart.getVisualizationRenderingCount(); + await discover.brushHistogram(); + await discover.waitUntilSearchingHasFinished(); + // no filter pill created for time brush + expect(await filterBar.getFilterCount()).to.be(0); + // chart and time picker updated + await elasticChart.waitForRenderingCount(renderingCount + 1); + const updatedTimeConfig = await timePicker.getTimeConfigAsAbsoluteTimes(); + expect(updatedTimeConfig.start).to.be('Sep 20, 2015 @ 08:41:22.854'); + expect(updatedTimeConfig.end).to.be('Sep 21, 2015 @ 04:14:56.951'); + }); }); describe('errors', () => { From 19d57c1b45220056f25b29319b3b26570bd26599 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Fri, 23 May 2025 09:58:28 +0200 Subject: [PATCH 4/5] refactored extractTimeFilter --- .../src/filters/helpers/extract_time_filter.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/platform/packages/shared/kbn-es-query/src/filters/helpers/extract_time_filter.ts b/src/platform/packages/shared/kbn-es-query/src/filters/helpers/extract_time_filter.ts index 0c71a8d3dc4cd..884cb0ac0901f 100644 --- a/src/platform/packages/shared/kbn-es-query/src/filters/helpers/extract_time_filter.ts +++ b/src/platform/packages/shared/kbn-es-query/src/filters/helpers/extract_time_filter.ts @@ -7,22 +7,23 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { isRangeFilter, type Filter, type RangeFilter } from '../build_filters'; -import type { TimeRange } from './types'; +import { keys, partition } from 'lodash'; +import { Filter, isRangeFilter, RangeFilter } from '../build_filters'; +import { TimeRange } from './types'; import { convertRangeFilterToTimeRangeString } from './convert_range_filter'; export function extractTimeFilter( timeFieldName: string, filters: Filter[] ): { restOfFilters: Filter[]; timeRangeFilter?: RangeFilter } { - const restOfFilters = filters.filter((f) => !isRangeFilter(f)); - const timeRangeFilter = filters.find( - (f): f is RangeFilter => isRangeFilter(f) && timeFieldName === Object.keys(f.query.range)[0] + const [timeRangeFilter, restOfFilters] = partition( + filters, + (f: Filter): f is RangeFilter => isRangeFilter(f) && timeFieldName === keys(f.query.range)[0] ); return { restOfFilters, - timeRangeFilter, + timeRangeFilter: timeRangeFilter[0], }; } From a4e8f2d1f50d095bd294aa84cc2fc1379ed9b367 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Fri, 23 May 2025 19:13:49 +0200 Subject: [PATCH 5/5] update test --- .../test/functional/apps/discover/esql/_esql_view.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/platform/test/functional/apps/discover/esql/_esql_view.ts b/src/platform/test/functional/apps/discover/esql/_esql_view.ts index 853a45a0a0664..9c701dba419fa 100644 --- a/src/platform/test/functional/apps/discover/esql/_esql_view.ts +++ b/src/platform/test/functional/apps/discover/esql/_esql_view.ts @@ -245,6 +245,14 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await discover.selectTextBaseLang(); await header.waitUntilLoadingHasFinished(); await discover.waitUntilSearchingHasFinished(); + await unifiedFieldList.waitUntilSidebarHasLoaded(); + + const testQuery = `from logstash-* | limit 100`; + + await monacoEditor.setCodeEditorValue(testQuery); + await testSubjects.click('querySubmitButton'); + await header.waitUntilLoadingHasFinished(); + await discover.waitUntilSearchingHasFinished(); const initialTimeConfig = await timePicker.getTimeConfigAsAbsoluteTimes(); expect(initialTimeConfig.start).to.equal(timePicker.defaultStartTime);