UNPKG

6.86 kBPlain TextView Raw
1import { RowData } from '../src/util/helper';
2import { Dataset, extractors, compositeExtractor } from '../src';
3
4const data1: RowData[] = [
5 { date: '2020-01-01', quarter: 'Q1', team: 'A', population: 3, salarycost: 6, revenue: 15 },
6 { date: '2020-01-01', quarter: 'Q1', team: 'B', population: 7, salarycost: 14, revenue: 35 },
7 { date: '2020-01-01', quarter: 'Q1', team: 'C', population: 10, salarycost: 20, revenue: 50 },
8 { date: '2020-02-01', quarter: 'Q1', team: 'A', population: 4, salarycost: 8, revenue: 20 },
9 { date: '2020-02-01', quarter: 'Q1', team: 'B', population: 7, salarycost: 14, revenue: 50 },
10 { date: '2020-02-01', quarter: 'Q1', team: 'C', population: 10, salarycost: 20, revenue: 50 },
11 { date: '2020-03-01', quarter: 'Q1', team: 'A', population: 4, salarycost: 6, revenue: 15 },
12 { date: '2020-03-01', quarter: 'Q1', team: 'B', population: 10, salarycost: 20, revenue: 35 },
13 { date: '2020-03-01', quarter: 'Q1', team: 'C', population: 10, salarycost: 20, revenue: 30 },
14 { date: '2020-04-01', quarter: 'Q2', team: 'A', population: 8, salarycost: 10, revenue: 35 },
15 { date: '2020-04-01', quarter: 'Q2', team: 'B', population: 10, salarycost: 20, revenue: 40 },
16 { date: '2020-04-01', quarter: 'Q2', team: 'C', population: 10, salarycost: 20, revenue: 35 },
17 { date: '2020-05-01', quarter: 'Q2', team: 'A', population: 8, salarycost: 14, revenue: 40 },
18 { date: '2020-05-01', quarter: 'Q2', team: 'B', population: 10, salarycost: 20, revenue: 37 },
19 { date: '2020-05-01', quarter: 'Q2', team: 'C', population: 12, salarycost: 24, revenue: 40 },
20 { date: '2020-06-01', quarter: 'Q2', team: 'A', population: 11, salarycost: 20, revenue: 22 },
21 { date: '2020-06-01', quarter: 'Q2', team: 'B', population: 13, salarycost: 30, revenue: 28 },
22 { date: '2020-06-01', quarter: 'Q2', team: 'C', population: 15, salarycost: 30, revenue: 32 },
23 { date: '2020-07-01', quarter: 'Q3', team: 'A', population: 11, salarycost: 20, revenue: 38 },
24 { date: '2020-07-01', quarter: 'Q3', team: 'B', population: 13, salarycost: 30, revenue: 42 },
25 { date: '2020-07-01', quarter: 'Q3', team: 'C', population: 16, salarycost: 29, revenue: 43 },
26 { date: '2020-08-01', quarter: 'Q3', team: 'A', population: 11, salarycost: 20, revenue: 38 },
27 { date: '2020-08-01', quarter: 'Q3', team: 'B', population: 15, salarycost: 31, revenue: 47 },
28 { date: '2020-08-01', quarter: 'Q3', team: 'C', population: 16, salarycost: 29, revenue: 48 },
29 { date: '2020-09-01', quarter: 'Q3', team: 'A', population: 12, salarycost: 22, revenue: 20 },
30 { date: '2020-09-01', quarter: 'Q3', team: 'B', population: 15, salarycost: 31, revenue: 32 },
31 { date: '2020-09-01', quarter: 'Q3', team: 'C', population: 17, salarycost: 31, revenue: 35 },
32 { date: '2020-10-01', quarter: 'Q4', team: 'A', population: 14, salarycost: 30, revenue: 39 },
33 { date: '2020-10-01', quarter: 'Q4', team: 'B', population: 15, salarycost: 28, revenue: 39 },
34 { date: '2020-10-01', quarter: 'Q4', team: 'C', population: 20, salarycost: 37, revenue: 52 },
35 { date: '2020-11-01', quarter: 'Q4', team: 'A', population: 14, salarycost: 26, revenue: 70 },
36 { date: '2020-11-01', quarter: 'Q4', team: 'B', population: 17, salarycost: 30, revenue: 80 },
37 { date: '2020-11-01', quarter: 'Q4', team: 'C', population: 20, salarycost: 36, revenue: 100 },
38 { date: '2020-12-01', quarter: 'Q4', team: 'A', population: 10, salarycost: 14, revenue: 20 },
39 { date: '2020-12-01', quarter: 'Q4', team: 'B', population: 14, salarycost: 16, revenue: 24 },
40 { date: '2020-12-01', quarter: 'Q4', team: 'C', population: 30, salarycost: 66, revenue: 40 },
41];
42
43test('dataset', () => {
44 const dataset = new Dataset(data1);
45
46 expect(dataset.dataset === data1).toBe(true);
47 expect(dataset.measures.map((m) => m.name)).toEqual(['population', 'salarycost', 'revenue']);
48 expect(dataset.dimensions.map((d) => d.name)).toEqual(['date', 'quarter', 'team']);
49 expect(dataset.measureTitles).toEqual(['population', 'salarycost', 'revenue']);
50 expect(dataset.dimensionTitles).toEqual(['date', 'quarter', 'team']);
51});
52
53test('subspace', () => {
54 const dataset = new Dataset(data1);
55
56 const subspace1 = dataset.subspace(['*', '*', 'A']);
57 expect(subspace1.dataset.length).toBe(12);
58
59 const siblingGroup1 = dataset.siblingGroup(subspace1, 'team');
60 expect(siblingGroup1.dataset.length).toBe(36);
61
62 const siblingGroup2 = dataset.siblingGroup(dataset.subspace(['2020-10-01', '*', 'C']), 'team');
63 expect(siblingGroup2.dataset.length).toBe(3);
64});
65
66test('extractor', () => {
67 const dataset = new Dataset(data1);
68
69 const siblingGroup1 = dataset.siblingGroup(dataset.subspace(['2020-10-01', 'Q4', 'C']), 'team');
70 expect(extractors.rank(siblingGroup1)).toEqual([
71 [3, 2, 1],
72 [2, 3, 1],
73 [2, 2, 1],
74 ]);
75 expect(extractors.percent(siblingGroup1).map((m) => m.map((v) => Number(v.toFixed(2))))).toEqual([
76 [0.29, 0.31, 0.41],
77 [0.32, 0.29, 0.39],
78 [0.3, 0.3, 0.4],
79 ]);
80
81 const siblingGroup2 = dataset.siblingGroup(dataset.subspace(['*', '*', 'A']), 'quarter');
82 const result2 = compositeExtractor(siblingGroup2, { agg: 'sum', measure: 'population' });
83 expect(result2.map((e) => e.population_sum)).toEqual([11, 27, 34, 38]);
84
85 const siblingGroup3 = dataset.siblingGroup(dataset.subspace(['2020-01-01', '*', 'A']), 'quarter');
86 const result3 = compositeExtractor(siblingGroup3, { agg: 'sum', measure: 'population' });
87 expect(result3).toStrictEqual([{ date: '2020-01-01', quarter: 'Q1', team: 'A', population_sum: 3 }]);
88
89 const result4 = compositeExtractor(siblingGroup2, { agg: 'sum', measure: 'population' }, [
90 { extractor: 'percent', dimension: 'quarter' },
91 { extractor: 'rank', dimension: 'quarter' },
92 ]);
93 expect(result4).toStrictEqual([
94 { quarter: 'Q1', team: 'A', population_sum_percent_rank: 4 },
95 { quarter: 'Q2', team: 'A', population_sum_percent_rank: 3 },
96 { quarter: 'Q3', team: 'A', population_sum_percent_rank: 2 },
97 { quarter: 'Q4', team: 'A', population_sum_percent_rank: 1 },
98 ]);
99});
100
101test('allSubspaceDataset', () => {
102 const dataset = new Dataset(data1);
103 const subDatasets = dataset.allSubspaceDataset({
104 measures: ['population', 'revenue'],
105 aggregations: ['sum', 'avg'],
106 depth: 3,
107 });
108 expect(subDatasets.map((dataset) => Object.keys(dataset[0]))).toStrictEqual([
109 ['date', 'population_sum'],
110 ['date', 'population_avg'],
111 ['date', 'revenue_sum'],
112 ['date', 'revenue_avg'],
113 ['quarter', 'population_sum'],
114 ['quarter', 'population_avg'],
115 ['quarter', 'revenue_sum'],
116 ['quarter', 'revenue_avg'],
117 ['team', 'population_sum'],
118 ['team', 'population_sum_percent'],
119 ['team', 'population_avg'],
120 ['team', 'population_avg_percent'],
121 ['team', 'revenue_sum'],
122 ['team', 'revenue_sum_percent'],
123 ['team', 'revenue_avg'],
124 ['team', 'revenue_avg_percent'],
125 ]);
126});