From 2ce11799b0caa18f568de5caae85b3893b24ad2a Mon Sep 17 00:00:00 2001 From: Moritz Heckmann Date: Fri, 19 Jun 2026 09:55:41 +0200 Subject: [PATCH 1/4] Added index to getGroupingValue --- .../src/features/column-grouping/columnGroupingFeature.types.ts | 2 +- .../src/features/column-grouping/columnGroupingFeature.utils.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/table-core/src/features/column-grouping/columnGroupingFeature.types.ts b/packages/table-core/src/features/column-grouping/columnGroupingFeature.types.ts index c376f378fa..a39daad78f 100644 --- a/packages/table-core/src/features/column-grouping/columnGroupingFeature.types.ts +++ b/packages/table-core/src/features/column-grouping/columnGroupingFeature.types.ts @@ -89,7 +89,7 @@ export interface ColumnDef_ColumnGrouping< /** * Specify a value to be used for grouping rows on this column. If this option is not specified, the value derived from `accessorKey` / `accessorFn` will be used instead. */ - getGroupingValue?: (row: TData) => any + getGroupingValue?: (row: TData, index: number) => any } export interface Column_ColumnGrouping< diff --git a/packages/table-core/src/features/column-grouping/columnGroupingFeature.utils.ts b/packages/table-core/src/features/column-grouping/columnGroupingFeature.utils.ts index 7b96c2ceac..1ac6af6a26 100644 --- a/packages/table-core/src/features/column-grouping/columnGroupingFeature.utils.ts +++ b/packages/table-core/src/features/column-grouping/columnGroupingFeature.utils.ts @@ -284,6 +284,7 @@ export function row_getGroupingValue< if (row._groupingValuesCache) { row._groupingValuesCache[columnId] = column.columnDef.getGroupingValue( row.original, + row.index, ) } From 481522766ba62a7b41881fb3b1ddc28519507b09 Mon Sep 17 00:00:00 2001 From: Moritz Heckmann Date: Thu, 25 Jun 2026 13:39:40 +0200 Subject: [PATCH 2/4] Changed package json --- packages/react-table/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/react-table/package.json b/packages/react-table/package.json index c136b5a266..3439f6fd41 100644 --- a/packages/react-table/package.json +++ b/packages/react-table/package.json @@ -63,8 +63,7 @@ "build": "tsdown" }, "dependencies": { - "@tanstack/react-store": "^0.11.0", - "@tanstack/table-core": "workspace:*" + "@tanstack/react-store": "^0.11.0" }, "devDependencies": { "@eslint-react/eslint-plugin": "^5.8.16", @@ -75,6 +74,7 @@ "react": "^19.2.7" }, "peerDependencies": { + "@tanstack/table-core": "workspace:*", "react": ">=18" } } From c060daf529dc25945e24c22f4b6ea8c4d4746813 Mon Sep 17 00:00:00 2001 From: Moritz Heckmann Date: Thu, 25 Jun 2026 19:49:03 +0200 Subject: [PATCH 3/4] Added column instance method --- packages/table-core/src/core/columns/constructColumn.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/table-core/src/core/columns/constructColumn.ts b/packages/table-core/src/core/columns/constructColumn.ts index b6ca11debf..82baee88cf 100644 --- a/packages/table-core/src/core/columns/constructColumn.ts +++ b/packages/table-core/src/core/columns/constructColumn.ts @@ -115,5 +115,11 @@ export function constructColumn< column.id = `${String(id)}` column.parent = parent + // Initialize instance-specific data (e.g., caches) for features that need it + const features = Object.values(table._features) + for (let i = 0; i < features.length; i++) { + features[i]!.initColumnInstanceData?.(column) + } + return column as Column } From 15007b0622245c430002c9c88acb01a0a2242ceb Mon Sep 17 00:00:00 2001 From: Moritz Heckmann Date: Thu, 2 Jul 2026 21:31:22 +0200 Subject: [PATCH 4/4] Added column cache and fast path to get value --- .../src/core/columns/coreColumnsFeature.ts | 4 ++++ .../core/columns/coreColumnsFeature.types.ts | 4 ++++ .../core/columns/coreColumnsFeature.utils.ts | 20 +++++++++++++++++++ .../src/core/table/constructTable.ts | 2 ++ packages/table-core/src/types/Table.ts | 1 + 5 files changed, 31 insertions(+) diff --git a/packages/table-core/src/core/columns/coreColumnsFeature.ts b/packages/table-core/src/core/columns/coreColumnsFeature.ts index f21a2b3bfc..7bfaf9af44 100644 --- a/packages/table-core/src/core/columns/coreColumnsFeature.ts +++ b/packages/table-core/src/core/columns/coreColumnsFeature.ts @@ -7,6 +7,7 @@ import { table_getAllFlatColumnsById, table_getAllLeafColumns, table_getAllLeafColumnsById, + table_getCachedColumn, table_getColumn, table_getDefaultColumnDef, } from './coreColumnsFeature.utils' @@ -68,6 +69,9 @@ export const coreColumnsFeature: TableFeature = { table_getColumn: { fn: (columnId) => table_getColumn(table, columnId), }, + table_getCachedColumn: { + fn: (columnId) => table_getCachedColumn(table, columnId), + }, }) }, } diff --git a/packages/table-core/src/core/columns/coreColumnsFeature.types.ts b/packages/table-core/src/core/columns/coreColumnsFeature.types.ts index 2cd8780410..db5931629d 100644 --- a/packages/table-core/src/core/columns/coreColumnsFeature.types.ts +++ b/packages/table-core/src/core/columns/coreColumnsFeature.types.ts @@ -105,4 +105,8 @@ export interface Table_Columns< * Returns a single column by its ID. */ getColumn: (columnId: string) => Column | undefined + /** + * Returns a single column by its ID, but cached via WeakMap. + */ + getCachedColumn: (columnId: string) => Column | undefined } diff --git a/packages/table-core/src/core/columns/coreColumnsFeature.utils.ts b/packages/table-core/src/core/columns/coreColumnsFeature.utils.ts index 2fae8a1fd7..20e2b2e755 100644 --- a/packages/table-core/src/core/columns/coreColumnsFeature.utils.ts +++ b/packages/table-core/src/core/columns/coreColumnsFeature.utils.ts @@ -273,3 +273,23 @@ export function table_getColumn< return column } + +export function table_getCachedColumn< + TFeatures extends TableFeatures, + TData extends RowData, +>( + table: Table_Internal, + columnId: string, +): Column | undefined { + const columnDefs = table.options.columns + const cache = table._columnCache; + + let columnsById = cache.get(columnDefs) + + if (!columnsById) { + columnsById = table.getAllFlatColumnsById() + cache.set(columnDefs, columnsById) + } + + return columnsById[columnId] +} \ No newline at end of file diff --git a/packages/table-core/src/core/table/constructTable.ts b/packages/table-core/src/core/table/constructTable.ts index c4f10f0ed5..0c1047c344 100644 --- a/packages/table-core/src/core/table/constructTable.ts +++ b/packages/table-core/src/core/table/constructTable.ts @@ -63,6 +63,8 @@ export function constructTable< _rowModels: {}, _rowModelFns: { aggregationFns, filterFns, sortFns }, baseAtoms: {}, + // Import diffs will make updating this hell -> any + _columnCache: new WeakMap(), atoms: {}, } as unknown as Table_Internal diff --git a/packages/table-core/src/types/Table.ts b/packages/table-core/src/types/Table.ts index 829b657344..b8e9eaab84 100644 --- a/packages/table-core/src/types/Table.ts +++ b/packages/table-core/src/types/Table.ts @@ -113,4 +113,5 @@ export interface Table_Internal< baseAtoms: BaseAtoms & BaseAtoms_All atoms: Atoms & Atoms_All store: ReadonlyStore> & ReadonlyStore + _columnCache: WeakMap }