@hrforte/react-pivottable 2.2.1 → 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.
- package/dist/PivotDataWorker.js +219 -13
- package/dist/PivotDataWorker.js.map +1 -1
- package/dist/PivotTable.js +2 -1
- package/dist/PivotTable.js.map +1 -1
- package/dist/PivotTableUI.js +145 -48
- package/dist/PivotTableUI.js.map +1 -1
- package/dist/TableRenderers.js +629 -118
- package/dist/TableRenderers.js.map +1 -1
- package/dist/Utilities.js +104 -179
- package/dist/Utilities.js.map +1 -1
- package/dist/__tests__/PivotDataWorker-test.js +437 -7
- package/dist/__tests__/PivotDataWorker-test.js.map +1 -1
- package/dist/__tests__/PivotTableUI-processing-test.js +42 -3
- package/dist/__tests__/PivotTableUI-processing-test.js.map +1 -1
- package/dist/__tests__/PivotTableUI-rerender-test.js +314 -0
- package/dist/__tests__/PivotTableUI-rerender-test.js.map +1 -0
- package/dist/__tests__/TableRenderers-showNumericalOrder-test.js +449 -0
- package/dist/__tests__/TableRenderers-showNumericalOrder-test.js.map +1 -1
- package/dist/__tests__/pivotCompute-test.js +137 -0
- package/dist/__tests__/pivotCompute-test.js.map +1 -1
- package/dist/pivot-worker.js +510 -201
- package/dist/pivotCompute.js +238 -12
- package/dist/pivotCompute.js.map +1 -1
- package/dist/pivotWorker.js +165 -9
- package/dist/pivotWorker.js.map +1 -1
- package/dist/pivottable.css +277 -235
- package/package.json +1 -1
|
@@ -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":"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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.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"]}
|