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)),