diff --git a/packages/react-table/__tests__/makeTestData.ts b/packages/react-table/__tests__/makeTestData.ts index c5c0d29bf5..164ca6e5cd 100644 --- a/packages/react-table/__tests__/makeTestData.ts +++ b/packages/react-table/__tests__/makeTestData.ts @@ -1,4 +1,4 @@ -import faker from 'faker' +import faker from '@faker-js/faker' export type Person = { firstName: string diff --git a/packages/table-core/__tests__/getGroupedRowModel.test.ts b/packages/table-core/__tests__/getGroupedRowModel.test.ts new file mode 100644 index 0000000000..4de3ecad35 --- /dev/null +++ b/packages/table-core/__tests__/getGroupedRowModel.test.ts @@ -0,0 +1,47 @@ +import { ColumnDef, getCoreRowModel } from '../src'; +import { createColumnHelper } from '../src/columnHelper'; +import { createTable } from '../src/core/table'; +import { getGroupedRowModel } from '../src/utils/getGroupedRowModel'; +import { makeData, Person } from './makeTestData'; + +type personKeys = keyof Person; +type PersonColumn = ColumnDef; + +function generateColumns(people: Person[]): PersonColumn[] { + const columnHelper = createColumnHelper(); + const person = people[0]; + return Object.keys(person).map((key) => { + const typedKey = key as personKeys; + return columnHelper.accessor(typedKey, { id: typedKey }); + }); +} + +describe('#getGroupedRowModel', () => { + it('groups 50k rows and 3 grouped columns with clustered data in less than 2 seconds', () => { + const data = makeData(50000); + const columns = generateColumns(data); + const grouping = ['firstName', 'lastName', 'age']; + const start = new Date(); + + data.forEach((p) => p.firstName = 'Fixed') + data.forEach((p) => p.lastName = 'Name') + data.forEach((p) => p.age = 123) + + const table = createTable({ + onStateChange() {}, + renderFallbackValue: '', + data, + state: { grouping }, + columns, + getCoreRowModel: getCoreRowModel(), + getGroupedRowModel: getGroupedRowModel() + }) + const groupedById = table.getGroupedRowModel().rowsById; + const end = new Date(); + + expect(groupedById['firstName:Fixed'].leafRows.length).toEqual(50000) + expect(groupedById['firstName:Fixed>lastName:Name'].leafRows.length).toEqual(50000) + expect(groupedById['firstName:Fixed>lastName:Name>age:123'].leafRows.length).toEqual(50000) + expect(end.valueOf() - start.valueOf()).toBeLessThan(2000); + }); +}) \ No newline at end of file diff --git a/packages/table-core/__tests__/makeTestData.ts b/packages/table-core/__tests__/makeTestData.ts index c5c0d29bf5..7b573a3ae4 100644 --- a/packages/table-core/__tests__/makeTestData.ts +++ b/packages/table-core/__tests__/makeTestData.ts @@ -1,4 +1,4 @@ -import faker from 'faker' +import faker from '@faker-js/faker' export type Person = { firstName: string @@ -11,7 +11,7 @@ export type Person = { } const range = (len: number) => { - const arr = [] + const arr: number[] = []; for (let i = 0; i < len; i++) { arr.push(i) } diff --git a/packages/table-core/src/utils/getGroupedRowModel.ts b/packages/table-core/src/utils/getGroupedRowModel.ts index 90e304bbfc..7d998bcdf7 100644 --- a/packages/table-core/src/utils/getGroupedRowModel.ts +++ b/packages/table-core/src/utils/getGroupedRowModel.ts @@ -176,7 +176,7 @@ function groupBy(rows: Row[], columnId: string) { if (!previous) { map.set(resKey, [row]) } else { - map.set(resKey, [...previous, row]) + previous.push(row) } return map }, groupMap)