From 971ce2489897079744e96c21fb34d238e3c583b3 Mon Sep 17 00:00:00 2001 From: Nick Partridge Date: Wed, 15 Oct 2025 15:57:22 -0500 Subject: [PATCH] [Lens][Table] Fix filtering on tables with formula columns (#239222) ## Summary Fixes a bug in the Lens Table that broke **click to filter** on table rows when any column is used as a formula. ## Release Notes Fixes a bug in the Lens Table that broke **click to filter** on table rows when any column is used as a formula. (cherry picked from commit b0bac3df208a70bda7509fb96709d24d78dd2aba) --- .../datatable/datatable_fn.test.ts | 27 +++++++++++++++++++ .../expressions/datatable/datatable_fn.ts | 2 +- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/x-pack/platform/plugins/shared/lens/common/expressions/datatable/datatable_fn.test.ts b/x-pack/platform/plugins/shared/lens/common/expressions/datatable/datatable_fn.test.ts index 9b198390f0169..394778aba5748 100644 --- a/x-pack/platform/plugins/shared/lens/common/expressions/datatable/datatable_fn.test.ts +++ b/x-pack/platform/plugins/shared/lens/common/expressions/datatable/datatable_fn.test.ts @@ -121,4 +121,31 @@ describe('datatableFn', () => { expect(resultColumnIds).toEqual(expectedColumnIds); expect(resultColumnIds).toEqual(['bucket1', 'bucket2', 'bucket3', 'metric1', 'metric2']); }); + + // This is needed for ghost formula columns, see https://github.com/elastic/kibana/issues/239170 + it('should sort unknown columns in table by order of args.columns', async () => { + const table = buildTable(); + const shuffledTable: Datatable = { + ...table, + columns: shuffle([ + ...table.columns, + { id: 'unknown', name: 'unknown', meta: { type: 'number' } }, + ]), + }; + const args = buildArgs(); + const result = await datatableFn(() => mockFormatFactory)(shuffledTable, args, context); + + const resultColumnIds = result.value.data.columns.map((c) => c.id); + const expectedColumnIds = args.columns.map((c) => c.columnId).concat('unknown'); + + expect(resultColumnIds).toEqual(expectedColumnIds); + expect(resultColumnIds).toEqual([ + 'bucket1', + 'bucket2', + 'bucket3', + 'metric1', + 'metric2', + 'unknown', + ]); + }); }); diff --git a/x-pack/platform/plugins/shared/lens/common/expressions/datatable/datatable_fn.ts b/x-pack/platform/plugins/shared/lens/common/expressions/datatable/datatable_fn.ts index 23c37dbdb1016..f35ca326b7d3c 100644 --- a/x-pack/platform/plugins/shared/lens/common/expressions/datatable/datatable_fn.ts +++ b/x-pack/platform/plugins/shared/lens/common/expressions/datatable/datatable_fn.ts @@ -28,7 +28,7 @@ export const datatableFn = ): DatatableExpressionFunction['fn'] => async (table, args, context) => { const columnSortMap = args.columns.reduce((acc, c, i) => acc.set(c.columnId, i), new Map()); - const getColumnSort = (id: string) => columnSortMap.get(id) ?? -1; + const getColumnSort = (id: string) => columnSortMap.get(id) ?? Infinity; const sortedTable: Datatable = { ...table, columns: table.columns.slice().sort((a, b) => getColumnSort(a.id) - getColumnSort(b.id)),