1 | import { RowData } from '../src/util/helper';
|
2 | import { Dataset, extractors, compositeExtractor } from '../src';
|
3 |
|
4 | const 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 |
|
43 | test('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 |
|
53 | test('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 |
|
66 | test('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 |
|
101 | test('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 | });
|