@cubejs-client/core 1.3.15 → 1.3.16

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.
Files changed (100) hide show
  1. package/dist/{cubejs-client-core.js → cubejs-client-core.cjs.js} +1016 -411
  2. package/dist/cubejs-client-core.cjs.js.map +1 -0
  3. package/dist/cubejs-client-core.umd.js +2901 -12088
  4. package/dist/cubejs-client-core.umd.js.map +1 -1
  5. package/dist/src/HttpTransport.d.ts +54 -0
  6. package/dist/src/HttpTransport.d.ts.map +1 -0
  7. package/dist/src/HttpTransport.js +55 -0
  8. package/dist/src/Meta.d.ts +62 -0
  9. package/dist/src/Meta.d.ts.map +1 -0
  10. package/dist/src/Meta.js +150 -0
  11. package/dist/src/ProgressResult.d.ts +8 -0
  12. package/dist/src/ProgressResult.d.ts.map +1 -0
  13. package/dist/src/ProgressResult.js +11 -0
  14. package/dist/src/RequestError.d.ts +6 -0
  15. package/dist/src/RequestError.d.ts.map +1 -0
  16. package/dist/src/RequestError.js +7 -0
  17. package/dist/src/ResultSet.d.ts +430 -0
  18. package/dist/src/ResultSet.d.ts.map +1 -0
  19. package/dist/src/ResultSet.js +952 -0
  20. package/dist/src/SqlQuery.d.ts +17 -0
  21. package/dist/src/SqlQuery.d.ts.map +1 -0
  22. package/dist/src/SqlQuery.js +11 -0
  23. package/dist/src/index.d.ts +194 -0
  24. package/dist/src/index.d.ts.map +1 -0
  25. package/dist/src/index.js +411 -0
  26. package/dist/src/index.umd.d.ts +3 -0
  27. package/dist/src/index.umd.d.ts.map +1 -0
  28. package/dist/src/index.umd.js +6 -0
  29. package/dist/src/time.d.ts +70 -0
  30. package/dist/src/time.d.ts.map +1 -0
  31. package/dist/src/time.js +249 -0
  32. package/dist/src/types.d.ts +424 -0
  33. package/dist/src/types.d.ts.map +1 -0
  34. package/dist/src/types.js +1 -0
  35. package/dist/src/utils.d.ts +19 -0
  36. package/dist/src/utils.d.ts.map +1 -0
  37. package/dist/src/utils.js +294 -0
  38. package/dist/test/CubeApi.test.d.ts +7 -0
  39. package/dist/test/CubeApi.test.d.ts.map +1 -0
  40. package/dist/test/CubeApi.test.js +279 -0
  41. package/dist/test/HttpTransport.test.d.ts +2 -0
  42. package/dist/test/HttpTransport.test.d.ts.map +1 -0
  43. package/dist/test/HttpTransport.test.js +244 -0
  44. package/dist/test/ResultSet.test.d.ts +7 -0
  45. package/dist/test/ResultSet.test.d.ts.map +1 -0
  46. package/dist/test/ResultSet.test.js +1725 -0
  47. package/dist/test/compare-date-range.test.d.ts +2 -0
  48. package/dist/test/compare-date-range.test.d.ts.map +1 -0
  49. package/dist/test/compare-date-range.test.js +742 -0
  50. package/dist/test/data-blending.test.d.ts +2 -0
  51. package/dist/test/data-blending.test.d.ts.map +1 -0
  52. package/dist/test/data-blending.test.js +423 -0
  53. package/dist/test/default-heuristics.test.d.ts +2 -0
  54. package/dist/test/default-heuristics.test.d.ts.map +1 -0
  55. package/dist/test/default-heuristics.test.js +108 -0
  56. package/dist/test/drill-down.test.d.ts +2 -0
  57. package/dist/test/drill-down.test.d.ts.map +1 -0
  58. package/dist/test/drill-down.test.js +373 -0
  59. package/dist/test/fixtures/datablending/load-responses.json +261 -0
  60. package/dist/test/granularity.test.d.ts +2 -0
  61. package/dist/test/granularity.test.d.ts.map +1 -0
  62. package/dist/test/granularity.test.js +218 -0
  63. package/dist/test/helpers.d.ts +283 -0
  64. package/dist/test/helpers.d.ts.map +1 -0
  65. package/dist/test/helpers.js +974 -0
  66. package/dist/test/index.test.d.ts +7 -0
  67. package/dist/test/index.test.d.ts.map +1 -0
  68. package/dist/test/index.test.js +370 -0
  69. package/dist/test/table.test.d.ts +2 -0
  70. package/dist/test/table.test.d.ts.map +1 -0
  71. package/dist/test/table.test.js +757 -0
  72. package/dist/test/utils.test.d.ts +2 -0
  73. package/dist/test/utils.test.d.ts.map +1 -0
  74. package/dist/test/utils.test.js +32 -0
  75. package/package.json +26 -21
  76. package/dist/cubejs-client-core.esm.js +0 -1639
  77. package/dist/cubejs-client-core.esm.js.map +0 -1
  78. package/dist/cubejs-client-core.js.map +0 -1
  79. package/index.d.ts +0 -1338
  80. package/src/HttpTransport.js +0 -60
  81. package/src/HttpTransport.test.js +0 -117
  82. package/src/Meta.js +0 -142
  83. package/src/ProgressResult.js +0 -13
  84. package/src/RequestError.js +0 -7
  85. package/src/ResultSet.js +0 -746
  86. package/src/SqlQuery.js +0 -13
  87. package/src/index.js +0 -398
  88. package/src/index.test.js +0 -454
  89. package/src/index.umd.js +0 -8
  90. package/src/tests/ResultSet.test.js +0 -1655
  91. package/src/tests/compare-date-range.test.js +0 -753
  92. package/src/tests/data-blending.test.js +0 -432
  93. package/src/tests/default-heuristics.test.js +0 -118
  94. package/src/tests/drill-down.test.js +0 -402
  95. package/src/tests/fixtures/datablending/load-responses.json +0 -261
  96. package/src/tests/granularity.test.js +0 -225
  97. package/src/tests/table.test.js +0 -791
  98. package/src/tests/utils.test.js +0 -35
  99. package/src/time.js +0 -296
  100. package/src/utils.js +0 -368
@@ -0,0 +1,1725 @@
1
+ /**
2
+ * @license Apache-2.0
3
+ * @copyright Cube Dev, Inc.
4
+ * @fileoverview ResultSet class unit tests.
5
+ */
6
+ /* globals describe,test,expect */
7
+ import 'jest';
8
+ import ResultSet from '../src/ResultSet';
9
+ import { DescriptiveQueryResponse } from './helpers';
10
+ describe('ResultSet', () => {
11
+ describe('timeSeries', () => {
12
+ test('it generates array of dates - granularity month', () => {
13
+ const resultSet = new ResultSet({});
14
+ const timeDimension = {
15
+ dateRange: ['2015-01-01', '2015-12-31'],
16
+ granularity: 'month',
17
+ dimension: 'Events.time'
18
+ };
19
+ const output = [
20
+ '2015-01-01T00:00:00.000',
21
+ '2015-02-01T00:00:00.000',
22
+ '2015-03-01T00:00:00.000',
23
+ '2015-04-01T00:00:00.000',
24
+ '2015-05-01T00:00:00.000',
25
+ '2015-06-01T00:00:00.000',
26
+ '2015-07-01T00:00:00.000',
27
+ '2015-08-01T00:00:00.000',
28
+ '2015-09-01T00:00:00.000',
29
+ '2015-10-01T00:00:00.000',
30
+ '2015-11-01T00:00:00.000',
31
+ '2015-12-01T00:00:00.000'
32
+ ];
33
+ expect(resultSet.timeSeries(timeDimension)).toEqual(output);
34
+ });
35
+ test('it generates array of dates - granularity quarter', () => {
36
+ const resultSet = new ResultSet({});
37
+ const timeDimension = {
38
+ dateRange: ['2015-01-01', '2015-12-31'],
39
+ granularity: 'quarter',
40
+ dimension: 'Events.time'
41
+ };
42
+ const output = [
43
+ '2015-01-01T00:00:00.000',
44
+ '2015-04-01T00:00:00.000',
45
+ '2015-07-01T00:00:00.000',
46
+ '2015-10-01T00:00:00.000',
47
+ ];
48
+ expect(resultSet.timeSeries(timeDimension)).toEqual(output);
49
+ });
50
+ test('it generates array of dates - granularity hour', () => {
51
+ const resultSet = new ResultSet({});
52
+ const timeDimension = {
53
+ dateRange: ['2015-01-01', '2015-01-01'],
54
+ granularity: 'hour',
55
+ dimension: 'Events.time'
56
+ };
57
+ const output = [
58
+ '2015-01-01T00:00:00.000',
59
+ '2015-01-01T01:00:00.000',
60
+ '2015-01-01T02:00:00.000',
61
+ '2015-01-01T03:00:00.000',
62
+ '2015-01-01T04:00:00.000',
63
+ '2015-01-01T05:00:00.000',
64
+ '2015-01-01T06:00:00.000',
65
+ '2015-01-01T07:00:00.000',
66
+ '2015-01-01T08:00:00.000',
67
+ '2015-01-01T09:00:00.000',
68
+ '2015-01-01T10:00:00.000',
69
+ '2015-01-01T11:00:00.000',
70
+ '2015-01-01T12:00:00.000',
71
+ '2015-01-01T13:00:00.000',
72
+ '2015-01-01T14:00:00.000',
73
+ '2015-01-01T15:00:00.000',
74
+ '2015-01-01T16:00:00.000',
75
+ '2015-01-01T17:00:00.000',
76
+ '2015-01-01T18:00:00.000',
77
+ '2015-01-01T19:00:00.000',
78
+ '2015-01-01T20:00:00.000',
79
+ '2015-01-01T21:00:00.000',
80
+ '2015-01-01T22:00:00.000',
81
+ '2015-01-01T23:00:00.000'
82
+ ];
83
+ expect(resultSet.timeSeries(timeDimension)).toEqual(output);
84
+ });
85
+ test('it generates array of dates - granularity hour - not full day', () => {
86
+ const resultSet = new ResultSet({});
87
+ const timeDimension = {
88
+ dateRange: ['2015-01-01T10:30:00.000', '2015-01-01T13:59:00.000'],
89
+ granularity: 'hour',
90
+ dimension: 'Events.time'
91
+ };
92
+ const output = [
93
+ '2015-01-01T10:00:00.000',
94
+ '2015-01-01T11:00:00.000',
95
+ '2015-01-01T12:00:00.000',
96
+ '2015-01-01T13:00:00.000'
97
+ ];
98
+ expect(resultSet.timeSeries(timeDimension)).toEqual(output);
99
+ });
100
+ test('it generates array of dates - custom interval - 1 year, origin - 2020-01-01', () => {
101
+ const resultSet = new ResultSet({});
102
+ const timeDimension = {
103
+ dateRange: ['2021-01-01', '2023-12-31'],
104
+ granularity: 'one_year',
105
+ dimension: 'Events.time'
106
+ };
107
+ const output = [
108
+ '2021-01-01T00:00:00.000',
109
+ '2022-01-01T00:00:00.000',
110
+ '2023-01-01T00:00:00.000'
111
+ ];
112
+ expect(resultSet.timeSeries(timeDimension, 1, {
113
+ 'Events.time.one_year': {
114
+ title: 'Time Dimension',
115
+ shortTitle: 'TD',
116
+ type: 'time',
117
+ granularity: {
118
+ name: '1 year',
119
+ title: '1 year',
120
+ interval: '1 year',
121
+ origin: '2020-01-01',
122
+ },
123
+ },
124
+ })).toEqual(output);
125
+ });
126
+ test('it generates array of dates - custom interval - 1 year, origin - 2025-03-01', () => {
127
+ const resultSet = new ResultSet({});
128
+ const timeDimension = {
129
+ dateRange: ['2021-01-01', '2022-12-31'],
130
+ granularity: 'one_year',
131
+ dimension: 'Events.time'
132
+ };
133
+ const output = [
134
+ '2020-03-01T00:00:00.000',
135
+ '2021-03-01T00:00:00.000',
136
+ '2022-03-01T00:00:00.000',
137
+ ];
138
+ expect(resultSet.timeSeries(timeDimension, 1, {
139
+ 'Events.time.one_year': {
140
+ title: 'Time Dimension',
141
+ shortTitle: 'TD',
142
+ type: 'time',
143
+ granularity: {
144
+ name: '1 year',
145
+ title: '1 year',
146
+ interval: '1 year',
147
+ origin: '2025-03-01',
148
+ },
149
+ },
150
+ })).toEqual(output);
151
+ });
152
+ test('it generates array of dates - custom interval - 1 year, offset - 2 months', () => {
153
+ const resultSet = new ResultSet({});
154
+ const timeDimension = {
155
+ dateRange: ['2021-01-01', '2022-12-31'],
156
+ granularity: 'one_year',
157
+ dimension: 'Events.time'
158
+ };
159
+ const output = [
160
+ '2020-03-01T00:00:00.000',
161
+ '2021-03-01T00:00:00.000',
162
+ '2022-03-01T00:00:00.000',
163
+ ];
164
+ expect(resultSet.timeSeries(timeDimension, 1, {
165
+ 'Events.time.one_year': {
166
+ title: 'Time Dimension',
167
+ shortTitle: 'TD',
168
+ type: 'time',
169
+ granularity: {
170
+ name: '1 year',
171
+ title: '1 year',
172
+ interval: '1 year',
173
+ offset: '2 months',
174
+ },
175
+ },
176
+ })).toEqual(output);
177
+ });
178
+ test('it generates array of dates - custom interval - 2 months, origin - 2019-01-01', () => {
179
+ const resultSet = new ResultSet({});
180
+ const timeDimension = {
181
+ dateRange: ['2021-01-01', '2021-12-31'],
182
+ granularity: 'two_months',
183
+ dimension: 'Events.time'
184
+ };
185
+ const output = [
186
+ '2021-01-01T00:00:00.000',
187
+ '2021-03-01T00:00:00.000',
188
+ '2021-05-01T00:00:00.000',
189
+ '2021-07-01T00:00:00.000',
190
+ '2021-09-01T00:00:00.000',
191
+ '2021-11-01T00:00:00.000',
192
+ ];
193
+ expect(resultSet.timeSeries(timeDimension, 1, {
194
+ 'Events.time.two_months': {
195
+ title: 'Time Dimension',
196
+ shortTitle: 'TD',
197
+ type: 'time',
198
+ granularity: {
199
+ name: '2 months',
200
+ title: '2 months',
201
+ interval: '2 months',
202
+ origin: '2019-01-01',
203
+ },
204
+ },
205
+ })).toEqual(output);
206
+ });
207
+ test('it generates array of dates - custom interval - 2 months, no offset', () => {
208
+ const resultSet = new ResultSet({});
209
+ const timeDimension = {
210
+ dateRange: ['2021-01-01', '2021-12-31'],
211
+ granularity: 'two_months',
212
+ dimension: 'Events.time'
213
+ };
214
+ const output = [
215
+ '2021-01-01T00:00:00.000',
216
+ '2021-03-01T00:00:00.000',
217
+ '2021-05-01T00:00:00.000',
218
+ '2021-07-01T00:00:00.000',
219
+ '2021-09-01T00:00:00.000',
220
+ '2021-11-01T00:00:00.000',
221
+ ];
222
+ expect(resultSet.timeSeries(timeDimension, 1, {
223
+ 'Events.time.two_months': {
224
+ title: 'Time Dimension',
225
+ shortTitle: 'TD',
226
+ type: 'time',
227
+ granularity: {
228
+ name: '2 months',
229
+ title: '2 months',
230
+ interval: '2 months',
231
+ },
232
+ },
233
+ })).toEqual(output);
234
+ });
235
+ test('it generates array of dates - custom interval - 2 months, origin - 2019-03-15', () => {
236
+ const resultSet = new ResultSet({});
237
+ const timeDimension = {
238
+ dateRange: ['2021-01-01', '2021-12-31'],
239
+ granularity: 'two_months',
240
+ dimension: 'Events.time'
241
+ };
242
+ const output = [
243
+ '2020-11-15T00:00:00.000',
244
+ '2021-01-15T00:00:00.000',
245
+ '2021-03-15T00:00:00.000',
246
+ '2021-05-15T00:00:00.000',
247
+ '2021-07-15T00:00:00.000',
248
+ '2021-09-15T00:00:00.000',
249
+ '2021-11-15T00:00:00.000',
250
+ ];
251
+ expect(resultSet.timeSeries(timeDimension, 1, {
252
+ 'Events.time.two_months': {
253
+ title: 'Time Dimension',
254
+ shortTitle: 'TD',
255
+ type: 'time',
256
+ granularity: {
257
+ name: '2 months',
258
+ title: '2 months',
259
+ interval: '2 months',
260
+ origin: '2019-03-15',
261
+ },
262
+ },
263
+ })).toEqual(output);
264
+ });
265
+ test('it generates array of dates - custom interval - 1 months 2 weeks 3 days, origin - 2021-01-25', () => {
266
+ const resultSet = new ResultSet({});
267
+ const timeDimension = {
268
+ dateRange: ['2021-01-01', '2021-12-31'],
269
+ granularity: 'one_mo_two_we_three_d',
270
+ dimension: 'Events.time'
271
+ };
272
+ const output = [
273
+ '2020-12-08T00:00:00.000',
274
+ '2021-01-25T00:00:00.000',
275
+ '2021-03-14T00:00:00.000',
276
+ '2021-05-01T00:00:00.000',
277
+ '2021-06-18T00:00:00.000',
278
+ '2021-08-04T00:00:00.000',
279
+ '2021-09-21T00:00:00.000',
280
+ '2021-11-07T00:00:00.000',
281
+ '2021-12-24T00:00:00.000',
282
+ ];
283
+ expect(resultSet.timeSeries(timeDimension, 1, {
284
+ 'Events.time.one_mo_two_we_three_d': {
285
+ title: 'Time Dimension',
286
+ shortTitle: 'TD',
287
+ type: 'time',
288
+ granularity: {
289
+ name: '1 months 2 weeks 3 days',
290
+ title: '1 months 2 weeks 3 days',
291
+ interval: '1 months 2 weeks 3 days',
292
+ origin: '2021-01-25',
293
+ },
294
+ },
295
+ })).toEqual(output);
296
+ });
297
+ test('it generates array of dates - custom interval - 3 weeks, origin - 2020-12-15', () => {
298
+ const resultSet = new ResultSet({});
299
+ const timeDimension = {
300
+ dateRange: ['2021-01-01', '2021-03-01'],
301
+ granularity: 'three_weeks',
302
+ dimension: 'Events.time'
303
+ };
304
+ const output = [
305
+ '2020-12-15T00:00:00.000',
306
+ '2021-01-05T00:00:00.000',
307
+ '2021-01-26T00:00:00.000',
308
+ '2021-02-16T00:00:00.000',
309
+ ];
310
+ expect(resultSet.timeSeries(timeDimension, 1, {
311
+ 'Events.time.three_weeks': {
312
+ title: 'Time Dimension',
313
+ shortTitle: 'TD',
314
+ type: 'time',
315
+ granularity: {
316
+ name: '3 weeks',
317
+ title: '3 weeks',
318
+ interval: '3 weeks',
319
+ origin: '2020-12-15',
320
+ },
321
+ },
322
+ })).toEqual(output);
323
+ });
324
+ test('it generates array of dates - custom interval - 2 months 3 weeks 4 days 5 hours 6 minutes 7 seconds, origin - 2021-01-01', () => {
325
+ const resultSet = new ResultSet({});
326
+ const timeDimension = {
327
+ dateRange: ['2021-01-01', '2021-12-31'],
328
+ granularity: 'two_mo_3w_4d_5h_6m_7s',
329
+ dimension: 'Events.time'
330
+ };
331
+ const output = [
332
+ '2021-01-01T00:00:00.000',
333
+ '2021-03-26T05:06:07.000',
334
+ '2021-06-20T10:12:14.000',
335
+ '2021-09-14T15:18:21.000',
336
+ '2021-12-09T20:24:28.000',
337
+ ];
338
+ expect(resultSet.timeSeries(timeDimension, 1, {
339
+ 'Events.time.two_mo_3w_4d_5h_6m_7s': {
340
+ title: 'Time Dimension',
341
+ shortTitle: 'TD',
342
+ type: 'time',
343
+ granularity: {
344
+ name: 'two_mo_3w_4d_5h_6m_7s',
345
+ title: 'two_mo_3w_4d_5h_6m_7s',
346
+ interval: '2 months 3 weeks 4 days 5 hours 6 minutes 7 seconds',
347
+ origin: '2021-01-01',
348
+ },
349
+ },
350
+ })).toEqual(output);
351
+ });
352
+ test('it generates array of dates - custom interval - 10 minutes 15 seconds, origin - 2021-02-01 09:59:45', () => {
353
+ const resultSet = new ResultSet({});
354
+ const timeDimension = {
355
+ dateRange: ['2021-02-01 10:00:00', '2021-02-01 12:00:00'],
356
+ granularity: 'ten_min_fifteen_sec',
357
+ dimension: 'Events.time'
358
+ };
359
+ const output = [
360
+ '2021-02-01T09:59:45.000',
361
+ '2021-02-01T10:10:00.000',
362
+ '2021-02-01T10:20:15.000',
363
+ '2021-02-01T10:30:30.000',
364
+ '2021-02-01T10:40:45.000',
365
+ '2021-02-01T10:51:00.000',
366
+ '2021-02-01T11:01:15.000',
367
+ '2021-02-01T11:11:30.000',
368
+ '2021-02-01T11:21:45.000',
369
+ '2021-02-01T11:32:00.000',
370
+ '2021-02-01T11:42:15.000',
371
+ '2021-02-01T11:52:30.000',
372
+ ];
373
+ expect(resultSet.timeSeries(timeDimension, 1, {
374
+ 'Events.time.ten_min_fifteen_sec': {
375
+ title: 'Time Dimension',
376
+ shortTitle: 'TD',
377
+ type: 'time',
378
+ granularity: {
379
+ name: '10 minutes 15 seconds',
380
+ title: '10 minutes 15 seconds',
381
+ interval: '10 minutes 15 seconds',
382
+ origin: '2021-02-01 09:59:45',
383
+ },
384
+ },
385
+ })).toEqual(output);
386
+ });
387
+ });
388
+ describe('chartPivot', () => {
389
+ test('String field', () => {
390
+ const resultSet = new ResultSet({
391
+ query: {
392
+ measures: ['Foo.count'],
393
+ dimensions: ['Foo.name'],
394
+ filters: [],
395
+ timezone: 'UTC',
396
+ timeDimensions: []
397
+ },
398
+ data: [
399
+ {
400
+ 'Foo.name': 'Name 1',
401
+ 'Foo.count': 'Some string'
402
+ }
403
+ ],
404
+ lastRefreshTime: '2020-03-18T13:41:04.436Z',
405
+ usedPreAggregations: {},
406
+ annotation: {
407
+ measures: {
408
+ 'Foo.count': {
409
+ title: 'Foo Count',
410
+ shortTitle: 'Count',
411
+ type: 'number'
412
+ }
413
+ },
414
+ dimensions: {
415
+ 'Foo.name': {
416
+ title: 'Foo Name',
417
+ shortTitle: 'Name',
418
+ type: 'string'
419
+ }
420
+ },
421
+ segments: {},
422
+ timeDimensions: {}
423
+ }
424
+ });
425
+ expect(resultSet.chartPivot()).toEqual([
426
+ {
427
+ x: 'Name 1',
428
+ 'Foo.count': 'Some string',
429
+ xValues: [
430
+ 'Name 1'
431
+ ],
432
+ }
433
+ ]);
434
+ });
435
+ test('Null field', () => {
436
+ const resultSet = new ResultSet({
437
+ query: {
438
+ measures: ['Foo.count'],
439
+ dimensions: ['Foo.name'],
440
+ filters: [],
441
+ timezone: 'UTC',
442
+ timeDimensions: []
443
+ },
444
+ data: [
445
+ {
446
+ 'Foo.name': 'Name 1',
447
+ 'Foo.count': null
448
+ }
449
+ ],
450
+ lastRefreshTime: '2020-03-18T13:41:04.436Z',
451
+ usedPreAggregations: {},
452
+ annotation: {
453
+ measures: {
454
+ 'Foo.count': {
455
+ title: 'Foo Count',
456
+ shortTitle: 'Count',
457
+ type: 'number'
458
+ }
459
+ },
460
+ dimensions: {
461
+ 'Foo.name': {
462
+ title: 'Foo Name',
463
+ shortTitle: 'Name',
464
+ type: 'string'
465
+ }
466
+ },
467
+ segments: {},
468
+ timeDimensions: {}
469
+ }
470
+ });
471
+ expect(resultSet.chartPivot()).toEqual([
472
+ {
473
+ x: 'Name 1',
474
+ 'Foo.count': 0,
475
+ xValues: [
476
+ 'Name 1'
477
+ ],
478
+ }
479
+ ]);
480
+ });
481
+ test('Empty field', () => {
482
+ const resultSet = new ResultSet({
483
+ query: {
484
+ measures: ['Foo.count'],
485
+ dimensions: ['Foo.name'],
486
+ filters: [],
487
+ timezone: 'UTC',
488
+ timeDimensions: []
489
+ },
490
+ data: [
491
+ {
492
+ 'Foo.name': 'Name 1',
493
+ 'Foo.count': undefined
494
+ }
495
+ ],
496
+ lastRefreshTime: '2020-03-18T13:41:04.436Z',
497
+ usedPreAggregations: {},
498
+ annotation: {
499
+ measures: {
500
+ 'Foo.count': {
501
+ title: 'Foo Count',
502
+ shortTitle: 'Count',
503
+ type: 'number'
504
+ }
505
+ },
506
+ dimensions: {
507
+ 'Foo.name': {
508
+ title: 'Foo Name',
509
+ shortTitle: 'Name',
510
+ type: 'string'
511
+ }
512
+ },
513
+ segments: {},
514
+ timeDimensions: {}
515
+ }
516
+ });
517
+ expect(resultSet.chartPivot()).toEqual([
518
+ {
519
+ x: 'Name 1',
520
+ 'Foo.count': 0,
521
+ xValues: [
522
+ 'Name 1'
523
+ ],
524
+ }
525
+ ]);
526
+ });
527
+ test('Number field', () => {
528
+ const resultSet = new ResultSet({
529
+ query: {
530
+ measures: ['Foo.count'],
531
+ dimensions: ['Foo.name'],
532
+ filters: [],
533
+ timezone: 'UTC',
534
+ timeDimensions: []
535
+ },
536
+ data: [
537
+ {
538
+ 'Foo.name': 'Name 1',
539
+ 'Foo.count': '10'
540
+ }
541
+ ],
542
+ lastRefreshTime: '2020-03-18T13:41:04.436Z',
543
+ usedPreAggregations: {},
544
+ annotation: {
545
+ measures: {
546
+ 'Foo.count': {
547
+ title: 'Foo Count',
548
+ shortTitle: 'Count',
549
+ type: 'number'
550
+ }
551
+ },
552
+ dimensions: {
553
+ 'Foo.name': {
554
+ title: 'Foo Name',
555
+ shortTitle: 'Name',
556
+ type: 'string'
557
+ }
558
+ },
559
+ segments: {},
560
+ timeDimensions: {}
561
+ }
562
+ });
563
+ expect(resultSet.chartPivot()).toEqual([
564
+ {
565
+ x: 'Name 1',
566
+ 'Foo.count': 10,
567
+ xValues: [
568
+ 'Name 1'
569
+ ],
570
+ }
571
+ ]);
572
+ });
573
+ test('time field results', () => {
574
+ const resultSet = new ResultSet({
575
+ query: {
576
+ measures: ['Foo.latestRun'],
577
+ dimensions: ['Foo.name'],
578
+ filters: [],
579
+ timezone: 'UTC',
580
+ timeDimensions: []
581
+ },
582
+ data: [
583
+ {
584
+ 'Foo.name': 'Name 1',
585
+ 'Foo.latestRun': '2020-03-11T18:06:09.403Z'
586
+ }
587
+ ],
588
+ lastRefreshTime: '2020-03-18T13:41:04.436Z',
589
+ usedPreAggregations: {},
590
+ annotation: {
591
+ measures: {
592
+ 'Foo.latestRun': {
593
+ title: 'Foo Latest Run',
594
+ shortTitle: 'Latest Run',
595
+ type: 'number'
596
+ }
597
+ },
598
+ dimensions: {
599
+ 'Foo.name': {
600
+ title: 'Foo Name',
601
+ shortTitle: 'Name',
602
+ type: 'string'
603
+ }
604
+ },
605
+ segments: {},
606
+ timeDimensions: {}
607
+ }
608
+ }, { parseDateMeasures: true });
609
+ expect(resultSet.chartPivot()).toEqual([
610
+ {
611
+ x: 'Name 1',
612
+ 'Foo.latestRun': new Date('2020-03-11T18:06:09.403Z'),
613
+ xValues: [
614
+ 'Name 1'
615
+ ],
616
+ }
617
+ ]);
618
+ });
619
+ });
620
+ test('tableColumns', () => {
621
+ const resultSet = new ResultSet(DescriptiveQueryResponse);
622
+ expect(resultSet.tableColumns()).toEqual([
623
+ {
624
+ dataIndex: 'base_orders.created_at.month',
625
+ format: undefined,
626
+ key: 'base_orders.created_at.month',
627
+ meta: undefined,
628
+ shortTitle: 'Created at',
629
+ title: 'Base Orders Created at',
630
+ type: 'time',
631
+ },
632
+ {
633
+ dataIndex: 'base_orders.status',
634
+ format: undefined,
635
+ key: 'base_orders.status',
636
+ meta: {
637
+ addDesc: 'The status of order',
638
+ moreNum: 42,
639
+ },
640
+ shortTitle: 'Status',
641
+ title: 'Base Orders Status',
642
+ type: 'string',
643
+ },
644
+ {
645
+ dataIndex: 'base_orders.count',
646
+ format: undefined,
647
+ key: 'base_orders.count',
648
+ meta: undefined,
649
+ shortTitle: 'Count',
650
+ title: 'Base Orders Count',
651
+ type: 'number',
652
+ },
653
+ ]);
654
+ });
655
+ test('totalRow', () => {
656
+ const resultSet = new ResultSet(DescriptiveQueryResponse);
657
+ expect(resultSet.totalRow()).toEqual({
658
+ 'completed,base_orders.count': 2,
659
+ 'processing,base_orders.count': 0,
660
+ 'shipped,base_orders.count': 0,
661
+ x: '2023-04-01T00:00:00.000',
662
+ xValues: [
663
+ '2023-04-01T00:00:00.000',
664
+ ],
665
+ });
666
+ });
667
+ test('pivotQuery', () => {
668
+ const resultSet = new ResultSet(DescriptiveQueryResponse);
669
+ expect(resultSet.pivotQuery()).toEqual(DescriptiveQueryResponse.pivotQuery);
670
+ });
671
+ test('totalRows', () => {
672
+ const resultSet = new ResultSet(DescriptiveQueryResponse);
673
+ expect(resultSet.totalRows()).toEqual(19);
674
+ });
675
+ test('rawData', () => {
676
+ const resultSet = new ResultSet(DescriptiveQueryResponse);
677
+ expect(resultSet.rawData()).toEqual(DescriptiveQueryResponse.results[0].data);
678
+ });
679
+ test('annotation', () => {
680
+ const resultSet = new ResultSet(DescriptiveQueryResponse);
681
+ expect(resultSet.annotation()).toEqual(DescriptiveQueryResponse.results[0].annotation);
682
+ });
683
+ test('categories', () => {
684
+ const resultSet = new ResultSet(DescriptiveQueryResponse);
685
+ expect(resultSet.categories()).toEqual([
686
+ {
687
+ 'completed,base_orders.count': 2,
688
+ 'processing,base_orders.count': 0,
689
+ 'shipped,base_orders.count': 0,
690
+ x: '2023-04-01T00:00:00.000',
691
+ xValues: [
692
+ '2023-04-01T00:00:00.000',
693
+ ],
694
+ },
695
+ {
696
+ 'completed,base_orders.count': 6,
697
+ 'processing,base_orders.count': 6,
698
+ 'shipped,base_orders.count': 9,
699
+ x: '2023-05-01T00:00:00.000',
700
+ xValues: [
701
+ '2023-05-01T00:00:00.000',
702
+ ],
703
+ },
704
+ {
705
+ 'completed,base_orders.count': 5,
706
+ 'processing,base_orders.count': 5,
707
+ 'shipped,base_orders.count': 13,
708
+ x: '2023-06-01T00:00:00.000',
709
+ xValues: [
710
+ '2023-06-01T00:00:00.000',
711
+ ],
712
+ },
713
+ {
714
+ 'completed,base_orders.count': 5,
715
+ 'processing,base_orders.count': 7,
716
+ 'shipped,base_orders.count': 5,
717
+ x: '2023-07-01T00:00:00.000',
718
+ xValues: [
719
+ '2023-07-01T00:00:00.000',
720
+ ],
721
+ },
722
+ {
723
+ 'completed,base_orders.count': 11,
724
+ 'processing,base_orders.count': 3,
725
+ 'shipped,base_orders.count': 4,
726
+ x: '2023-08-01T00:00:00.000',
727
+ xValues: [
728
+ '2023-08-01T00:00:00.000',
729
+ ],
730
+ },
731
+ {
732
+ 'completed,base_orders.count': 5,
733
+ 'processing,base_orders.count': 10,
734
+ 'shipped,base_orders.count': 9,
735
+ x: '2023-09-01T00:00:00.000',
736
+ xValues: [
737
+ '2023-09-01T00:00:00.000',
738
+ ],
739
+ },
740
+ {
741
+ 'completed,base_orders.count': 4,
742
+ 'processing,base_orders.count': 5,
743
+ 'shipped,base_orders.count': 9,
744
+ x: '2023-10-01T00:00:00.000',
745
+ xValues: [
746
+ '2023-10-01T00:00:00.000',
747
+ ],
748
+ },
749
+ ]);
750
+ });
751
+ test('serialize/deserialize', () => {
752
+ const resultSet = new ResultSet(DescriptiveQueryResponse);
753
+ const serialized = resultSet.serialize();
754
+ const restoredResultSet = ResultSet.deserialize(serialized);
755
+ expect(restoredResultSet).toEqual(resultSet);
756
+ });
757
+ describe('seriesNames', () => {
758
+ test('Multiple series with custom alias', () => {
759
+ const resultSet = new ResultSet({
760
+ queryType: 'blendingQuery',
761
+ results: [
762
+ {
763
+ query: {
764
+ measures: ['Users.count'],
765
+ timeDimensions: [
766
+ {
767
+ dimension: 'Users.ts',
768
+ granularity: 'month',
769
+ dateRange: ['2020-07-01T00:00:00.000', '2020-11-01T00:00:00.000'],
770
+ },
771
+ ],
772
+ filters: [],
773
+ order: [],
774
+ dimensions: [],
775
+ },
776
+ data: [
777
+ {
778
+ 'Users.ts.month': '2020-08-01T00:00:00.000',
779
+ 'Users.ts': '2020-08-01T00:00:00.000',
780
+ 'Users.count': 14,
781
+ 'time.month': '2020-08-01T00:00:00.000',
782
+ },
783
+ ],
784
+ annotation: {
785
+ measures: {
786
+ 'Users.count': {
787
+ title: 'Users Count',
788
+ shortTitle: 'Count',
789
+ type: 'number',
790
+ drillMembers: ['Users.id', 'Users.name'],
791
+ drillMembersGrouped: {
792
+ measures: [],
793
+ dimensions: ['Users.id', 'Users.name'],
794
+ },
795
+ },
796
+ },
797
+ dimensions: {},
798
+ segments: {},
799
+ timeDimensions: {
800
+ 'Users.ts.month': { title: 'Users Ts', shortTitle: 'Ts', type: 'time' },
801
+ 'Users.ts': { title: 'Users Ts', shortTitle: 'Ts', type: 'time' },
802
+ },
803
+ },
804
+ },
805
+ {
806
+ query: {
807
+ measures: ['Users.count'],
808
+ timeDimensions: [
809
+ {
810
+ dimension: 'Users.ts',
811
+ granularity: 'month',
812
+ dateRange: ['2020-07-01T00:00:00.000', '2020-11-01T00:00:00.000'],
813
+ },
814
+ ],
815
+ filters: [
816
+ {
817
+ member: 'Users.country',
818
+ operator: 'equals',
819
+ value: ['USA'],
820
+ },
821
+ ],
822
+ order: [],
823
+ },
824
+ data: [
825
+ {
826
+ 'Users.ts.month': '2020-08-01T00:00:00.000',
827
+ 'Users.ts': '2020-08-01T00:00:00.000',
828
+ 'Users.count': 2,
829
+ 'time.month': '2020-08-01T00:00:00.000',
830
+ },
831
+ ],
832
+ annotation: {
833
+ measures: {
834
+ 'Users.count': {
835
+ title: 'Users Count',
836
+ shortTitle: 'Count',
837
+ type: 'number',
838
+ drillMembers: [],
839
+ drillMembersGrouped: {
840
+ measures: [],
841
+ dimensions: [],
842
+ },
843
+ },
844
+ },
845
+ dimensions: {},
846
+ segments: {},
847
+ timeDimensions: {
848
+ 'Users.ts.month': { title: 'Users Ts', shortTitle: 'Ts', type: 'time' },
849
+ 'Users.ts': { title: 'Users Ts', shortTitle: 'Ts', type: 'time' },
850
+ },
851
+ },
852
+ },
853
+ ],
854
+ pivotQuery: {
855
+ measures: ['Users.count', 'Users.count'],
856
+ timeDimensions: [
857
+ {
858
+ dimension: 'time',
859
+ granularity: 'month',
860
+ dateRange: ['2020-07-01T00:00:00.000', '2020-11-01T00:00:00.000'],
861
+ },
862
+ ],
863
+ dimensions: [],
864
+ },
865
+ });
866
+ expect(resultSet.seriesNames({ aliasSeries: ['one', 'two'] })).toEqual([
867
+ {
868
+ key: 'one,Users.count',
869
+ title: 'one, Users Count',
870
+ shortTitle: 'one, Count',
871
+ yValues: ['Users.count'],
872
+ },
873
+ {
874
+ key: 'two,Users.count',
875
+ title: 'two, Users Count',
876
+ shortTitle: 'two, Count',
877
+ yValues: ['Users.count'],
878
+ },
879
+ ]);
880
+ });
881
+ test('Multiple series with same measure', () => {
882
+ const resultSet = new ResultSet({
883
+ queryType: 'blendingQuery',
884
+ results: [
885
+ {
886
+ query: {
887
+ measures: ['Users.count'],
888
+ timeDimensions: [
889
+ {
890
+ dimension: 'Users.ts',
891
+ granularity: 'month',
892
+ dateRange: ['2020-07-01T00:00:00.000', '2020-11-01T00:00:00.000'],
893
+ },
894
+ ],
895
+ filters: [],
896
+ order: [],
897
+ dimensions: [],
898
+ },
899
+ data: [
900
+ {
901
+ 'Users.ts.month': '2020-08-01T00:00:00.000',
902
+ 'Users.ts': '2020-08-01T00:00:00.000',
903
+ 'Users.count': 14,
904
+ 'time.month': '2020-08-01T00:00:00.000',
905
+ },
906
+ ],
907
+ annotation: {
908
+ measures: {
909
+ 'Users.count': {
910
+ title: 'Users Count',
911
+ shortTitle: 'Count',
912
+ type: 'number',
913
+ drillMembers: ['Users.id', 'Users.name'],
914
+ drillMembersGrouped: {
915
+ measures: [],
916
+ dimensions: ['Users.id', 'Users.name'],
917
+ },
918
+ },
919
+ },
920
+ dimensions: {},
921
+ segments: {},
922
+ timeDimensions: {
923
+ 'Users.ts.month': { title: 'Users Ts', shortTitle: 'Ts', type: 'time' },
924
+ 'Users.ts': { title: 'Users Ts', shortTitle: 'Ts', type: 'time' },
925
+ },
926
+ },
927
+ },
928
+ {
929
+ query: {
930
+ measures: ['Users.count'],
931
+ timeDimensions: [
932
+ {
933
+ dimension: 'Users.ts',
934
+ granularity: 'month',
935
+ dateRange: ['2020-07-01T00:00:00.000', '2020-11-01T00:00:00.000'],
936
+ },
937
+ ],
938
+ filters: [
939
+ {
940
+ member: 'Users.country',
941
+ operator: 'equals',
942
+ value: ['USA'],
943
+ },
944
+ ],
945
+ order: [],
946
+ },
947
+ data: [
948
+ {
949
+ 'Users.ts.month': '2020-08-01T00:00:00.000',
950
+ 'Users.ts': '2020-08-01T00:00:00.000',
951
+ 'Users.count': 2,
952
+ 'time.month': '2020-08-01T00:00:00.000',
953
+ },
954
+ ],
955
+ annotation: {
956
+ measures: {
957
+ 'Users.count': {
958
+ title: 'Users Count',
959
+ shortTitle: 'Count',
960
+ type: 'number',
961
+ drillMembers: [],
962
+ drillMembersGrouped: {
963
+ measures: [],
964
+ dimensions: [],
965
+ },
966
+ },
967
+ },
968
+ dimensions: {},
969
+ segments: {},
970
+ timeDimensions: {
971
+ 'Users.ts.month': { title: 'Users Ts', shortTitle: 'Ts', type: 'time' },
972
+ 'Users.ts': { title: 'Users Ts', shortTitle: 'Ts', type: 'time' },
973
+ },
974
+ },
975
+ },
976
+ ],
977
+ pivotQuery: {
978
+ measures: ['Users.count', 'Users.count'],
979
+ timeDimensions: [
980
+ {
981
+ dimension: 'time',
982
+ granularity: 'month',
983
+ dateRange: ['2020-07-01T00:00:00.000', '2020-11-01T00:00:00.000'],
984
+ },
985
+ ],
986
+ dimensions: [],
987
+ },
988
+ });
989
+ expect(resultSet.seriesNames()).toEqual([
990
+ {
991
+ key: '0,Users.count',
992
+ title: '0, Users Count',
993
+ shortTitle: '0, Count',
994
+ yValues: ['Users.count'],
995
+ },
996
+ {
997
+ key: '1,Users.count',
998
+ title: '1, Users Count',
999
+ shortTitle: '1, Count',
1000
+ yValues: ['Users.count'],
1001
+ },
1002
+ ]);
1003
+ });
1004
+ });
1005
+ describe('normalizePivotConfig', () => {
1006
+ test('fills missing x, y', () => {
1007
+ const resultSet = new ResultSet({
1008
+ query: {
1009
+ dimensions: ['Foo.bar'],
1010
+ timeDimensions: [
1011
+ {
1012
+ granularity: 'day',
1013
+ dimension: 'Foo.createdAt'
1014
+ }
1015
+ ]
1016
+ }
1017
+ });
1018
+ expect(resultSet.normalizePivotConfig({ y: ['Foo.bar'] })).toEqual({
1019
+ x: ['Foo.createdAt.day'],
1020
+ y: ['Foo.bar'],
1021
+ fillMissingDates: true,
1022
+ joinDateRange: false
1023
+ });
1024
+ });
1025
+ test('time dimensions with granularity passed without', () => {
1026
+ const resultSet = new ResultSet({
1027
+ query: {
1028
+ dimensions: ['Foo.bar'],
1029
+ timeDimensions: [
1030
+ {
1031
+ granularity: 'day',
1032
+ dimension: 'Foo.createdAt'
1033
+ }
1034
+ ]
1035
+ }
1036
+ });
1037
+ expect(resultSet.normalizePivotConfig({ x: ['Foo.createdAt'], y: ['Foo.bar'] })).toEqual({
1038
+ x: ['Foo.createdAt.day'],
1039
+ y: ['Foo.bar'],
1040
+ fillMissingDates: true,
1041
+ joinDateRange: false
1042
+ });
1043
+ });
1044
+ test('double time dimensions without granularity', () => {
1045
+ const resultSet = new ResultSet({
1046
+ query: {
1047
+ measures: [],
1048
+ timeDimensions: [
1049
+ {
1050
+ dimension: 'Orders.createdAt',
1051
+ dateRange: ['2020-01-08T00:00:00.000', '2020-01-14T23:59:59.999']
1052
+ }
1053
+ ],
1054
+ dimensions: ['Orders.createdAt'],
1055
+ filters: [],
1056
+ timezone: 'UTC'
1057
+ }
1058
+ });
1059
+ expect(resultSet.normalizePivotConfig(resultSet.normalizePivotConfig({}))).toEqual({
1060
+ x: ['Orders.createdAt'],
1061
+ y: [],
1062
+ fillMissingDates: true,
1063
+ joinDateRange: false
1064
+ });
1065
+ });
1066
+ test('single time dimensions with granularity', () => {
1067
+ const resultSet = new ResultSet({
1068
+ query: {
1069
+ measures: [],
1070
+ timeDimensions: [
1071
+ {
1072
+ dimension: 'Orders.createdAt',
1073
+ granularity: 'day',
1074
+ dateRange: ['2020-01-08T00:00:00.000', '2020-01-09T23:59:59.999']
1075
+ }
1076
+ ],
1077
+ filters: [],
1078
+ timezone: 'UTC'
1079
+ }
1080
+ });
1081
+ expect(resultSet.normalizePivotConfig(resultSet.normalizePivotConfig())).toEqual({
1082
+ x: ['Orders.createdAt.day'],
1083
+ y: [],
1084
+ fillMissingDates: true,
1085
+ joinDateRange: false
1086
+ });
1087
+ });
1088
+ test('double time dimensions with granularity', () => {
1089
+ const resultSet = new ResultSet({
1090
+ query: {
1091
+ measures: [],
1092
+ timeDimensions: [
1093
+ {
1094
+ dimension: 'Orders.createdAt',
1095
+ granularity: 'day',
1096
+ dateRange: ['2020-01-08T00:00:00.000', '2020-01-14T23:59:59.999']
1097
+ }
1098
+ ],
1099
+ dimensions: ['Orders.createdAt'],
1100
+ filters: [],
1101
+ timezone: 'UTC'
1102
+ }
1103
+ });
1104
+ expect(resultSet.normalizePivotConfig(resultSet.normalizePivotConfig({}))).toEqual({
1105
+ x: ['Orders.createdAt.day', 'Orders.createdAt'],
1106
+ y: [],
1107
+ fillMissingDates: true,
1108
+ joinDateRange: false
1109
+ });
1110
+ });
1111
+ });
1112
+ describe('pivot', () => {
1113
+ test('same dimension and time dimension', () => {
1114
+ const resultSet = new ResultSet({
1115
+ query: {
1116
+ measures: [],
1117
+ timeDimensions: [
1118
+ {
1119
+ dimension: 'Orders.createdAt',
1120
+ granularity: 'day',
1121
+ dateRange: ['2020-01-08T00:00:00.000', '2020-01-14T23:59:59.999']
1122
+ }
1123
+ ],
1124
+ dimensions: ['Orders.createdAt'],
1125
+ filters: [],
1126
+ timezone: 'UTC'
1127
+ },
1128
+ data: [
1129
+ {
1130
+ 'Orders.createdAt': '2020-01-08T17:04:43.000',
1131
+ 'Orders.createdAt.day': '2020-01-08T00:00:00.000'
1132
+ },
1133
+ {
1134
+ 'Orders.createdAt': '2020-01-08T19:28:26.000',
1135
+ 'Orders.createdAt.day': '2020-01-08T00:00:00.000'
1136
+ },
1137
+ {
1138
+ 'Orders.createdAt': '2020-01-09T00:13:01.000',
1139
+ 'Orders.createdAt.day': '2020-01-09T00:00:00.000'
1140
+ },
1141
+ {
1142
+ 'Orders.createdAt': '2020-01-09T00:25:32.000',
1143
+ 'Orders.createdAt.day': '2020-01-09T00:00:00.000'
1144
+ },
1145
+ {
1146
+ 'Orders.createdAt': '2020-01-09T00:43:11.000',
1147
+ 'Orders.createdAt.day': '2020-01-09T00:00:00.000'
1148
+ },
1149
+ {
1150
+ 'Orders.createdAt': '2020-01-09T03:04:00.000',
1151
+ 'Orders.createdAt.day': '2020-01-09T00:00:00.000'
1152
+ },
1153
+ {
1154
+ 'Orders.createdAt': '2020-01-09T04:30:10.000',
1155
+ 'Orders.createdAt.day': '2020-01-09T00:00:00.000'
1156
+ },
1157
+ {
1158
+ 'Orders.createdAt': '2020-01-09T10:25:04.000',
1159
+ 'Orders.createdAt.day': '2020-01-09T00:00:00.000'
1160
+ },
1161
+ {
1162
+ 'Orders.createdAt': '2020-01-09T19:47:19.000',
1163
+ 'Orders.createdAt.day': '2020-01-09T00:00:00.000'
1164
+ },
1165
+ {
1166
+ 'Orders.createdAt': '2020-01-09T19:48:04.000',
1167
+ 'Orders.createdAt.day': '2020-01-09T00:00:00.000'
1168
+ },
1169
+ {
1170
+ 'Orders.createdAt': '2020-01-09T21:46:24.000',
1171
+ 'Orders.createdAt.day': '2020-01-09T00:00:00.000'
1172
+ },
1173
+ {
1174
+ 'Orders.createdAt': '2020-01-09T23:49:37.000',
1175
+ 'Orders.createdAt.day': '2020-01-09T00:00:00.000'
1176
+ },
1177
+ {
1178
+ 'Orders.createdAt': '2020-01-10T09:07:20.000',
1179
+ 'Orders.createdAt.day': '2020-01-10T00:00:00.000'
1180
+ },
1181
+ {
1182
+ 'Orders.createdAt': '2020-01-10T13:50:05.000',
1183
+ 'Orders.createdAt.day': '2020-01-10T00:00:00.000'
1184
+ },
1185
+ {
1186
+ 'Orders.createdAt': '2020-01-10T15:30:32.000',
1187
+ 'Orders.createdAt.day': '2020-01-10T00:00:00.000'
1188
+ },
1189
+ {
1190
+ 'Orders.createdAt': '2020-01-10T15:32:52.000',
1191
+ 'Orders.createdAt.day': '2020-01-10T00:00:00.000'
1192
+ },
1193
+ {
1194
+ 'Orders.createdAt': '2020-01-10T18:55:23.000',
1195
+ 'Orders.createdAt.day': '2020-01-10T00:00:00.000'
1196
+ },
1197
+ {
1198
+ 'Orders.createdAt': '2020-01-11T01:13:17.000',
1199
+ 'Orders.createdAt.day': '2020-01-11T00:00:00.000'
1200
+ },
1201
+ {
1202
+ 'Orders.createdAt': '2020-01-11T09:17:40.000',
1203
+ 'Orders.createdAt.day': '2020-01-11T00:00:00.000'
1204
+ },
1205
+ {
1206
+ 'Orders.createdAt': '2020-01-11T13:23:03.000',
1207
+ 'Orders.createdAt.day': '2020-01-11T00:00:00.000'
1208
+ },
1209
+ {
1210
+ 'Orders.createdAt': '2020-01-11T17:28:42.000',
1211
+ 'Orders.createdAt.day': '2020-01-11T00:00:00.000'
1212
+ },
1213
+ {
1214
+ 'Orders.createdAt': '2020-01-11T22:34:32.000',
1215
+ 'Orders.createdAt.day': '2020-01-11T00:00:00.000'
1216
+ },
1217
+ {
1218
+ 'Orders.createdAt': '2020-01-11T23:03:58.000',
1219
+ 'Orders.createdAt.day': '2020-01-11T00:00:00.000'
1220
+ },
1221
+ {
1222
+ 'Orders.createdAt': '2020-01-12T03:46:25.000',
1223
+ 'Orders.createdAt.day': '2020-01-12T00:00:00.000'
1224
+ },
1225
+ {
1226
+ 'Orders.createdAt': '2020-01-12T09:57:10.000',
1227
+ 'Orders.createdAt.day': '2020-01-12T00:00:00.000'
1228
+ },
1229
+ {
1230
+ 'Orders.createdAt': '2020-01-12T12:28:22.000',
1231
+ 'Orders.createdAt.day': '2020-01-12T00:00:00.000'
1232
+ },
1233
+ {
1234
+ 'Orders.createdAt': '2020-01-12T14:34:20.000',
1235
+ 'Orders.createdAt.day': '2020-01-12T00:00:00.000'
1236
+ },
1237
+ {
1238
+ 'Orders.createdAt': '2020-01-12T18:45:15.000',
1239
+ 'Orders.createdAt.day': '2020-01-12T00:00:00.000'
1240
+ },
1241
+ {
1242
+ 'Orders.createdAt': '2020-01-12T19:38:05.000',
1243
+ 'Orders.createdAt.day': '2020-01-12T00:00:00.000'
1244
+ },
1245
+ {
1246
+ 'Orders.createdAt': '2020-01-12T21:43:51.000',
1247
+ 'Orders.createdAt.day': '2020-01-12T00:00:00.000'
1248
+ },
1249
+ {
1250
+ 'Orders.createdAt': '2020-01-13T01:42:49.000',
1251
+ 'Orders.createdAt.day': '2020-01-13T00:00:00.000'
1252
+ },
1253
+ {
1254
+ 'Orders.createdAt': '2020-01-13T03:19:22.000',
1255
+ 'Orders.createdAt.day': '2020-01-13T00:00:00.000'
1256
+ },
1257
+ {
1258
+ 'Orders.createdAt': '2020-01-13T05:20:50.000',
1259
+ 'Orders.createdAt.day': '2020-01-13T00:00:00.000'
1260
+ },
1261
+ {
1262
+ 'Orders.createdAt': '2020-01-13T05:46:35.000',
1263
+ 'Orders.createdAt.day': '2020-01-13T00:00:00.000'
1264
+ },
1265
+ {
1266
+ 'Orders.createdAt': '2020-01-13T11:24:01.000',
1267
+ 'Orders.createdAt.day': '2020-01-13T00:00:00.000'
1268
+ },
1269
+ {
1270
+ 'Orders.createdAt': '2020-01-13T12:13:42.000',
1271
+ 'Orders.createdAt.day': '2020-01-13T00:00:00.000'
1272
+ },
1273
+ {
1274
+ 'Orders.createdAt': '2020-01-13T20:21:59.000',
1275
+ 'Orders.createdAt.day': '2020-01-13T00:00:00.000'
1276
+ },
1277
+ {
1278
+ 'Orders.createdAt': '2020-01-14T20:16:23.000',
1279
+ 'Orders.createdAt.day': '2020-01-14T00:00:00.000'
1280
+ }
1281
+ ],
1282
+ annotation: {
1283
+ measures: {},
1284
+ dimensions: {
1285
+ 'Orders.createdAt': {
1286
+ title: 'Orders Created at',
1287
+ shortTitle: 'Created at',
1288
+ type: 'time'
1289
+ }
1290
+ },
1291
+ segments: {},
1292
+ timeDimensions: {
1293
+ 'Orders.createdAt.day': {
1294
+ title: 'Orders Created at',
1295
+ shortTitle: 'Created at',
1296
+ type: 'time'
1297
+ }
1298
+ }
1299
+ }
1300
+ });
1301
+ expect(resultSet.tablePivot()).toEqual([
1302
+ {
1303
+ 'Orders.createdAt.day': '2020-01-08T00:00:00.000',
1304
+ 'Orders.createdAt': '2020-01-08T17:04:43.000'
1305
+ },
1306
+ {
1307
+ 'Orders.createdAt.day': '2020-01-08T00:00:00.000',
1308
+ 'Orders.createdAt': '2020-01-08T19:28:26.000'
1309
+ },
1310
+ {
1311
+ 'Orders.createdAt.day': '2020-01-09T00:00:00.000',
1312
+ 'Orders.createdAt': '2020-01-09T00:13:01.000'
1313
+ },
1314
+ {
1315
+ 'Orders.createdAt.day': '2020-01-09T00:00:00.000',
1316
+ 'Orders.createdAt': '2020-01-09T00:25:32.000'
1317
+ },
1318
+ {
1319
+ 'Orders.createdAt.day': '2020-01-09T00:00:00.000',
1320
+ 'Orders.createdAt': '2020-01-09T00:43:11.000'
1321
+ },
1322
+ {
1323
+ 'Orders.createdAt.day': '2020-01-09T00:00:00.000',
1324
+ 'Orders.createdAt': '2020-01-09T03:04:00.000'
1325
+ },
1326
+ {
1327
+ 'Orders.createdAt.day': '2020-01-09T00:00:00.000',
1328
+ 'Orders.createdAt': '2020-01-09T04:30:10.000'
1329
+ },
1330
+ {
1331
+ 'Orders.createdAt.day': '2020-01-09T00:00:00.000',
1332
+ 'Orders.createdAt': '2020-01-09T10:25:04.000'
1333
+ },
1334
+ {
1335
+ 'Orders.createdAt.day': '2020-01-09T00:00:00.000',
1336
+ 'Orders.createdAt': '2020-01-09T19:47:19.000'
1337
+ },
1338
+ {
1339
+ 'Orders.createdAt.day': '2020-01-09T00:00:00.000',
1340
+ 'Orders.createdAt': '2020-01-09T19:48:04.000'
1341
+ },
1342
+ {
1343
+ 'Orders.createdAt.day': '2020-01-09T00:00:00.000',
1344
+ 'Orders.createdAt': '2020-01-09T21:46:24.000'
1345
+ },
1346
+ {
1347
+ 'Orders.createdAt.day': '2020-01-09T00:00:00.000',
1348
+ 'Orders.createdAt': '2020-01-09T23:49:37.000'
1349
+ },
1350
+ {
1351
+ 'Orders.createdAt.day': '2020-01-10T00:00:00.000',
1352
+ 'Orders.createdAt': '2020-01-10T09:07:20.000'
1353
+ },
1354
+ {
1355
+ 'Orders.createdAt.day': '2020-01-10T00:00:00.000',
1356
+ 'Orders.createdAt': '2020-01-10T13:50:05.000'
1357
+ },
1358
+ {
1359
+ 'Orders.createdAt.day': '2020-01-10T00:00:00.000',
1360
+ 'Orders.createdAt': '2020-01-10T15:30:32.000'
1361
+ },
1362
+ {
1363
+ 'Orders.createdAt.day': '2020-01-10T00:00:00.000',
1364
+ 'Orders.createdAt': '2020-01-10T15:32:52.000'
1365
+ },
1366
+ {
1367
+ 'Orders.createdAt.day': '2020-01-10T00:00:00.000',
1368
+ 'Orders.createdAt': '2020-01-10T18:55:23.000'
1369
+ },
1370
+ {
1371
+ 'Orders.createdAt.day': '2020-01-11T00:00:00.000',
1372
+ 'Orders.createdAt': '2020-01-11T01:13:17.000'
1373
+ },
1374
+ {
1375
+ 'Orders.createdAt.day': '2020-01-11T00:00:00.000',
1376
+ 'Orders.createdAt': '2020-01-11T09:17:40.000'
1377
+ },
1378
+ {
1379
+ 'Orders.createdAt.day': '2020-01-11T00:00:00.000',
1380
+ 'Orders.createdAt': '2020-01-11T13:23:03.000'
1381
+ },
1382
+ {
1383
+ 'Orders.createdAt.day': '2020-01-11T00:00:00.000',
1384
+ 'Orders.createdAt': '2020-01-11T17:28:42.000'
1385
+ },
1386
+ {
1387
+ 'Orders.createdAt.day': '2020-01-11T00:00:00.000',
1388
+ 'Orders.createdAt': '2020-01-11T22:34:32.000'
1389
+ },
1390
+ {
1391
+ 'Orders.createdAt.day': '2020-01-11T00:00:00.000',
1392
+ 'Orders.createdAt': '2020-01-11T23:03:58.000'
1393
+ },
1394
+ {
1395
+ 'Orders.createdAt.day': '2020-01-12T00:00:00.000',
1396
+ 'Orders.createdAt': '2020-01-12T03:46:25.000'
1397
+ },
1398
+ {
1399
+ 'Orders.createdAt.day': '2020-01-12T00:00:00.000',
1400
+ 'Orders.createdAt': '2020-01-12T09:57:10.000'
1401
+ },
1402
+ {
1403
+ 'Orders.createdAt.day': '2020-01-12T00:00:00.000',
1404
+ 'Orders.createdAt': '2020-01-12T12:28:22.000'
1405
+ },
1406
+ {
1407
+ 'Orders.createdAt.day': '2020-01-12T00:00:00.000',
1408
+ 'Orders.createdAt': '2020-01-12T14:34:20.000'
1409
+ },
1410
+ {
1411
+ 'Orders.createdAt.day': '2020-01-12T00:00:00.000',
1412
+ 'Orders.createdAt': '2020-01-12T18:45:15.000'
1413
+ },
1414
+ {
1415
+ 'Orders.createdAt.day': '2020-01-12T00:00:00.000',
1416
+ 'Orders.createdAt': '2020-01-12T19:38:05.000'
1417
+ },
1418
+ {
1419
+ 'Orders.createdAt.day': '2020-01-12T00:00:00.000',
1420
+ 'Orders.createdAt': '2020-01-12T21:43:51.000'
1421
+ },
1422
+ {
1423
+ 'Orders.createdAt.day': '2020-01-13T00:00:00.000',
1424
+ 'Orders.createdAt': '2020-01-13T01:42:49.000'
1425
+ },
1426
+ {
1427
+ 'Orders.createdAt.day': '2020-01-13T00:00:00.000',
1428
+ 'Orders.createdAt': '2020-01-13T03:19:22.000'
1429
+ },
1430
+ {
1431
+ 'Orders.createdAt.day': '2020-01-13T00:00:00.000',
1432
+ 'Orders.createdAt': '2020-01-13T05:20:50.000'
1433
+ },
1434
+ {
1435
+ 'Orders.createdAt.day': '2020-01-13T00:00:00.000',
1436
+ 'Orders.createdAt': '2020-01-13T05:46:35.000'
1437
+ },
1438
+ {
1439
+ 'Orders.createdAt.day': '2020-01-13T00:00:00.000',
1440
+ 'Orders.createdAt': '2020-01-13T11:24:01.000'
1441
+ },
1442
+ {
1443
+ 'Orders.createdAt.day': '2020-01-13T00:00:00.000',
1444
+ 'Orders.createdAt': '2020-01-13T12:13:42.000'
1445
+ },
1446
+ {
1447
+ 'Orders.createdAt.day': '2020-01-13T00:00:00.000',
1448
+ 'Orders.createdAt': '2020-01-13T20:21:59.000'
1449
+ },
1450
+ {
1451
+ 'Orders.createdAt.day': '2020-01-14T00:00:00.000',
1452
+ 'Orders.createdAt': '2020-01-14T20:16:23.000'
1453
+ }
1454
+ ]);
1455
+ });
1456
+ test('time dimension backward compatibility', () => {
1457
+ const resultSet = new ResultSet({
1458
+ query: {
1459
+ measures: [],
1460
+ timeDimensions: [
1461
+ {
1462
+ dimension: 'Orders.createdAt',
1463
+ granularity: 'day',
1464
+ dateRange: ['2020-01-08T00:00:00.000', '2020-01-09T23:59:59.999']
1465
+ }
1466
+ ],
1467
+ filters: [],
1468
+ timezone: 'UTC'
1469
+ },
1470
+ data: [
1471
+ {
1472
+ 'Orders.createdAt': '2020-01-08T00:00:00.000'
1473
+ },
1474
+ {
1475
+ 'Orders.createdAt': '2020-01-09T00:00:00.000'
1476
+ }
1477
+ ],
1478
+ annotation: {
1479
+ measures: {},
1480
+ dimensions: {},
1481
+ segments: {},
1482
+ timeDimensions: {
1483
+ 'Orders.createdAt': {
1484
+ title: 'Orders Created at',
1485
+ shortTitle: 'Created at',
1486
+ type: 'time'
1487
+ }
1488
+ }
1489
+ }
1490
+ });
1491
+ expect(resultSet.tablePivot()).toEqual([
1492
+ {
1493
+ 'Orders.createdAt.day': '2020-01-08T00:00:00.000'
1494
+ },
1495
+ {
1496
+ 'Orders.createdAt.day': '2020-01-09T00:00:00.000'
1497
+ }
1498
+ ]);
1499
+ });
1500
+ test('fill missing dates with custom value', () => {
1501
+ const resultSet = new ResultSet({
1502
+ query: {
1503
+ measures: ['Orders.total'],
1504
+ timeDimensions: [
1505
+ {
1506
+ dimension: 'Orders.createdAt',
1507
+ granularity: 'day',
1508
+ dateRange: ['2020-01-08T00:00:00.000', '2020-01-11T23:59:59.999']
1509
+ }
1510
+ ],
1511
+ filters: [],
1512
+ timezone: 'UTC'
1513
+ },
1514
+ data: [
1515
+ {
1516
+ 'Orders.createdAt': '2020-01-08T00:00:00.000',
1517
+ 'Orders.total': 1
1518
+ },
1519
+ {
1520
+ 'Orders.createdAt': '2020-01-10T00:00:00.000',
1521
+ 'Orders.total': 10
1522
+ }
1523
+ ],
1524
+ annotation: {
1525
+ measures: {},
1526
+ dimensions: {},
1527
+ segments: {},
1528
+ timeDimensions: {
1529
+ 'Orders.createdAt': {
1530
+ title: 'Orders Created at',
1531
+ shortTitle: 'Created at',
1532
+ type: 'time'
1533
+ }
1534
+ }
1535
+ }
1536
+ });
1537
+ expect(resultSet.tablePivot({
1538
+ fillWithValue: 5
1539
+ })).toEqual([
1540
+ {
1541
+ 'Orders.createdAt.day': '2020-01-08T00:00:00.000',
1542
+ 'Orders.total': 1
1543
+ },
1544
+ {
1545
+ 'Orders.createdAt.day': '2020-01-09T00:00:00.000',
1546
+ 'Orders.total': 5
1547
+ },
1548
+ {
1549
+ 'Orders.createdAt.day': '2020-01-10T00:00:00.000',
1550
+ 'Orders.total': 10
1551
+ },
1552
+ {
1553
+ 'Orders.createdAt.day': '2020-01-11T00:00:00.000',
1554
+ 'Orders.total': 5
1555
+ }
1556
+ ]);
1557
+ });
1558
+ test('fill missing dates with custom string', () => {
1559
+ const resultSet = new ResultSet({
1560
+ query: {
1561
+ measures: ['Orders.total'],
1562
+ timeDimensions: [
1563
+ {
1564
+ dimension: 'Orders.createdAt',
1565
+ granularity: 'day',
1566
+ dateRange: ['2020-01-08T00:00:00.000', '2020-01-11T23:59:59.999']
1567
+ }
1568
+ ],
1569
+ filters: [],
1570
+ timezone: 'UTC'
1571
+ },
1572
+ data: [
1573
+ {
1574
+ 'Orders.createdAt': '2020-01-08T00:00:00.000',
1575
+ 'Orders.total': 1
1576
+ },
1577
+ {
1578
+ 'Orders.createdAt': '2020-01-10T00:00:00.000',
1579
+ 'Orders.total': 10
1580
+ }
1581
+ ],
1582
+ annotation: {
1583
+ measures: {},
1584
+ dimensions: {},
1585
+ segments: {},
1586
+ timeDimensions: {
1587
+ 'Orders.createdAt': {
1588
+ title: 'Orders Created at',
1589
+ shortTitle: 'Created at',
1590
+ type: 'time'
1591
+ }
1592
+ }
1593
+ }
1594
+ });
1595
+ expect(resultSet.tablePivot({
1596
+ fillWithValue: 'N/A'
1597
+ })).toEqual([
1598
+ {
1599
+ 'Orders.createdAt.day': '2020-01-08T00:00:00.000',
1600
+ 'Orders.total': 1
1601
+ },
1602
+ {
1603
+ 'Orders.createdAt.day': '2020-01-09T00:00:00.000',
1604
+ 'Orders.total': 'N/A'
1605
+ },
1606
+ {
1607
+ 'Orders.createdAt.day': '2020-01-10T00:00:00.000',
1608
+ 'Orders.total': 10
1609
+ },
1610
+ {
1611
+ 'Orders.createdAt.day': '2020-01-11T00:00:00.000',
1612
+ 'Orders.total': 'N/A'
1613
+ }
1614
+ ]);
1615
+ });
1616
+ test('same dimension and time dimension without granularity', () => {
1617
+ const resultSet = new ResultSet({
1618
+ query: {
1619
+ measures: [],
1620
+ timeDimensions: [
1621
+ {
1622
+ dimension: 'Orders.createdAt',
1623
+ dateRange: ['2020-01-08T00:00:00.000', '2020-01-14T23:59:59.999']
1624
+ }
1625
+ ],
1626
+ dimensions: ['Orders.createdAt'],
1627
+ filters: [],
1628
+ timezone: 'UTC'
1629
+ },
1630
+ data: [
1631
+ { 'Orders.createdAt': '2020-01-08T17:04:43.000' },
1632
+ { 'Orders.createdAt': '2020-01-08T19:28:26.000' },
1633
+ { 'Orders.createdAt': '2020-01-09T00:13:01.000' },
1634
+ { 'Orders.createdAt': '2020-01-09T00:25:32.000' },
1635
+ { 'Orders.createdAt': '2020-01-09T00:43:11.000' },
1636
+ { 'Orders.createdAt': '2020-01-09T03:04:00.000' },
1637
+ { 'Orders.createdAt': '2020-01-09T04:30:10.000' },
1638
+ { 'Orders.createdAt': '2020-01-09T10:25:04.000' },
1639
+ { 'Orders.createdAt': '2020-01-09T19:47:19.000' },
1640
+ { 'Orders.createdAt': '2020-01-09T19:48:04.000' },
1641
+ { 'Orders.createdAt': '2020-01-09T21:46:24.000' },
1642
+ { 'Orders.createdAt': '2020-01-09T23:49:37.000' },
1643
+ { 'Orders.createdAt': '2020-01-10T09:07:20.000' },
1644
+ { 'Orders.createdAt': '2020-01-10T13:50:05.000' }
1645
+ ],
1646
+ annotation: {
1647
+ measures: {},
1648
+ dimensions: {
1649
+ 'Orders.createdAt': {
1650
+ title: 'Orders Created at',
1651
+ shortTitle: 'Created at',
1652
+ type: 'time'
1653
+ }
1654
+ },
1655
+ segments: {},
1656
+ timeDimensions: {}
1657
+ }
1658
+ });
1659
+ expect(resultSet.tablePivot()).toEqual([
1660
+ { 'Orders.createdAt': '2020-01-08T17:04:43.000' },
1661
+ { 'Orders.createdAt': '2020-01-08T19:28:26.000' },
1662
+ { 'Orders.createdAt': '2020-01-09T00:13:01.000' },
1663
+ { 'Orders.createdAt': '2020-01-09T00:25:32.000' },
1664
+ { 'Orders.createdAt': '2020-01-09T00:43:11.000' },
1665
+ { 'Orders.createdAt': '2020-01-09T03:04:00.000' },
1666
+ { 'Orders.createdAt': '2020-01-09T04:30:10.000' },
1667
+ { 'Orders.createdAt': '2020-01-09T10:25:04.000' },
1668
+ { 'Orders.createdAt': '2020-01-09T19:47:19.000' },
1669
+ { 'Orders.createdAt': '2020-01-09T19:48:04.000' },
1670
+ { 'Orders.createdAt': '2020-01-09T21:46:24.000' },
1671
+ { 'Orders.createdAt': '2020-01-09T23:49:37.000' },
1672
+ { 'Orders.createdAt': '2020-01-10T09:07:20.000' },
1673
+ { 'Orders.createdAt': '2020-01-10T13:50:05.000' }
1674
+ ]);
1675
+ });
1676
+ test('order is preserved', () => {
1677
+ const resultSet = new ResultSet({
1678
+ query: {
1679
+ measures: ['User.total'],
1680
+ dimensions: ['User.visits'],
1681
+ filters: [],
1682
+ timezone: 'UTC'
1683
+ },
1684
+ data: [
1685
+ {
1686
+ 'User.total': 1,
1687
+ 'User.visits': 1
1688
+ },
1689
+ {
1690
+ 'User.total': 15,
1691
+ 'User.visits': 0.9
1692
+ },
1693
+ {
1694
+ 'User.total': 20,
1695
+ 'User.visits': 0.7
1696
+ },
1697
+ {
1698
+ 'User.total': 10,
1699
+ 'User.visits': 0
1700
+ },
1701
+ ],
1702
+ annotation: {
1703
+ measures: {
1704
+ 'User.total': {}
1705
+ },
1706
+ dimensions: {
1707
+ 'User.visits': {
1708
+ title: 'User Visits',
1709
+ shortTitle: 'Visits',
1710
+ type: 'number'
1711
+ }
1712
+ },
1713
+ segments: {},
1714
+ timeDimensions: {}
1715
+ }
1716
+ });
1717
+ expect(resultSet.pivot()).toEqual([
1718
+ { xValues: [1], yValuesArray: [[['User.total'], 1]] },
1719
+ { xValues: [0.9], yValuesArray: [[['User.total'], 15]] },
1720
+ { xValues: [0.7], yValuesArray: [[['User.total'], 20]] },
1721
+ { xValues: [0], yValuesArray: [[['User.total'], 10]] },
1722
+ ]);
1723
+ });
1724
+ });
1725
+ });