@hrforte/react-pivottable 2.2.2 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/__tests__/TableRenderers-showNumericalOrder-test.js"],"names":["global","IS_REACT_ACT_ENVIRONMENT","records","name","gender","colour","trials","baseProps","data","rows","cols","aggregatorName","vals","rendererName","mount","node","document","createElement","body","appendChild","root","render","element","unmount","remove","numberTexts","selector","Array","from","querySelectorAll","map","cell","textContent","trim","numberHeaders","numberCells","describe","mounted","afterEach","it","React","PivotTable","expect","querySelector","toBeNull","not","toContain","Object","assign","showNumericalOrder","headers","toEqual","cells","headerCells","classList","contains","toBe","firstBodyRow","bodyCells","totalLabel","getAttribute","header","rowGroupConfig","label","match","wait","Promise","setTimeout","resolve","ms","actAsync","reject","callback","then","PivotTableUI"],"mappings":"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","file":"TableRenderers-showNumericalOrder-test.js","sourcesContent":["import React, {act} from 'react';\nimport {createRoot} from 'react-dom/client';\nimport PivotTable from '../PivotTable';\nimport PivotTableUI from '../PivotTableUI';\n\n/* eslint-disable no-magic-numbers */\n\n// React 19 needs to be told that this environment supports `act`.\nglobal.IS_REACT_ACT_ENVIRONMENT = true;\n\n// `showNumericalOrder` adds a \"No.\" column in front of the row attributes so\n// every data row is prefixed with its 1-based index.\nconst records = [\n {name: 'Nick', gender: 'male', colour: 'blue', trials: 103},\n {name: 'Jane', gender: 'female', colour: 'red', trials: 95},\n {name: 'John', gender: 'male', colour: 'blue', trials: 112},\n {name: 'Carol', gender: 'female', colour: 'yellow', trials: 102},\n];\n\nconst baseProps = {\n data: records,\n rows: ['name'],\n cols: [],\n aggregatorName: 'Count',\n vals: [],\n rendererName: 'Table',\n};\n\nconst mount = element => {\n const node = document.createElement('div');\n document.body.appendChild(node);\n const root = createRoot(node);\n act(() => {\n root.render(element);\n });\n return {node, root};\n};\n\nconst unmount = ({node, root}) => {\n act(() => {\n root.unmount();\n });\n node.remove();\n};\n\n// Both helpers are scoped to `.pvtTable`: PivotTableUI wraps the pivot table\n// in its own `.pvtUi` layout table, so an unscoped `tbody ...` selector would\n// also match header cells through that outer table.\nconst numberTexts = (node, selector) =>\n Array.from(node.querySelectorAll(`.pvtTable ${selector}`)).map(cell =>\n cell.textContent.trim()\n );\n\nconst numberHeaders = node => numberTexts(node, 'thead .pvtRowNumber');\nconst numberCells = node => numberTexts(node, 'tbody .pvtRowNumber');\n\ndescribe('Table renderer showNumericalOrder', function() {\n let mounted;\n\n afterEach(function() {\n if (mounted) {\n unmount(mounted);\n mounted = null;\n }\n });\n\n it('renders no \"No.\" column by default', function() {\n mounted = mount(React.createElement(PivotTable, baseProps));\n expect(mounted.node.querySelector('.pvtRowNumber')).toBeNull();\n expect(mounted.node.querySelector('.pvtTable').textContent).not.toContain(\n 'No.'\n );\n });\n\n it('renders no \"No.\" column when showNumericalOrder is false', function() {\n mounted = mount(\n React.createElement(\n PivotTable,\n Object.assign({}, baseProps, {showNumericalOrder: false})\n )\n );\n expect(mounted.node.querySelector('.pvtRowNumber')).toBeNull();\n });\n\n it('numbers every data row from 1 with a \"No.\" header', function() {\n mounted = mount(\n React.createElement(\n PivotTable,\n Object.assign({}, baseProps, {showNumericalOrder: true})\n )\n );\n\n const headers = numberHeaders(mounted.node);\n expect(headers).toEqual(['No.']);\n\n const cells = numberCells(mounted.node);\n expect(cells).toEqual(['1', '2', '3', '4']);\n });\n\n it('keeps the \"No.\" column in front of the row attribute column', function() {\n mounted = mount(\n React.createElement(\n PivotTable,\n Object.assign({}, baseProps, {showNumericalOrder: true})\n )\n );\n\n const headerCells = Array.from(\n mounted.node.querySelectorAll('.pvtTable thead tr:last-child th')\n );\n expect(headerCells[0].classList.contains('pvtRowNumber')).toBe(true);\n expect(headerCells[1].textContent).toContain('name');\n\n const firstBodyRow = mounted.node.querySelector('.pvtTable tbody tr');\n const bodyCells = Array.from(firstBodyRow.querySelectorAll('th,td'));\n expect(bodyCells[0].classList.contains('pvtRowNumber')).toBe(true);\n expect(bodyCells[1].classList.contains('pvtRowLabel')).toBe(true);\n });\n\n it('extends the totals label over the \"No.\" column', function() {\n mounted = mount(\n React.createElement(\n PivotTable,\n Object.assign({}, baseProps, {showNumericalOrder: true})\n )\n );\n\n const totalLabel = mounted.node.querySelector(\n '.pvtTable tbody .pvtTotalLabel'\n );\n expect(totalLabel.getAttribute('colspan')).toBe('2');\n });\n\n it('spans the \"No.\" header across the column-attribute header rows', function() {\n mounted = mount(\n React.createElement(\n PivotTable,\n Object.assign({}, baseProps, {\n cols: ['gender'],\n showNumericalOrder: true,\n })\n )\n );\n\n const header = mounted.node.querySelector('.pvtTable thead .pvtRowNumber');\n expect(header.textContent.trim()).toBe('No.');\n expect(header.getAttribute('rowspan')).toBe('2');\n\n expect(numberCells(mounted.node)).toEqual(['1', '2', '3', '4']);\n\n // Totals now covers \"No.\" + the row attribute + the column axis column.\n const totalLabel = mounted.node.querySelector(\n '.pvtTable tbody .pvtTotalLabel'\n );\n expect(totalLabel.getAttribute('colspan')).toBe('3');\n });\n\n it('spans the \"No.\" header across row group header rows', function() {\n mounted = mount(\n React.createElement(\n PivotTable,\n Object.assign({}, baseProps, {\n rows: ['name', 'gender'],\n rowGroupConfig: [{label: 'GRP', match: ['name']}],\n showNumericalOrder: true,\n })\n )\n );\n\n const header = mounted.node.querySelector('.pvtTable thead .pvtRowNumber');\n expect(header.getAttribute('rowspan')).toBe('2');\n expect(numberCells(mounted.node)).toEqual(['1', '2', '3', '4']);\n });\n\n it('passes showNumericalOrder through PivotTableUI', function() {\n // PivotTableUI computes asynchronously (worker / deferred main thread\n // computation, WORKER_DEBOUNCE_MS = 100ms), so the numbered rows only show\n // up after those timers ran.\n const wait = ms => new Promise(resolve => setTimeout(resolve, ms));\n const actAsync = callback =>\n new Promise((resolve, reject) => act(callback).then(resolve, reject));\n\n mounted = mount(\n React.createElement(\n PivotTableUI,\n Object.assign({}, baseProps, {showNumericalOrder: true})\n )\n );\n\n return actAsync(() => wait(300)).then(() => {\n expect(\n mounted.node.querySelector('.pvtTable thead .pvtRowNumber').textContent\n ).toBe('No.');\n expect(numberCells(mounted.node)).toEqual(['1', '2', '3', '4']);\n });\n });\n});\n"]}
1
+ {"version":3,"sources":["../../src/__tests__/TableRenderers-showNumericalOrder-test.js"],"names":["PivotDataWorker","global","IS_REACT_ACT_ENVIRONMENT","queueMicrotask","Promise","resolve","then","callback","require","renderToStaticMarkup","records","name","gender","colour","trials","baseProps","data","rows","cols","aggregatorName","vals","rendererName","mount","node","document","createElement","body","appendChild","root","render","element","unmount","remove","numberTexts","selector","Array","from","querySelectorAll","map","cell","textContent","trim","numberHeaders","numberCells","describe","mounted","afterEach","it","React","PivotTable","expect","querySelector","toBeNull","not","toContain","Object","assign","showNumericalOrder","headers","toEqual","cells","headerCells","classList","contains","toBe","firstBodyRow","bodyCells","totalLabel","getAttribute","header","rowGroupConfig","label","match","wait","setTimeout","ms","actAsync","reject","PivotTableUI","manyRecords","length","_","index","String","padStart","previousAnimationFrame","requestAnimationFrame","pendingFrame","jest","useFakeTimers","virtualizeRows","table","toBeLessThan","getBoundingClientRect","top","window","dispatchEvent","Event","runTimersToTime","useRealTimers","fullPrecomputedData","precomputedData","viewportKey","layoutReads","wideRecords","employee","initialLabels","left","scrolledLabels","some","rowLabel","aggregation","key","rowConfig","aggregations","columnConfig","materialized","rowPivot","columnPivot","rowSummary","columnSummary","workerSpy","spyOn","mockImplementation","start","end","columnMode","columnStart","columnEnd","values","toBeGreaterThan","mockRestore","catch","error","appRows","appConfig","fullPivot","tips","summary","toMatch","firstHeader","firstColumn","width","scrolledHeaders","pivotProps","html","exportedTable","DOMParser","parseFromString","toHaveLength","resolveWindows","push","toHaveBeenCalledTimes","mock","calls"],"mappings":"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","file":"TableRenderers-showNumericalOrder-test.js","sourcesContent":["import React, {act} from 'react';\nimport {createRoot} from 'react-dom/client';\nimport tips from '../../examples/tips';\nimport PivotTable from '../PivotTable';\nimport PivotTableUI from '../PivotTableUI';\nimport {getPivotTableProps} from '../TableRenderers';\nimport * as PivotDataWorker from '../PivotDataWorker';\nimport {\n alignSparseColumnsToRows,\n computePivotState,\n computePivotViewport,\n createVirtualPivotSummary,\n createWorkerConfig,\n materializeData,\n} from '../pivotCompute';\n\n/* eslint-disable no-magic-numbers */\n\n// React 19 needs to be told that this environment supports `act`.\nglobal.IS_REACT_ACT_ENVIRONMENT = true;\nglobal.queueMicrotask = callback => Promise.resolve().then(callback);\nconst {renderToStaticMarkup} = require('react-dom/server');\n\n// `showNumericalOrder` adds a \"No.\" column in front of the row attributes so\n// every data row is prefixed with its 1-based index.\nconst records = [\n {name: 'Nick', gender: 'male', colour: 'blue', trials: 103},\n {name: 'Jane', gender: 'female', colour: 'red', trials: 95},\n {name: 'John', gender: 'male', colour: 'blue', trials: 112},\n {name: 'Carol', gender: 'female', colour: 'yellow', trials: 102},\n];\n\nconst baseProps = {\n data: records,\n rows: ['name'],\n cols: [],\n aggregatorName: 'Count',\n vals: [],\n rendererName: 'Table',\n};\n\nconst mount = element => {\n const node = document.createElement('div');\n document.body.appendChild(node);\n const root = createRoot(node);\n act(() => {\n root.render(element);\n });\n return {node, root};\n};\n\nconst unmount = ({node, root}) => {\n act(() => {\n root.unmount();\n });\n node.remove();\n};\n\n// Both helpers are scoped to `.pvtTable`: PivotTableUI wraps the pivot table\n// in its own `.pvtUi` layout table, so an unscoped `tbody ...` selector would\n// also match header cells through that outer table.\nconst numberTexts = (node, selector) =>\n Array.from(node.querySelectorAll(`.pvtTable ${selector}`)).map(cell =>\n cell.textContent.trim()\n );\n\nconst numberHeaders = node => numberTexts(node, 'thead .pvtRowNumber');\nconst numberCells = node => numberTexts(node, 'tbody .pvtRowNumber');\n\ndescribe('Table renderer showNumericalOrder', function() {\n let mounted;\n\n afterEach(function() {\n if (mounted) {\n unmount(mounted);\n mounted = null;\n }\n });\n\n it('renders no \"No.\" column by default', function() {\n mounted = mount(React.createElement(PivotTable, baseProps));\n expect(mounted.node.querySelector('.pvtRowNumber')).toBeNull();\n expect(mounted.node.querySelector('.pvtTable').textContent).not.toContain(\n 'No.'\n );\n });\n\n it('renders no \"No.\" column when showNumericalOrder is false', function() {\n mounted = mount(\n React.createElement(\n PivotTable,\n Object.assign({}, baseProps, {showNumericalOrder: false})\n )\n );\n expect(mounted.node.querySelector('.pvtRowNumber')).toBeNull();\n });\n\n it('numbers every data row from 1 with a \"No.\" header', function() {\n mounted = mount(\n React.createElement(\n PivotTable,\n Object.assign({}, baseProps, {showNumericalOrder: true})\n )\n );\n\n const headers = numberHeaders(mounted.node);\n expect(headers).toEqual(['No.']);\n\n const cells = numberCells(mounted.node);\n expect(cells).toEqual(['1', '2', '3', '4']);\n });\n\n it('keeps the \"No.\" column in front of the row attribute column', function() {\n mounted = mount(\n React.createElement(\n PivotTable,\n Object.assign({}, baseProps, {showNumericalOrder: true})\n )\n );\n\n const headerCells = Array.from(\n mounted.node.querySelectorAll('.pvtTable thead tr:last-child th')\n );\n expect(headerCells[0].classList.contains('pvtRowNumber')).toBe(true);\n expect(headerCells[1].textContent).toContain('name');\n\n const firstBodyRow = mounted.node.querySelector('.pvtTable tbody tr');\n const bodyCells = Array.from(firstBodyRow.querySelectorAll('th,td'));\n expect(bodyCells[0].classList.contains('pvtRowNumber')).toBe(true);\n expect(bodyCells[1].classList.contains('pvtRowLabel')).toBe(true);\n });\n\n it('extends the totals label over the \"No.\" column', function() {\n mounted = mount(\n React.createElement(\n PivotTable,\n Object.assign({}, baseProps, {showNumericalOrder: true})\n )\n );\n\n const totalLabel = mounted.node.querySelector(\n '.pvtTable tbody .pvtTotalLabel'\n );\n expect(totalLabel.getAttribute('colspan')).toBe('2');\n });\n\n it('spans the \"No.\" header across the column-attribute header rows', function() {\n mounted = mount(\n React.createElement(\n PivotTable,\n Object.assign({}, baseProps, {\n cols: ['gender'],\n showNumericalOrder: true,\n })\n )\n );\n\n const header = mounted.node.querySelector('.pvtTable thead .pvtRowNumber');\n expect(header.textContent.trim()).toBe('No.');\n expect(header.getAttribute('rowspan')).toBe('2');\n\n expect(numberCells(mounted.node)).toEqual(['1', '2', '3', '4']);\n\n // Totals now covers \"No.\" + the row attribute + the column axis column.\n const totalLabel = mounted.node.querySelector(\n '.pvtTable tbody .pvtTotalLabel'\n );\n expect(totalLabel.getAttribute('colspan')).toBe('3');\n });\n\n it('spans the \"No.\" header across row group header rows', function() {\n mounted = mount(\n React.createElement(\n PivotTable,\n Object.assign({}, baseProps, {\n rows: ['name', 'gender'],\n rowGroupConfig: [{label: 'GRP', match: ['name']}],\n showNumericalOrder: true,\n })\n )\n );\n\n const header = mounted.node.querySelector('.pvtTable thead .pvtRowNumber');\n expect(header.getAttribute('rowspan')).toBe('2');\n expect(numberCells(mounted.node)).toEqual(['1', '2', '3', '4']);\n });\n\n it('passes showNumericalOrder through PivotTableUI', function() {\n // PivotTableUI computes asynchronously (worker / deferred main thread\n // computation, WORKER_DEBOUNCE_MS = 100ms), so the numbered rows only show\n // up after those timers ran.\n const wait = ms => new Promise(resolve => setTimeout(resolve, ms));\n const actAsync = callback =>\n new Promise((resolve, reject) => act(callback).then(resolve, reject));\n\n mounted = mount(\n React.createElement(\n PivotTableUI,\n Object.assign({}, baseProps, {showNumericalOrder: true})\n )\n );\n\n return actAsync(() => wait(300)).then(() => {\n expect(\n mounted.node.querySelector('.pvtTable thead .pvtRowNumber').textContent\n ).toBe('No.');\n expect(numberCells(mounted.node)).toEqual(['1', '2', '3', '4']);\n });\n });\n\n it('renders only visible rows and updates them while scrolling', function() {\n const manyRecords = Array.from({length: 1000}, (_, index) => ({\n name: `Employee ${String(index).padStart(4, '0')}`,\n }));\n const previousAnimationFrame = global.requestAnimationFrame;\n let pendingFrame;\n global.requestAnimationFrame = callback => {\n pendingFrame = callback;\n return 1;\n };\n jest.useFakeTimers();\n try {\n mounted = mount(\n React.createElement(\n PivotTable,\n Object.assign({}, baseProps, {\n data: manyRecords,\n showNumericalOrder: true,\n virtualizeRows: true,\n })\n )\n );\n\n const table = mounted.node.querySelector('.pvtTable');\n expect(table.getAttribute('data-pvt-virtualized')).toBe('true');\n expect(table.querySelectorAll('tbody .pvtDataRow').length).toBeLessThan(\n 150\n );\n expect(numberCells(mounted.node)[0]).toBe('1');\n\n const body = table.querySelector('tbody');\n body.getBoundingClientRect = () => ({top: -3200});\n act(() => {\n window.dispatchEvent(new Event('scroll'));\n if (pendingFrame) {\n pendingFrame();\n }\n });\n expect(numberCells(mounted.node)[0]).toBe('1');\n expect(\n mounted.node.querySelector('.pvtVirtualScrollOverlay .pvtLoadingText')\n .textContent\n ).toBe('Processing');\n act(() => jest.runTimersToTime(499));\n expect(numberCells(mounted.node)[0]).toBe('1');\n act(() => jest.runTimersToTime(1));\n expect(numberCells(mounted.node)[0]).toBe('65');\n expect(mounted.node.querySelector('.pvtVirtualScrollOverlay')).toBeNull();\n expect(table.querySelectorAll('tbody .pvtDataRow').length).toBeLessThan(\n 150\n );\n } finally {\n global.requestAnimationFrame = previousAnimationFrame;\n jest.useRealTimers();\n }\n });\n\n it('does not update synchronously again when layout shifts during a fast scroll', function() {\n const manyRecords = Array.from({length: 1000}, (_, index) => ({\n name: `Employee ${index}`,\n }));\n const fullPrecomputedData = computePivotState(\n materializeData(manyRecords, {}),\n createWorkerConfig(baseProps)\n );\n const precomputedData = createVirtualPivotSummary(\n fullPrecomputedData,\n false\n );\n precomputedData.viewportKey = 42;\n let layoutReads = 0;\n const previousAnimationFrame = global.requestAnimationFrame;\n let pendingFrame;\n global.requestAnimationFrame = callback => {\n pendingFrame = callback;\n return 1;\n };\n jest.useFakeTimers();\n try {\n mounted = mount(\n React.createElement(\n PivotTable,\n Object.assign({}, baseProps, {\n data: [],\n precomputedData,\n virtualizeRows: true,\n })\n )\n );\n\n const body = mounted.node.querySelector('.pvtTable tbody');\n body.getBoundingClientRect = () => ({\n top: layoutReads++ % 2 === 0 ? -3200 : -6400,\n });\n act(() => {\n window.dispatchEvent(new Event('scroll'));\n if (pendingFrame) {\n pendingFrame();\n }\n });\n expect(layoutReads).toBe(0);\n act(() => jest.runTimersToTime(250));\n act(() => {\n window.dispatchEvent(new Event('scroll'));\n });\n act(() => jest.runTimersToTime(499));\n expect(layoutReads).toBe(0);\n act(() => jest.runTimersToTime(1));\n expect(layoutReads).toBe(1);\n act(() => window.dispatchEvent(new Event('scroll')));\n act(() => jest.runTimersToTime(500));\n expect(layoutReads).toBe(2);\n } finally {\n global.requestAnimationFrame = previousAnimationFrame;\n jest.useRealTimers();\n }\n });\n\n it('renders only the visible columns and updates them after horizontal scrolling', function() {\n const wideRecords = Array.from({length: 200}, (_, index) => ({\n employee: `Employee ${String(index).padStart(3, '0')}`,\n gender: index % 2 === 0 ? 'female' : 'male',\n }));\n jest.useFakeTimers();\n try {\n mounted = mount(\n React.createElement(\n PivotTable,\n Object.assign({}, baseProps, {\n data: wideRecords,\n rows: ['gender'],\n cols: ['employee'],\n virtualizeRows: true,\n })\n )\n );\n\n const table = mounted.node.querySelector('.pvtTable');\n const initialLabels = Array.from(\n table.querySelectorAll('thead .pvtColLabel')\n ).map(cell => cell.textContent.trim());\n expect(table.classList.contains('pvtVirtualColumns')).toBe(true);\n expect(initialLabels).toContain('Employee 000');\n expect(initialLabels).not.toContain('Employee 150');\n expect(table.querySelectorAll('tbody .pvtVal').length).toBeLessThan(100);\n\n const body = table.querySelector('tbody');\n body.getBoundingClientRect = () => ({top: 0, left: -16000});\n act(() => window.dispatchEvent(new Event('scroll')));\n act(() => jest.runTimersToTime(500));\n\n const scrolledLabels = Array.from(\n table.querySelectorAll('thead .pvtColLabel')\n ).map(cell => cell.textContent.trim());\n expect(scrolledLabels).not.toContain('Employee 000');\n expect(scrolledLabels.some(label => label >= 'Employee 128')).toBe(true);\n expect(table.querySelectorAll('tbody .pvtVal').length).toBeLessThan(100);\n } finally {\n jest.useRealTimers();\n }\n });\n\n it('renders values after moving a high-cardinality field from rows to columns', function() {\n const wait = ms => new Promise(resolve => setTimeout(resolve, ms));\n const actAsync = callback =>\n new Promise((resolve, reject) => act(callback).then(resolve, reject));\n const manyRecords = Array.from({length: 400}, (_, index) => ({\n employee: `Employee ${String(index).padStart(3, '0')}`,\n rowLabel: `Row ${String(399 - index).padStart(3, '0')}`,\n }));\n const aggregation = [{key: 'count', aggregatorName: 'Count', vals: []}];\n const rowConfig = {\n rows: ['employee'],\n cols: [],\n aggregations: aggregation,\n };\n const columnConfig = {\n rows: ['rowLabel'],\n cols: ['employee'],\n aggregations: aggregation,\n };\n const materialized = materializeData(manyRecords, {});\n const rowPivot = computePivotState(materialized, rowConfig);\n const columnPivot = computePivotState(materialized, columnConfig);\n expect(alignSparseColumnsToRows(columnPivot)).toBe(true);\n const rowSummary = createVirtualPivotSummary(rowPivot, false);\n const columnSummary = createVirtualPivotSummary(columnPivot, false);\n rowSummary.viewportKey = 41;\n columnSummary.viewportKey = 42;\n const workerSpy = jest\n .spyOn(PivotDataWorker, 'computePivotViewportInWorker')\n .mockImplementation(\n (viewportKey, start, end, columnMode, columnStart, columnEnd) =>\n Promise.resolve(\n computePivotViewport(\n viewportKey === 41 ? rowPivot : columnPivot,\n start,\n end,\n columnMode,\n columnStart,\n columnEnd\n )\n )\n );\n\n mounted = mount(\n React.createElement(\n PivotTable,\n Object.assign({}, baseProps, rowConfig, {\n data: [],\n precomputedData: rowSummary,\n virtualizeRows: true,\n })\n )\n );\n\n return actAsync(() => wait(30))\n .then(() => {\n act(() => {\n // A layout-induced scroll can still be pending when the new worker\n // result replaces the previous axis configuration. The new viewport\n // must reset immediately instead of retaining an empty 0..0 column\n // window until the scroll debounce expires.\n window.dispatchEvent(new Event('scroll'));\n mounted.root.render(\n React.createElement(\n PivotTable,\n Object.assign({}, baseProps, columnConfig, {\n data: [],\n precomputedData: columnSummary,\n virtualizeRows: true,\n })\n )\n );\n });\n return actAsync(() => wait(50));\n })\n .then(() => {\n const values = Array.from(\n mounted.node.querySelectorAll('.pvtTable tbody .pvtVal')\n ).map(cell => cell.textContent.trim());\n expect(values.length).toBeGreaterThan(0);\n expect(values).toContain('1');\n expect(mounted.node.querySelector('.pvtVirtualLoading')).toBeNull();\n workerSpy.mockRestore();\n })\n .catch(error => {\n workerSpy.mockRestore();\n throw error;\n });\n });\n\n it('renders Employee Ref headers and cells for the example configuration', function() {\n const wait = ms => new Promise(resolve => setTimeout(resolve, ms));\n const actAsync = callback =>\n new Promise((resolve, reject) => act(callback).then(resolve, reject));\n const appRows = [\n 'Full Name Local',\n 'Full Name English',\n 'Gender',\n 'Joining Date',\n 'Last Working Date',\n 'Seniority Date',\n 'Contract Type',\n 'Location Name',\n 'Job Position Name',\n 'Cost Center Code',\n 'Cost Center Name',\n 'Organization Element Name',\n 'Nationality',\n 'Bank Account Number',\n 'Bank Name',\n 'Bank Account Holder Name',\n 'First Name Local',\n 'First Name English',\n 'Date Of Birth',\n 'Passport No.',\n 'Martial Status',\n 'Tax Code',\n 'Social Security No.',\n 'Pension Fund No',\n ];\n const appConfig = {\n rows: appRows,\n cols: ['Employee Ref'],\n aggregations: [{key: 'count', aggregatorName: 'Count', vals: []}],\n };\n const fullPivot = computePivotState(materializeData(tips, {}), appConfig);\n expect(alignSparseColumnsToRows(fullPivot)).toBe(true);\n const summary = createVirtualPivotSummary(fullPivot, false);\n summary.viewportKey = 43;\n const workerSpy = jest\n .spyOn(PivotDataWorker, 'computePivotViewportInWorker')\n .mockImplementation(\n (viewportKey, start, end, columnMode, columnStart, columnEnd) =>\n Promise.resolve(\n computePivotViewport(\n fullPivot,\n start,\n end,\n columnMode,\n columnStart,\n columnEnd\n )\n )\n );\n\n mounted = mount(\n React.createElement(\n PivotTable,\n Object.assign({}, baseProps, appConfig, {\n data: [],\n precomputedData: summary,\n virtualizeRows: true,\n })\n )\n );\n\n return actAsync(() => wait(50))\n .then(() => {\n const headers = Array.from(\n mounted.node.querySelectorAll('.pvtTable thead .pvtColLabel')\n ).map(cell => cell.textContent.trim());\n const values = Array.from(\n mounted.node.querySelectorAll('.pvtTable tbody .pvtVal')\n ).map(cell => cell.textContent.trim());\n expect(headers.length).toBeGreaterThan(0);\n expect(headers[0]).toMatch(/-F$/);\n expect(values).toContain('1');\n const firstHeader = headers[0];\n const table = mounted.node.querySelector('.pvtTable');\n const body = table.querySelector('tbody');\n const firstColumn = table.querySelector('thead .pvtColLabel');\n table.getBoundingClientRect = () => ({top: 0, left: -5000});\n body.getBoundingClientRect = () => ({top: 0, left: -5000});\n firstColumn.getBoundingClientRect = () => ({\n top: 0,\n left: -1885,\n width: 100,\n });\n act(() => window.dispatchEvent(new Event('scroll')));\n return actAsync(() => wait(600)).then(() => {\n const scrolledHeaders = Array.from(\n mounted.node.querySelectorAll('.pvtTable thead .pvtColLabel')\n ).map(cell => cell.textContent.trim());\n expect(scrolledHeaders[0]).toBe(firstHeader);\n workerSpy.mockRestore();\n });\n })\n .catch(error => {\n workerSpy.mockRestore();\n throw error;\n });\n });\n\n it('can render every row for a full export from a virtual table', function() {\n const manyRecords = Array.from({length: 301}, (_, index) => ({\n name: `Employee ${index}`,\n }));\n const fullPrecomputedData = computePivotState(\n materializeData(manyRecords, {}),\n createWorkerConfig(baseProps)\n );\n const precomputedData = createVirtualPivotSummary(\n fullPrecomputedData,\n false\n );\n mounted = mount(\n React.createElement(\n PivotTable,\n Object.assign({}, baseProps, {\n data: manyRecords,\n precomputedData,\n virtualizeRows: true,\n })\n )\n );\n\n const table = mounted.node.querySelector('.pvtTable');\n const pivotProps = getPivotTableProps(table);\n expect(table.querySelectorAll('tbody .pvtDataRow').length).toBeLessThan(\n 301\n );\n const html = renderToStaticMarkup(\n React.createElement(\n PivotTable,\n Object.assign({}, pivotProps, {virtualizeRows: false})\n )\n );\n const exportedTable = new DOMParser()\n .parseFromString(html, 'text/html')\n .querySelector('.pvtTable');\n expect(exportedTable.querySelectorAll('tbody .pvtDataRow')).toHaveLength(\n 301\n );\n });\n\n it('shows loading until the worker returns the requested row window', function() {\n const wait = ms => new Promise(resolve => setTimeout(resolve, ms));\n const actAsync = callback =>\n new Promise((resolve, reject) => act(callback).then(resolve, reject));\n const manyRecords = Array.from({length: 301}, (_, index) => ({\n name: `Employee ${index}`,\n }));\n const fullPrecomputedData = computePivotState(\n materializeData(manyRecords, {}),\n createWorkerConfig(baseProps)\n );\n const precomputedData = createVirtualPivotSummary(\n fullPrecomputedData,\n false\n );\n precomputedData.viewportKey = 42;\n const resolveWindows = [];\n const workerSpy = jest\n .spyOn(PivotDataWorker, 'computePivotViewportInWorker')\n .mockImplementation(\n () =>\n new Promise(resolve => {\n resolveWindows.push(resolve);\n })\n );\n\n mounted = mount(\n React.createElement(\n PivotTable,\n Object.assign({}, baseProps, {\n data: [],\n precomputedData,\n virtualizeRows: true,\n })\n )\n );\n expect(mounted.node.querySelector('.pvtVirtualLoading')).not.toBeNull();\n\n return actAsync(() => wait(30))\n .then(() => {\n expect(workerSpy).toHaveBeenCalledTimes(1);\n const body = mounted.node.querySelector('.pvtTable tbody');\n body.getBoundingClientRect = () => ({top: -3200});\n act(() => window.dispatchEvent(new Event('scroll')));\n expect(\n mounted.node.querySelector('.pvtVirtualScrollOverlay .pvtLoadingText')\n .textContent\n ).toBe('Processing');\n return actAsync(() => wait(550));\n })\n .then(() => {\n expect(workerSpy).toHaveBeenCalledTimes(2);\n expect(mounted.node.querySelector('.pvtVirtualLoading')).not.toBeNull();\n const [, start, end] = workerSpy.mock.calls[0];\n return actAsync(() => {\n resolveWindows[0](\n computePivotViewport(fullPrecomputedData, start, end, false)\n );\n return wait(0);\n });\n })\n .then(() => {\n expect(mounted.node.querySelector('.pvtVirtualLoading')).not.toBeNull();\n const [, start, end] = workerSpy.mock.calls[1];\n return actAsync(() => {\n resolveWindows[1](\n computePivotViewport(fullPrecomputedData, start, end, false)\n );\n return wait(0);\n });\n })\n .then(() => {\n expect(mounted.node.querySelector('.pvtVirtualLoading')).toBeNull();\n expect(\n mounted.node.querySelectorAll('.pvtTable tbody .pvtDataRow').length\n ).toBeGreaterThan(0);\n workerSpy.mockRestore();\n })\n .catch(error => {\n workerSpy.mockRestore();\n throw error;\n });\n });\n});\n"]}
@@ -26,6 +26,7 @@ describe(' pivotCompute', function () {
26
26
  var materialized = pivotCompute.materializeData(records, {});
27
27
  expect(materialized.totalRecords).toBe(4);
28
28
  expect(materialized.materializedInput).toEqual(records);
29
+ expect(materialized.materializedInput).toBe(records);
29
30
  expect(materialized.attrValues.gender).toEqual({ male: 2, female: 2 });
30
31
  });
31
32
 
@@ -39,6 +40,134 @@ describe(' pivotCompute', function () {
39
40
  });
40
41
  });
41
42
 
43
+ describe('.computePivotViewport()', function () {
44
+ it('returns only the requested rows in aggregation-row mode', function () {
45
+ var materialized = pivotCompute.materializeData(records, {});
46
+ var precomputed = pivotCompute.computePivotState(materialized, {
47
+ rows: ['name'],
48
+ cols: [],
49
+ aggregations: multiAggregationConfig
50
+ });
51
+ var viewport = pivotCompute.computePivotViewport(precomputed, 3, 6, false);
52
+
53
+ expect(viewport.totalRows).toBe(8);
54
+ expect(viewport.rows).toHaveLength(3);
55
+ expect(viewport.rows[0].aggregationKey).toBe('count');
56
+ expect(viewport.rows[0].displayKey).toHaveLength(2);
57
+ expect(viewport.rows[0].rowTotal[1]).toBe(1);
58
+ expect(viewport.rows[1].aggregationKey).toBe('sum-trials');
59
+ });
60
+
61
+ it('does not expand rows in aggregation-column mode', function () {
62
+ var precomputed = {
63
+ rowKeys: [['A'], ['B']],
64
+ aggregations: multiAggregationConfig
65
+ };
66
+ var viewport = pivotCompute.computePivotViewport(precomputed, 1, 99, true);
67
+ expect(viewport.totalRows).toBe(2);
68
+ expect(viewport.rows).toEqual([{
69
+ displayKey: ['B'],
70
+ actualKey: ['B'],
71
+ aggregationKey: 'sum-trials',
72
+ spans: [1],
73
+ cells: null,
74
+ rowTotal: null
75
+ }]);
76
+ });
77
+
78
+ it('computes merged row-label spans for the requested window', function () {
79
+ var precomputed = {
80
+ rowKeys: [['A', 'one'], ['A', 'two'], ['B', 'three']],
81
+ aggregations: [multiAggregationConfig[0]]
82
+ };
83
+ var viewport = pivotCompute.computePivotViewport(precomputed, 0, 3, false);
84
+ expect(viewport.rows.map(function (row) {
85
+ return row.spans;
86
+ })).toEqual([[2, 1], [-1, 1], [1, 1]]);
87
+ });
88
+
89
+ it('keeps the full cells out of a virtual summary', function () {
90
+ var largeRecords = new Array(500).fill(null).map(function (_, index) {
91
+ return {
92
+ name: 'Employee ' + index,
93
+ department: 'Department ' + index % 5,
94
+ amount: index
95
+ };
96
+ });
97
+ var materialized = pivotCompute.materializeData(largeRecords, {});
98
+ var full = pivotCompute.computePivotState(materialized, {
99
+ rows: ['name'],
100
+ cols: ['department'],
101
+ aggregations: multiAggregationConfig
102
+ });
103
+ var summary = pivotCompute.createVirtualPivotSummary(full, false);
104
+ var viewport = pivotCompute.computePivotViewport(full, 64, 96, false);
105
+
106
+ expect(summary.virtualized).toBe(true);
107
+ expect(summary.totalRows).toBe(1000);
108
+ expect(summary.rowKeys).toEqual([]);
109
+ expect(summary.tree).toEqual({});
110
+ expect(summary.rowTotals).toEqual({});
111
+ expect(viewport.rows).toHaveLength(32);
112
+ expect(viewport.rows[0].cells).toBeDefined();
113
+ expect(viewport.rows[0].rowTotal).toBeDefined();
114
+ expect(JSON.stringify(summary).length).toBeLessThan(JSON.stringify(full).length / 2);
115
+ });
116
+
117
+ it('returns only cells and totals inside the requested column window', function () {
118
+ var wideRecords = new Array(150).fill(null).map(function (_, index) {
119
+ return {
120
+ group: 'All',
121
+ employee: 'Employee ' + String(index).padStart(3, '0')
122
+ };
123
+ });
124
+ var materialized = pivotCompute.materializeData(wideRecords, {});
125
+ var full = pivotCompute.computePivotState(materialized, {
126
+ rows: ['group'],
127
+ cols: ['employee'],
128
+ aggregations: [multiAggregationConfig[1]]
129
+ });
130
+ var summary = pivotCompute.createVirtualPivotSummary(full, false);
131
+ var viewport = pivotCompute.computePivotViewport(full, 0, 1, false, 32, 48);
132
+
133
+ expect(summary.totalColumns).toBe(150);
134
+ expect(summary.colTotals).toEqual({});
135
+ expect(Object.keys(viewport.rows[0].cells)).toHaveLength(16);
136
+ expect(Object.keys(viewport.colTotals)).toHaveLength(16);
137
+ expect(viewport.columnStart).toBe(32);
138
+ expect(viewport.columnEnd).toBe(48);
139
+ });
140
+
141
+ it('aligns extremely sparse columns with the rows that contain their values', function () {
142
+ var sparseRecords = new Array(400).fill(null).map(function (_, index) {
143
+ return {
144
+ row: 'Row ' + String(index).padStart(3, '0'),
145
+ column: 'Column ' + String(399 - index).padStart(3, '0')
146
+ };
147
+ });
148
+ var materialized = pivotCompute.materializeData(sparseRecords, {});
149
+ var full = pivotCompute.computePivotState(materialized, {
150
+ rows: ['row'],
151
+ cols: ['column'],
152
+ aggregations: [multiAggregationConfig[1]]
153
+ });
154
+ var before = pivotCompute.computePivotViewport(full, 0, 32, false, 0, 32);
155
+ var beforeCells = before.rows.reduce(function (count, row) {
156
+ return count + Object.keys(row.cells).length;
157
+ }, 0);
158
+
159
+ expect(beforeCells).toBe(0);
160
+ expect(pivotCompute.alignSparseColumnsToRows(full)).toBe(true);
161
+
162
+ var after = pivotCompute.computePivotViewport(full, 0, 32, false, 0, 32);
163
+ var afterCells = after.rows.reduce(function (count, row) {
164
+ return count + Object.keys(row.cells).length;
165
+ }, 0);
166
+ expect(afterCells).toBe(32);
167
+ expect(full.colKeys[0]).toEqual(['Column 399']);
168
+ });
169
+ });
170
+
42
171
  describe('.computePivotState() with PivotData hydration', function () {
43
172
  var config = {
44
173
  rows: ['gender'],
@@ -79,6 +208,14 @@ describe(' pivotCompute', function () {
79
208
  });
80
209
  });
81
210
 
211
+ it('does not copy the source records into the worker result', function () {
212
+ var materialized = pivotCompute.materializeData(records, {});
213
+ var serialized = pivotCompute.computePivotState(materialized, config);
214
+
215
+ expect(serialized.materializedInput).toBeUndefined();
216
+ expect(serialized.totalRecords).toBe(records.length);
217
+ });
218
+
82
219
  it('provides working format() on hydrated aggregators', function () {
83
220
  var materialized = pivotCompute.materializeData(records, {});
84
221
  var serialized = pivotCompute.computePivotState(materialized, config);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/__tests__/pivotCompute-test.js"],"names":["pivotCompute","records","name","gender","colour","trials","successes","multiAggregationConfig","key","aggregatorName","vals","describe","it","materialized","materializeData","expect","totalRecords","toBe","materializedInput","toEqual","attrValues","male","female","maybeCallback","jest","fn","not","toHaveBeenCalled","config","rows","cols","aggregations","serialized","computePivotState","direct","PivotData","Object","assign","data","hydrated","precomputedData","getRowKeys","getColKeys","compareCells","rowKey","colKey","forEach","getAggregator","agg","value","directFormat","format","hydratedFormat","filteredConfig","valueFilter","reverseSorter","a","b","sorters","keys","map","indexOf","toBeLessThan","props","first","createComputeSignature","second","different","localeCompare","signature","toContain","eligibleProps","aggregators","defaultProps","derivedAttributes","beforeAll","global","Worker","FakeWorker","canComputeInWorker","threshold","Count","extra","record","enabled"],"mappings":";;AAAA;;IAAYA,Y;;AACZ;;;;AACA;;AAEA,IAAMC,UAAU,CACd,EAACC,MAAM,MAAP,EAAeC,QAAQ,MAAvB,EAA+BC,QAAQ,MAAvC,EAA+CC,QAAQ,GAAvD,EAA4DC,WAAW,EAAvE,EADc,EAEd,EAACJ,MAAM,MAAP,EAAeC,QAAQ,QAAvB,EAAiCC,QAAQ,KAAzC,EAAgDC,QAAQ,EAAxD,EAA4DC,WAAW,EAAvE,EAFc,EAGd,EAACJ,MAAM,MAAP,EAAeC,QAAQ,MAAvB,EAA+BC,QAAQ,MAAvC,EAA+CC,QAAQ,GAAvD,EAA4DC,WAAW,EAAvE,EAHc,EAId;AACEJ,QAAM,OADR;AAEEC,UAAQ,QAFV;AAGEC,UAAQ,QAHV;AAIEC,UAAQ,GAJV;AAKEC,aAAW;AALb,CAJc,CAAhB;;AAaA,IAAMC,yBAAyB,CAC7B,EAACC,KAAK,YAAN,EAAoBC,gBAAgB,KAApC,EAA2CC,MAAM,CAAC,QAAD,CAAjD,EAD6B,EAE7B,EAACF,KAAK,OAAN,EAAeC,gBAAgB,OAA/B,EAAwCC,MAAM,EAA9C,EAF6B,CAA/B;;AAKAC,SAAS,gBAAT,EAA2B,YAAW;AACpCA,WAAS,oBAAT,EAA+B,YAAW;AACxCC,OAAG,oDAAH,EAAyD,YAAW;AAClE,UAAMC,eAAeb,aAAac,eAAb,CAA6Bb,OAA7B,EAAsC,EAAtC,CAArB;AACAc,aAAOF,aAAaG,YAApB,EAAkCC,IAAlC,CAAuC,CAAvC;AACAF,aAAOF,aAAaK,iBAApB,EAAuCC,OAAvC,CAA+ClB,OAA/C;AACAc,aAAOF,aAAaO,UAAb,CAAwBjB,MAA/B,EAAuCgB,OAAvC,CAA+C,EAACE,MAAM,CAAP,EAAUC,QAAQ,CAAlB,EAA/C;AACD,KALD;;AAOAV,OAAG,gDAAH,EAAqD,YAAW;AAC9D;AACA;AACA,UAAMW,gBAAgBC,KAAKC,EAAL,EAAtB;AACA,UAAMZ,eAAeb,aAAac,eAAb,CACnBb,OADmB,EAEnB,EAFmB,EAGnBsB,aAHmB,CAArB;AAKAR,aAAOF,aAAaG,YAApB,EAAkCC,IAAlC,CAAuC,CAAvC;AACAF,aAAOQ,aAAP,EAAsBG,GAAtB,CAA0BC,gBAA1B;AACD,KAXD;AAYD,GApBD;;AAsBAhB,WAAS,+CAAT,EAA0D,YAAW;AACnE,QAAMiB,SAAS;AACbC,YAAM,CAAC,QAAD,CADO;AAEbC,YAAM,CAAC,QAAD,CAFO;AAGbC,oBAAcxB;AAHD,KAAf;;AAMAK,OAAG,0DAAH,EAA+D,YAAW;AACxE,UAAMC,eAAeb,aAAac,eAAb,CAA6Bb,OAA7B,EAAsC,EAAtC,CAArB;AACA,UAAM+B,aAAahC,aAAaiC,iBAAb,CAA+BpB,YAA/B,EAA6Ce,MAA7C,CAAnB;AACA,UAAMM,SAAS,IAAIC,oBAAJ,CAAcC,OAAOC,MAAP,CAAc,EAAd,EAAkBT,MAAlB,EAA0B,EAACU,MAAMrC,OAAP,EAA1B,CAAd,CAAf;AACA,UAAMsC,WAAW,IAAIJ,oBAAJ,CAAc;AAC7BG,cAAMzB,aAAaK,iBADU;AAE7BsB,yBAAiBR,UAFY;AAG7BD,sBAAcxB,sBAHe;AAI7BsB,cAAM,CAAC,QAAD,CAJuB;AAK7BC,cAAM,CAAC,QAAD;AALuB,OAAd,CAAjB;;AAQAf,aAAOwB,SAASE,UAAT,EAAP,EAA8BtB,OAA9B,CAAsCe,OAAOO,UAAP,EAAtC;AACA1B,aAAOwB,SAASG,UAAT,EAAP,EAA8BvB,OAA9B,CAAsCe,OAAOQ,UAAP,EAAtC;;AAEA,UAAMC,eAAe,SAAfA,YAAe,CAACC,MAAD,EAASC,MAAT,EAAoB;AACvCtC,+BAAuBuC,OAAvB,CAA+B,eAAO;AACpC/B,iBAAOwB,SAASQ,aAAT,CAAuBH,MAAvB,EAA+BC,MAA/B,EAAuCG,IAAIxC,GAA3C,EAAgDyC,KAAhD,EAAP,EAAgEhC,IAAhE,CACEiB,OAAOa,aAAP,CAAqBH,MAArB,EAA6BC,MAA7B,EAAqCG,IAAIxC,GAAzC,EAA8CyC,KAA9C,EADF;AAGD,SAJD;AAKD,OAND;;AAQAN,mBAAa,EAAb,EAAiB,EAAjB;AACAT,aAAOO,UAAP,GAAoBK,OAApB,CAA4B,kBAAU;AACpCH,qBAAaC,MAAb,EAAqB,EAArB;AACAV,eAAOQ,UAAP,GAAoBI,OAApB,CAA4B,kBAAU;AACpCH,uBAAaC,MAAb,EAAqBC,MAArB;AACD,SAFD;AAGD,OALD;AAMAX,aAAOQ,UAAP,GAAoBI,OAApB,CAA4B,kBAAU;AACpCH,qBAAa,EAAb,EAAiBE,MAAjB;AACD,OAFD;AAGD,KAjCD;;AAmCAjC,OAAG,mDAAH,EAAwD,YAAW;AACjE,UAAMC,eAAeb,aAAac,eAAb,CAA6Bb,OAA7B,EAAsC,EAAtC,CAArB;AACA,UAAM+B,aAAahC,aAAaiC,iBAAb,CAA+BpB,YAA/B,EAA6Ce,MAA7C,CAAnB;AACA,UAAMM,SAAS,IAAIC,oBAAJ,CAAcC,OAAOC,MAAP,CAAc,EAAd,EAAkBT,MAAlB,EAA0B,EAACU,MAAMrC,OAAP,EAA1B,CAAd,CAAf;AACA,UAAMsC,WAAW,IAAIJ,oBAAJ,CAAc;AAC7BG,cAAMzB,aAAaK,iBADU;AAE7BsB,yBAAiBR,UAFY;AAG7BD,sBAAcxB,sBAHe;AAI7BsB,cAAM,CAAC,QAAD,CAJuB;AAK7BC,cAAM,CAAC,QAAD;AALuB,OAAd,CAAjB;;AAQA,UAAMoB,eAAehB,OAClBa,aADkB,CACJ,EADI,EACA,EADA,EACI,YADJ,EAElBI,MAFkB,CAEX,MAFW,CAArB;AAGA,UAAMC,iBAAiBb,SACpBQ,aADoB,CACN,EADM,EACF,EADE,EACE,YADF,EAEpBI,MAFoB,CAEb,MAFa,CAAvB;AAGApC,aAAOqC,cAAP,EAAuBnC,IAAvB,CAA4BiC,YAA5B;AACD,KAnBD;;AAqBAtC,OAAG,4CAAH,EAAiD,YAAW;AAC1D,UAAMyC,iBAAiBjB,OAAOC,MAAP,CAAc,EAAd,EAAkBT,MAAlB,EAA0B;AAC/C0B,qBAAa,EAACnD,QAAQ,EAACkB,MAAM,IAAP,EAAT;AADkC,OAA1B,CAAvB;AAGA,UAAMR,eAAeb,aAAac,eAAb,CAA6Bb,OAA7B,EAAsC,EAAtC,CAArB;AACA,UAAM+B,aAAahC,aAAaiC,iBAAb,CACjBpB,YADiB,EAEjBwC,cAFiB,CAAnB;AAIA,UAAMnB,SAAS,IAAIC,oBAAJ,CACbC,OAAOC,MAAP,CAAc,EAAd,EAAkBgB,cAAlB,EAAkC,EAACf,MAAMrC,OAAP,EAAlC,CADa,CAAf;AAGA,UAAMsC,WAAW,IAAIJ,oBAAJ,CAAc;AAC7BG,cAAMzB,aAAaK,iBADU;AAE7BsB,yBAAiBR,UAFY;AAG7BD,sBAAcxB,sBAHe;AAI7BsB,cAAM,CAAC,QAAD,CAJuB;AAK7BC,cAAM,CAAC,QAAD,CALuB;AAM7BwB,qBAAa,EAACnD,QAAQ,EAACkB,MAAM,IAAP,EAAT;AANgB,OAAd,CAAjB;AAQAN,aAAOwB,SAASE,UAAT,EAAP,EAA8BtB,OAA9B,CAAsCe,OAAOO,UAAP,EAAtC;AACA1B,aAAOwB,SAASQ,aAAT,CAAuB,EAAvB,EAA2B,EAA3B,EAA+B,OAA/B,EAAwCE,KAAxC,EAAP,EAAwDhC,IAAxD,CACEiB,OAAOa,aAAP,CAAqB,EAArB,EAAyB,EAAzB,EAA6B,OAA7B,EAAsCE,KAAtC,EADF;AAGD,KAxBD;;AA0BArC,OAAG,uDAAH,EAA4D,YAAW;AACrE,UAAMC,eAAeb,aAAac,eAAb,CAA6Bb,OAA7B,EAAsC,EAAtC,CAArB;AACA,UAAM+B,aAAahC,aAAaiC,iBAAb,CAA+BpB,YAA/B,EAA6Ce,MAA7C,CAAnB;AACA,UAAM2B,gBAAgB,SAAhBA,aAAgB,CAACC,CAAD,EAAIC,CAAJ;AAAA,eAAWD,IAAIC,CAAJ,GAAQ,CAAR,GAAYD,IAAIC,CAAJ,GAAQ,CAAC,CAAT,GAAa,CAApC;AAAA,OAAtB;AACA,UAAMlB,WAAW,IAAIJ,oBAAJ,CAAc;AAC7BG,cAAMzB,aAAaK,iBADU;AAE7BsB,yBAAiBR,UAFY;AAG7BD,sBAAcxB,sBAHe;AAI7BsB,cAAM,CAAC,QAAD,CAJuB;AAK7BC,cAAM,CAAC,QAAD,CALuB;AAM7B4B,iBAAS,EAACvD,QAAQoD,aAAT;AANoB,OAAd,CAAjB;AAQA,UAAMI,OAAOpB,SAASE,UAAT,GAAsBmB,GAAtB,CAA0B;AAAA,eAAOpD,IAAI,CAAJ,CAAP;AAAA,OAA1B,CAAb;AACAO,aAAO4C,KAAKE,OAAL,CAAa,MAAb,CAAP,EAA6BC,YAA7B,CAA0CH,KAAKE,OAAL,CAAa,QAAb,CAA1C;AACD,KAdD;AAeD,GAxGD;;AA0GAlD,WAAS,2BAAT,EAAsC,YAAW;AAC/CC,OAAG,uDAAH,EAA4D,YAAW;AACrE,UAAMmD,QAAQ;AACZlC,cAAM,CAAC,QAAD,CADM;AAEZC,cAAM,EAFM;AAGZC,sBAAcxB,sBAHF;AAIZ+C,qBAAa,EAJD;AAKZI,iBAAS;AALG,OAAd;AAOA,UAAMM,QAAQhE,aAAaiE,sBAAb,CAAoCF,KAApC,CAAd;AACA,UAAMG,SAASlE,aAAaiE,sBAAb,CACb7B,OAAOC,MAAP,CAAc,EAAd,EAAkB0B,KAAlB,CADa,CAAf;AAGAhD,aAAOiD,KAAP,EAAc/C,IAAd,CAAmBiD,MAAnB;AACA,UAAMC,YAAYnE,aAAaiE,sBAAb,CAChB7B,OAAOC,MAAP,CAAc,EAAd,EAAkB0B,KAAlB,EAAyB,EAAClC,MAAM,CAAC,QAAD,CAAP,EAAzB,CADgB,CAAlB;AAGAd,aAAOoD,SAAP,EAAkBzC,GAAlB,CAAsBT,IAAtB,CAA2B+C,KAA3B;AACD,KAjBD;;AAmBApD,OAAG,kDAAH,EAAuD,YAAW;AAChE,UAAMmD,QAAQ;AACZlC,cAAM,CAAC,QAAD,CADM;AAEZ6B,iBAAS,EAACvD,QAAQ,gBAACqD,CAAD,EAAIC,CAAJ;AAAA,mBAAUD,EAAEY,aAAF,CAAgBX,CAAhB,CAAV;AAAA,WAAT;AAFG,OAAd;AAIA,UAAMY,YAAYrE,aAAaiE,sBAAb,CAAoCF,KAApC,CAAlB;AACAhD,aAAOsD,SAAP,EAAkB3C,GAAlB,CAAsB4C,SAAtB,CAAgC,eAAhC;AACD,KAPD;AAQD,GA5BD;;AA8BA3D,WAAS,uBAAT,EAAkC,YAAW;AAC3C,QAAM4D,gBAAgB;AACpBjC,YAAMrC,OADc;AAEpBuE,mBAAarC,qBAAUsC,YAAV,CAAuBD,WAFhB;AAGpBE,yBAAmB;AAHC,KAAtB;;AAMAC,cAAU,YAAW;AACnB;AACAC,aAAOC,MAAP,GAAgB,SAASC,UAAT,GAAsB,CAAE,CAAxC;AACD,KAHD;;AAKAlE,OAAG,kDAAH,EAAuD,YAAW;AAChEG,aACEf,aAAa+E,kBAAb,CAAgCR,aAAhC,EAA+C,EAACS,WAAW,CAAZ,EAA/C,CADF,EAEE/D,IAFF,CAEO,IAFP;AAGD,KAJD;;AAMAL,OAAG,sCAAH,EAA2C,YAAW;AACpDG,aACEf,aAAa+E,kBAAb,CAAgCR,aAAhC,EAA+C,EAACS,WAAW,IAAZ,EAA/C,CADF,EAEE/D,IAFF,CAEO,KAFP;AAGD,KAJD;;AAMAL,OAAG,gCAAH,EAAqC,YAAW;AAC9C,UAAMmD,QAAQ3B,OAAOC,MAAP,CAAc,EAAd,EAAkBkC,aAAlB,EAAiC;AAC7CC,qBAAa,EAACS,OAAO;AAAA,mBAAM;AAAA,qBAAO,EAAP;AAAA,aAAN;AAAA,WAAR;AADgC,OAAjC,CAAd;AAGAlE,aAAOf,aAAa+E,kBAAb,CAAgChB,KAAhC,EAAuC,EAACiB,WAAW,CAAZ,EAAvC,CAAP,EAA+D/D,IAA/D,CACE,KADF;AAGD,KAPD;;AASAL,OAAG,mCAAH,EAAwC,YAAW;AACjD,UAAMmD,QAAQ3B,OAAOC,MAAP,CAAc,EAAd,EAAkBkC,aAAlB,EAAiC;AAC7CG,2BAAmB,EAACQ,OAAO;AAAA,mBAAUC,OAAOjF,IAAjB;AAAA,WAAR;AAD0B,OAAjC,CAAd;AAGAa,aAAOf,aAAa+E,kBAAb,CAAgChB,KAAhC,EAAuC,EAACiB,WAAW,CAAZ,EAAvC,CAAP,EAA+D/D,IAA/D,CACE,KADF;AAGD,KAPD;;AASAL,OAAG,uBAAH,EAA4B,YAAW;AACrCG,aACEf,aAAa+E,kBAAb,CAAgCR,aAAhC,EAA+C;AAC7Ca,iBAAS,KADoC;AAE7CJ,mBAAW;AAFkC,OAA/C,CADF,EAKE/D,IALF,CAKO,KALP;AAMD,KAPD;AAQD,GAlDD;AAmDD,CAlND","file":"pivotCompute-test.js","sourcesContent":["import * as pivotCompute from '../pivotCompute';\nimport {PivotData} from '../Utilities';\n/* eslint-disable no-magic-numbers */\n\nconst records = [\n {name: 'Nick', gender: 'male', colour: 'blue', trials: 103, successes: 12},\n {name: 'Jane', gender: 'female', colour: 'red', trials: 95, successes: 25},\n {name: 'John', gender: 'male', colour: 'blue', trials: 112, successes: 30},\n {\n name: 'Carol',\n gender: 'female',\n colour: 'yellow',\n trials: 102,\n successes: 14,\n },\n];\n\nconst multiAggregationConfig = [\n {key: 'sum-trials', aggregatorName: 'Sum', vals: ['trials']},\n {key: 'count', aggregatorName: 'Count', vals: []},\n];\n\ndescribe(' pivotCompute', function() {\n describe('.materializeData()', function() {\n it('collects attribute values and materialized records', function() {\n const materialized = pivotCompute.materializeData(records, {});\n expect(materialized.totalRecords).toBe(4);\n expect(materialized.materializedInput).toEqual(records);\n expect(materialized.attrValues.gender).toEqual({male: 2, female: 2});\n });\n\n it('reports no progress (percentages were removed)', function() {\n // materializeData no longer accepts an onProgress callback: passing\n // one is ignored and nothing is reported during the scan.\n const maybeCallback = jest.fn();\n const materialized = pivotCompute.materializeData(\n records,\n {},\n maybeCallback\n );\n expect(materialized.totalRecords).toBe(4);\n expect(maybeCallback).not.toHaveBeenCalled();\n });\n });\n\n describe('.computePivotState() with PivotData hydration', function() {\n const config = {\n rows: ['gender'],\n cols: ['colour'],\n aggregations: multiAggregationConfig,\n };\n\n it('hydrates to the same results as a direct PivotData build', function() {\n const materialized = pivotCompute.materializeData(records, {});\n const serialized = pivotCompute.computePivotState(materialized, config);\n const direct = new PivotData(Object.assign({}, config, {data: records}));\n const hydrated = new PivotData({\n data: materialized.materializedInput,\n precomputedData: serialized,\n aggregations: multiAggregationConfig,\n rows: ['gender'],\n cols: ['colour'],\n });\n\n expect(hydrated.getRowKeys()).toEqual(direct.getRowKeys());\n expect(hydrated.getColKeys()).toEqual(direct.getColKeys());\n\n const compareCells = (rowKey, colKey) => {\n multiAggregationConfig.forEach(agg => {\n expect(hydrated.getAggregator(rowKey, colKey, agg.key).value()).toBe(\n direct.getAggregator(rowKey, colKey, agg.key).value()\n );\n });\n };\n\n compareCells([], []);\n direct.getRowKeys().forEach(rowKey => {\n compareCells(rowKey, []);\n direct.getColKeys().forEach(colKey => {\n compareCells(rowKey, colKey);\n });\n });\n direct.getColKeys().forEach(colKey => {\n compareCells([], colKey);\n });\n });\n\n it('provides working format() on hydrated aggregators', function() {\n const materialized = pivotCompute.materializeData(records, {});\n const serialized = pivotCompute.computePivotState(materialized, config);\n const direct = new PivotData(Object.assign({}, config, {data: records}));\n const hydrated = new PivotData({\n data: materialized.materializedInput,\n precomputedData: serialized,\n aggregations: multiAggregationConfig,\n rows: ['gender'],\n cols: ['colour'],\n });\n\n const directFormat = direct\n .getAggregator([], [], 'sum-trials')\n .format(1234.5);\n const hydratedFormat = hydrated\n .getAggregator([], [], 'sum-trials')\n .format(1234.5);\n expect(hydratedFormat).toBe(directFormat);\n });\n\n it('respects valueFilter like the classic path', function() {\n const filteredConfig = Object.assign({}, config, {\n valueFilter: {gender: {male: true}},\n });\n const materialized = pivotCompute.materializeData(records, {});\n const serialized = pivotCompute.computePivotState(\n materialized,\n filteredConfig\n );\n const direct = new PivotData(\n Object.assign({}, filteredConfig, {data: records})\n );\n const hydrated = new PivotData({\n data: materialized.materializedInput,\n precomputedData: serialized,\n aggregations: multiAggregationConfig,\n rows: ['gender'],\n cols: ['colour'],\n valueFilter: {gender: {male: true}},\n });\n expect(hydrated.getRowKeys()).toEqual(direct.getRowKeys());\n expect(hydrated.getAggregator([], [], 'count').value()).toBe(\n direct.getAggregator([], [], 'count').value()\n );\n });\n\n it('re-sorts keys on the main thread for function sorters', function() {\n const materialized = pivotCompute.materializeData(records, {});\n const serialized = pivotCompute.computePivotState(materialized, config);\n const reverseSorter = (a, b) => (a < b ? 1 : a > b ? -1 : 0);\n const hydrated = new PivotData({\n data: materialized.materializedInput,\n precomputedData: serialized,\n aggregations: multiAggregationConfig,\n rows: ['gender'],\n cols: ['colour'],\n sorters: {gender: reverseSorter},\n });\n const keys = hydrated.getRowKeys().map(key => key[0]);\n expect(keys.indexOf('male')).toBeLessThan(keys.indexOf('female'));\n });\n });\n\n describe('.createComputeSignature()', function() {\n it('is stable for identical configs and differs otherwise', function() {\n const props = {\n rows: ['gender'],\n cols: [],\n aggregations: multiAggregationConfig,\n valueFilter: {},\n sorters: {},\n };\n const first = pivotCompute.createComputeSignature(props);\n const second = pivotCompute.createComputeSignature(\n Object.assign({}, props)\n );\n expect(first).toBe(second);\n const different = pivotCompute.createComputeSignature(\n Object.assign({}, props, {rows: ['colour']})\n );\n expect(different).not.toBe(first);\n });\n\n it('strips function-based sorters from the signature', function() {\n const props = {\n rows: ['gender'],\n sorters: {gender: (a, b) => a.localeCompare(b)},\n };\n const signature = pivotCompute.createComputeSignature(props);\n expect(signature).not.toContain('localeCompare');\n });\n });\n\n describe('.canComputeInWorker()', function() {\n const eligibleProps = {\n data: records,\n aggregators: PivotData.defaultProps.aggregators,\n derivedAttributes: {},\n };\n\n beforeAll(function() {\n // jsdom has no Worker implementation; simulate availability.\n global.Worker = function FakeWorker() {};\n });\n\n it('accepts plain-array datasets above the threshold', function() {\n expect(\n pivotCompute.canComputeInWorker(eligibleProps, {threshold: 2})\n ).toBe(true);\n });\n\n it('rejects datasets below the threshold', function() {\n expect(\n pivotCompute.canComputeInWorker(eligibleProps, {threshold: 1000})\n ).toBe(false);\n });\n\n it('rejects custom aggregator maps', function() {\n const props = Object.assign({}, eligibleProps, {\n aggregators: {Count: () => () => ({})},\n });\n expect(pivotCompute.canComputeInWorker(props, {threshold: 2})).toBe(\n false\n );\n });\n\n it('rejects custom derived attributes', function() {\n const props = Object.assign({}, eligibleProps, {\n derivedAttributes: {extra: record => record.name},\n });\n expect(pivotCompute.canComputeInWorker(props, {threshold: 2})).toBe(\n false\n );\n });\n\n it('rejects disabled mode', function() {\n expect(\n pivotCompute.canComputeInWorker(eligibleProps, {\n enabled: false,\n threshold: 2,\n })\n ).toBe(false);\n });\n });\n});\n"]}
1
+ {"version":3,"sources":["../../src/__tests__/pivotCompute-test.js"],"names":["pivotCompute","records","name","gender","colour","trials","successes","multiAggregationConfig","key","aggregatorName","vals","describe","it","materialized","materializeData","expect","totalRecords","toBe","materializedInput","toEqual","attrValues","male","female","maybeCallback","jest","fn","not","toHaveBeenCalled","precomputed","computePivotState","rows","cols","aggregations","viewport","computePivotViewport","totalRows","toHaveLength","aggregationKey","displayKey","rowTotal","rowKeys","actualKey","spans","cells","map","row","largeRecords","Array","fill","_","index","department","amount","full","summary","createVirtualPivotSummary","virtualized","tree","rowTotals","toBeDefined","JSON","stringify","length","toBeLessThan","wideRecords","group","employee","String","padStart","totalColumns","colTotals","Object","keys","columnStart","columnEnd","sparseRecords","column","before","beforeCells","reduce","count","alignSparseColumnsToRows","after","afterCells","colKeys","config","serialized","direct","PivotData","assign","data","hydrated","precomputedData","getRowKeys","getColKeys","compareCells","rowKey","colKey","forEach","getAggregator","agg","value","toBeUndefined","directFormat","format","hydratedFormat","filteredConfig","valueFilter","reverseSorter","a","b","sorters","indexOf","props","first","createComputeSignature","second","different","localeCompare","signature","toContain","eligibleProps","aggregators","defaultProps","derivedAttributes","beforeAll","global","Worker","FakeWorker","canComputeInWorker","threshold","Count","extra","record","enabled"],"mappings":"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","file":"pivotCompute-test.js","sourcesContent":["import * as pivotCompute from '../pivotCompute';\nimport {PivotData} from '../Utilities';\n/* eslint-disable no-magic-numbers */\n\nconst records = [\n {name: 'Nick', gender: 'male', colour: 'blue', trials: 103, successes: 12},\n {name: 'Jane', gender: 'female', colour: 'red', trials: 95, successes: 25},\n {name: 'John', gender: 'male', colour: 'blue', trials: 112, successes: 30},\n {\n name: 'Carol',\n gender: 'female',\n colour: 'yellow',\n trials: 102,\n successes: 14,\n },\n];\n\nconst multiAggregationConfig = [\n {key: 'sum-trials', aggregatorName: 'Sum', vals: ['trials']},\n {key: 'count', aggregatorName: 'Count', vals: []},\n];\n\ndescribe(' pivotCompute', function() {\n describe('.materializeData()', function() {\n it('collects attribute values and materialized records', function() {\n const materialized = pivotCompute.materializeData(records, {});\n expect(materialized.totalRecords).toBe(4);\n expect(materialized.materializedInput).toEqual(records);\n expect(materialized.materializedInput).toBe(records);\n expect(materialized.attrValues.gender).toEqual({male: 2, female: 2});\n });\n\n it('reports no progress (percentages were removed)', function() {\n // materializeData no longer accepts an onProgress callback: passing\n // one is ignored and nothing is reported during the scan.\n const maybeCallback = jest.fn();\n const materialized = pivotCompute.materializeData(\n records,\n {},\n maybeCallback\n );\n expect(materialized.totalRecords).toBe(4);\n expect(maybeCallback).not.toHaveBeenCalled();\n });\n });\n\n describe('.computePivotViewport()', function() {\n it('returns only the requested rows in aggregation-row mode', function() {\n const materialized = pivotCompute.materializeData(records, {});\n const precomputed = pivotCompute.computePivotState(materialized, {\n rows: ['name'],\n cols: [],\n aggregations: multiAggregationConfig,\n });\n const viewport = pivotCompute.computePivotViewport(\n precomputed,\n 3,\n 6,\n false\n );\n\n expect(viewport.totalRows).toBe(8);\n expect(viewport.rows).toHaveLength(3);\n expect(viewport.rows[0].aggregationKey).toBe('count');\n expect(viewport.rows[0].displayKey).toHaveLength(2);\n expect(viewport.rows[0].rowTotal[1]).toBe(1);\n expect(viewport.rows[1].aggregationKey).toBe('sum-trials');\n });\n\n it('does not expand rows in aggregation-column mode', function() {\n const precomputed = {\n rowKeys: [['A'], ['B']],\n aggregations: multiAggregationConfig,\n };\n const viewport = pivotCompute.computePivotViewport(\n precomputed,\n 1,\n 99,\n true\n );\n expect(viewport.totalRows).toBe(2);\n expect(viewport.rows).toEqual([\n {\n displayKey: ['B'],\n actualKey: ['B'],\n aggregationKey: 'sum-trials',\n spans: [1],\n cells: null,\n rowTotal: null,\n },\n ]);\n });\n\n it('computes merged row-label spans for the requested window', function() {\n const precomputed = {\n rowKeys: [\n ['A', 'one'],\n ['A', 'two'],\n ['B', 'three'],\n ],\n aggregations: [multiAggregationConfig[0]],\n };\n const viewport = pivotCompute.computePivotViewport(\n precomputed,\n 0,\n 3,\n false\n );\n expect(viewport.rows.map(row => row.spans)).toEqual([\n [2, 1],\n [-1, 1],\n [1, 1],\n ]);\n });\n\n it('keeps the full cells out of a virtual summary', function() {\n const largeRecords = new Array(500).fill(null).map((_, index) => ({\n name: `Employee ${index}`,\n department: `Department ${index % 5}`,\n amount: index,\n }));\n const materialized = pivotCompute.materializeData(largeRecords, {});\n const full = pivotCompute.computePivotState(materialized, {\n rows: ['name'],\n cols: ['department'],\n aggregations: multiAggregationConfig,\n });\n const summary = pivotCompute.createVirtualPivotSummary(full, false);\n const viewport = pivotCompute.computePivotViewport(full, 64, 96, false);\n\n expect(summary.virtualized).toBe(true);\n expect(summary.totalRows).toBe(1000);\n expect(summary.rowKeys).toEqual([]);\n expect(summary.tree).toEqual({});\n expect(summary.rowTotals).toEqual({});\n expect(viewport.rows).toHaveLength(32);\n expect(viewport.rows[0].cells).toBeDefined();\n expect(viewport.rows[0].rowTotal).toBeDefined();\n expect(JSON.stringify(summary).length).toBeLessThan(\n JSON.stringify(full).length / 2\n );\n });\n\n it('returns only cells and totals inside the requested column window', function() {\n const wideRecords = new Array(150).fill(null).map((_, index) => ({\n group: 'All',\n employee: `Employee ${String(index).padStart(3, '0')}`,\n }));\n const materialized = pivotCompute.materializeData(wideRecords, {});\n const full = pivotCompute.computePivotState(materialized, {\n rows: ['group'],\n cols: ['employee'],\n aggregations: [multiAggregationConfig[1]],\n });\n const summary = pivotCompute.createVirtualPivotSummary(full, false);\n const viewport = pivotCompute.computePivotViewport(\n full,\n 0,\n 1,\n false,\n 32,\n 48\n );\n\n expect(summary.totalColumns).toBe(150);\n expect(summary.colTotals).toEqual({});\n expect(Object.keys(viewport.rows[0].cells)).toHaveLength(16);\n expect(Object.keys(viewport.colTotals)).toHaveLength(16);\n expect(viewport.columnStart).toBe(32);\n expect(viewport.columnEnd).toBe(48);\n });\n\n it('aligns extremely sparse columns with the rows that contain their values', function() {\n const sparseRecords = new Array(400).fill(null).map((_, index) => ({\n row: `Row ${String(index).padStart(3, '0')}`,\n column: `Column ${String(399 - index).padStart(3, '0')}`,\n }));\n const materialized = pivotCompute.materializeData(sparseRecords, {});\n const full = pivotCompute.computePivotState(materialized, {\n rows: ['row'],\n cols: ['column'],\n aggregations: [multiAggregationConfig[1]],\n });\n const before = pivotCompute.computePivotViewport(\n full,\n 0,\n 32,\n false,\n 0,\n 32\n );\n const beforeCells = before.rows.reduce(\n (count, row) => count + Object.keys(row.cells).length,\n 0\n );\n\n expect(beforeCells).toBe(0);\n expect(pivotCompute.alignSparseColumnsToRows(full)).toBe(true);\n\n const after = pivotCompute.computePivotViewport(\n full,\n 0,\n 32,\n false,\n 0,\n 32\n );\n const afterCells = after.rows.reduce(\n (count, row) => count + Object.keys(row.cells).length,\n 0\n );\n expect(afterCells).toBe(32);\n expect(full.colKeys[0]).toEqual(['Column 399']);\n });\n });\n\n describe('.computePivotState() with PivotData hydration', function() {\n const config = {\n rows: ['gender'],\n cols: ['colour'],\n aggregations: multiAggregationConfig,\n };\n\n it('hydrates to the same results as a direct PivotData build', function() {\n const materialized = pivotCompute.materializeData(records, {});\n const serialized = pivotCompute.computePivotState(materialized, config);\n const direct = new PivotData(Object.assign({}, config, {data: records}));\n const hydrated = new PivotData({\n data: materialized.materializedInput,\n precomputedData: serialized,\n aggregations: multiAggregationConfig,\n rows: ['gender'],\n cols: ['colour'],\n });\n\n expect(hydrated.getRowKeys()).toEqual(direct.getRowKeys());\n expect(hydrated.getColKeys()).toEqual(direct.getColKeys());\n\n const compareCells = (rowKey, colKey) => {\n multiAggregationConfig.forEach(agg => {\n expect(hydrated.getAggregator(rowKey, colKey, agg.key).value()).toBe(\n direct.getAggregator(rowKey, colKey, agg.key).value()\n );\n });\n };\n\n compareCells([], []);\n direct.getRowKeys().forEach(rowKey => {\n compareCells(rowKey, []);\n direct.getColKeys().forEach(colKey => {\n compareCells(rowKey, colKey);\n });\n });\n direct.getColKeys().forEach(colKey => {\n compareCells([], colKey);\n });\n });\n\n it('does not copy the source records into the worker result', function() {\n const materialized = pivotCompute.materializeData(records, {});\n const serialized = pivotCompute.computePivotState(materialized, config);\n\n expect(serialized.materializedInput).toBeUndefined();\n expect(serialized.totalRecords).toBe(records.length);\n });\n\n it('provides working format() on hydrated aggregators', function() {\n const materialized = pivotCompute.materializeData(records, {});\n const serialized = pivotCompute.computePivotState(materialized, config);\n const direct = new PivotData(Object.assign({}, config, {data: records}));\n const hydrated = new PivotData({\n data: materialized.materializedInput,\n precomputedData: serialized,\n aggregations: multiAggregationConfig,\n rows: ['gender'],\n cols: ['colour'],\n });\n\n const directFormat = direct\n .getAggregator([], [], 'sum-trials')\n .format(1234.5);\n const hydratedFormat = hydrated\n .getAggregator([], [], 'sum-trials')\n .format(1234.5);\n expect(hydratedFormat).toBe(directFormat);\n });\n\n it('respects valueFilter like the classic path', function() {\n const filteredConfig = Object.assign({}, config, {\n valueFilter: {gender: {male: true}},\n });\n const materialized = pivotCompute.materializeData(records, {});\n const serialized = pivotCompute.computePivotState(\n materialized,\n filteredConfig\n );\n const direct = new PivotData(\n Object.assign({}, filteredConfig, {data: records})\n );\n const hydrated = new PivotData({\n data: materialized.materializedInput,\n precomputedData: serialized,\n aggregations: multiAggregationConfig,\n rows: ['gender'],\n cols: ['colour'],\n valueFilter: {gender: {male: true}},\n });\n expect(hydrated.getRowKeys()).toEqual(direct.getRowKeys());\n expect(hydrated.getAggregator([], [], 'count').value()).toBe(\n direct.getAggregator([], [], 'count').value()\n );\n });\n\n it('re-sorts keys on the main thread for function sorters', function() {\n const materialized = pivotCompute.materializeData(records, {});\n const serialized = pivotCompute.computePivotState(materialized, config);\n const reverseSorter = (a, b) => (a < b ? 1 : a > b ? -1 : 0);\n const hydrated = new PivotData({\n data: materialized.materializedInput,\n precomputedData: serialized,\n aggregations: multiAggregationConfig,\n rows: ['gender'],\n cols: ['colour'],\n sorters: {gender: reverseSorter},\n });\n const keys = hydrated.getRowKeys().map(key => key[0]);\n expect(keys.indexOf('male')).toBeLessThan(keys.indexOf('female'));\n });\n });\n\n describe('.createComputeSignature()', function() {\n it('is stable for identical configs and differs otherwise', function() {\n const props = {\n rows: ['gender'],\n cols: [],\n aggregations: multiAggregationConfig,\n valueFilter: {},\n sorters: {},\n };\n const first = pivotCompute.createComputeSignature(props);\n const second = pivotCompute.createComputeSignature(\n Object.assign({}, props)\n );\n expect(first).toBe(second);\n const different = pivotCompute.createComputeSignature(\n Object.assign({}, props, {rows: ['colour']})\n );\n expect(different).not.toBe(first);\n });\n\n it('strips function-based sorters from the signature', function() {\n const props = {\n rows: ['gender'],\n sorters: {gender: (a, b) => a.localeCompare(b)},\n };\n const signature = pivotCompute.createComputeSignature(props);\n expect(signature).not.toContain('localeCompare');\n });\n });\n\n describe('.canComputeInWorker()', function() {\n const eligibleProps = {\n data: records,\n aggregators: PivotData.defaultProps.aggregators,\n derivedAttributes: {},\n };\n\n beforeAll(function() {\n // jsdom has no Worker implementation; simulate availability.\n global.Worker = function FakeWorker() {};\n });\n\n it('accepts plain-array datasets above the threshold', function() {\n expect(\n pivotCompute.canComputeInWorker(eligibleProps, {threshold: 2})\n ).toBe(true);\n });\n\n it('rejects datasets below the threshold', function() {\n expect(\n pivotCompute.canComputeInWorker(eligibleProps, {threshold: 1000})\n ).toBe(false);\n });\n\n it('rejects custom aggregator maps', function() {\n const props = Object.assign({}, eligibleProps, {\n aggregators: {Count: () => () => ({})},\n });\n expect(pivotCompute.canComputeInWorker(props, {threshold: 2})).toBe(\n false\n );\n });\n\n it('rejects custom derived attributes', function() {\n const props = Object.assign({}, eligibleProps, {\n derivedAttributes: {extra: record => record.name},\n });\n expect(pivotCompute.canComputeInWorker(props, {threshold: 2})).toBe(\n false\n );\n });\n\n it('rejects disabled mode', function() {\n expect(\n pivotCompute.canComputeInWorker(eligibleProps, {\n enabled: false,\n threshold: 2,\n })\n ).toBe(false);\n });\n });\n});\n"]}