@cubejs-client/core 1.3.68 → 1.3.70

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"ResultSet.d.ts","sourceRoot":"","sources":["../../src/ResultSet.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ResultSet.d.ts","sourceRoot":"","sources":["../../src/ResultSet.ts"],"names":[],"mappings":"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"}
package/dist/src/time.js CHANGED
@@ -39,7 +39,7 @@ export const dayRange = (from, to) => ({
39
39
  const results = [];
40
40
  let start = internalDayjs(from);
41
41
  const end = internalDayjs(to);
42
- while (start.isBefore(end) || start.isSame(end)) {
42
+ while (start.startOf(value).isBefore(end) || start.isSame(end)) {
43
43
  results.push(start);
44
44
  start = start.add(1, value);
45
45
  }
@@ -214,5 +214,281 @@ describe('ResultSet Granularity', () => {
214
214
  },
215
215
  ]);
216
216
  });
217
+ test('hour granularity (end minutes > start minutes)', () => {
218
+ const result = new ResultSet({
219
+ queryType: 'regularQuery',
220
+ results: [
221
+ {
222
+ query: {
223
+ measures: ['LineItems.count'],
224
+ timeDimensions: [
225
+ {
226
+ dimension: 'LineItems.createdAt',
227
+ granularity: 'hour',
228
+ dateRange: ['2019-01-08T01:45:25.342', '2019-01-08T07:45:58.399'],
229
+ },
230
+ ],
231
+ filters: [],
232
+ timezone: 'UTC',
233
+ order: [],
234
+ dimensions: [],
235
+ },
236
+ data: [
237
+ {
238
+ 'LineItems.createdAt.hour': '2019-01-08T01:00:00.000',
239
+ 'LineItems.createdAt': '2019-01-08T01:00:00.000',
240
+ 'LineItems.count': '2',
241
+ },
242
+ {
243
+ 'LineItems.createdAt.hour': '2019-01-08T02:00:00.000',
244
+ 'LineItems.createdAt': '2019-01-08T02:00:00.000',
245
+ 'LineItems.count': '3',
246
+ },
247
+ {
248
+ 'LineItems.createdAt.hour': '2019-01-08T03:00:00.000',
249
+ 'LineItems.createdAt': '2019-01-08T03:00:00.000',
250
+ 'LineItems.count': '4',
251
+ },
252
+ {
253
+ 'LineItems.createdAt.hour': '2019-01-08T04:00:00.000',
254
+ 'LineItems.createdAt': '2019-01-08T04:00:00.000',
255
+ 'LineItems.count': '5',
256
+ },
257
+ {
258
+ 'LineItems.createdAt.hour': '2019-01-08T05:00:00.000',
259
+ 'LineItems.createdAt': '2019-01-08T05:00:00.000',
260
+ 'LineItems.count': '6',
261
+ },
262
+ {
263
+ 'LineItems.createdAt.hour': '2019-01-08T06:00:00.000',
264
+ 'LineItems.createdAt': '2019-01-08T06:00:00.000',
265
+ 'LineItems.count': '7',
266
+ },
267
+ ],
268
+ lastRefreshTime: '2021-07-07T14:31:30.458Z',
269
+ annotation: {
270
+ measures: {
271
+ 'LineItems.count': {
272
+ title: 'Line Items Count',
273
+ shortTitle: 'Count',
274
+ type: 'number',
275
+ drillMembers: ['LineItems.id', 'LineItems.createdAt'],
276
+ drillMembersGrouped: {
277
+ measures: [],
278
+ dimensions: ['LineItems.id', 'LineItems.createdAt'],
279
+ },
280
+ },
281
+ },
282
+ dimensions: {},
283
+ segments: {},
284
+ timeDimensions: {
285
+ 'LineItems.createdAt.week': {
286
+ title: 'Line Items Created at',
287
+ shortTitle: 'Created at',
288
+ type: 'time',
289
+ },
290
+ 'LineItems.createdAt': {
291
+ title: 'Line Items Created at',
292
+ shortTitle: 'Created at',
293
+ type: 'time',
294
+ },
295
+ },
296
+ },
297
+ slowQuery: false,
298
+ },
299
+ ],
300
+ pivotQuery: {
301
+ measures: ['LineItems.count'],
302
+ timeDimensions: [
303
+ {
304
+ dimension: 'LineItems.createdAt',
305
+ granularity: 'hour',
306
+ dateRange: ['2019-01-08T01:45:25.342', '2019-01-08T07:45:58.399'],
307
+ },
308
+ ],
309
+ filters: [],
310
+ timezone: 'UTC',
311
+ order: [],
312
+ dimensions: [],
313
+ queryType: 'regularQuery',
314
+ },
315
+ slowQuery: false,
316
+ });
317
+ expect(result.chartPivot()).toStrictEqual([
318
+ {
319
+ x: '2019-01-08T01:00:00.000',
320
+ xValues: ['2019-01-08T01:00:00.000'],
321
+ 'LineItems.count': 2,
322
+ },
323
+ {
324
+ x: '2019-01-08T02:00:00.000',
325
+ xValues: ['2019-01-08T02:00:00.000'],
326
+ 'LineItems.count': 3,
327
+ },
328
+ {
329
+ x: '2019-01-08T03:00:00.000',
330
+ xValues: ['2019-01-08T03:00:00.000'],
331
+ 'LineItems.count': 4,
332
+ },
333
+ {
334
+ x: '2019-01-08T04:00:00.000',
335
+ xValues: ['2019-01-08T04:00:00.000'],
336
+ 'LineItems.count': 5,
337
+ },
338
+ {
339
+ x: '2019-01-08T05:00:00.000',
340
+ xValues: ['2019-01-08T05:00:00.000'],
341
+ 'LineItems.count': 6,
342
+ },
343
+ {
344
+ x: '2019-01-08T06:00:00.000',
345
+ xValues: ['2019-01-08T06:00:00.000'],
346
+ 'LineItems.count': 7,
347
+ },
348
+ {
349
+ x: '2019-01-08T07:00:00.000',
350
+ xValues: ['2019-01-08T07:00:00.000'],
351
+ 'LineItems.count': 0,
352
+ },
353
+ ]);
354
+ });
355
+ test('hour granularity (end minutes < start minutes)', () => {
356
+ const result = new ResultSet({
357
+ queryType: 'regularQuery',
358
+ results: [
359
+ {
360
+ query: {
361
+ measures: ['LineItems.count'],
362
+ timeDimensions: [
363
+ {
364
+ dimension: 'LineItems.createdAt',
365
+ granularity: 'hour',
366
+ dateRange: ['2019-01-08T01:45:25.342', '2019-01-08T07:35:58.399'],
367
+ },
368
+ ],
369
+ filters: [],
370
+ timezone: 'UTC',
371
+ order: [],
372
+ dimensions: [],
373
+ },
374
+ data: [
375
+ {
376
+ 'LineItems.createdAt.hour': '2019-01-08T01:00:00.000',
377
+ 'LineItems.createdAt': '2019-01-08T01:00:00.000',
378
+ 'LineItems.count': '2',
379
+ },
380
+ {
381
+ 'LineItems.createdAt.hour': '2019-01-08T02:00:00.000',
382
+ 'LineItems.createdAt': '2019-01-08T02:00:00.000',
383
+ 'LineItems.count': '3',
384
+ },
385
+ {
386
+ 'LineItems.createdAt.hour': '2019-01-08T03:00:00.000',
387
+ 'LineItems.createdAt': '2019-01-08T03:00:00.000',
388
+ 'LineItems.count': '4',
389
+ },
390
+ {
391
+ 'LineItems.createdAt.hour': '2019-01-08T04:00:00.000',
392
+ 'LineItems.createdAt': '2019-01-08T04:00:00.000',
393
+ 'LineItems.count': '5',
394
+ },
395
+ {
396
+ 'LineItems.createdAt.hour': '2019-01-08T05:00:00.000',
397
+ 'LineItems.createdAt': '2019-01-08T05:00:00.000',
398
+ 'LineItems.count': '6',
399
+ },
400
+ {
401
+ 'LineItems.createdAt.hour': '2019-01-08T06:00:00.000',
402
+ 'LineItems.createdAt': '2019-01-08T06:00:00.000',
403
+ 'LineItems.count': '7',
404
+ },
405
+ ],
406
+ lastRefreshTime: '2021-07-07T14:31:30.458Z',
407
+ annotation: {
408
+ measures: {
409
+ 'LineItems.count': {
410
+ title: 'Line Items Count',
411
+ shortTitle: 'Count',
412
+ type: 'number',
413
+ drillMembers: ['LineItems.id', 'LineItems.createdAt'],
414
+ drillMembersGrouped: {
415
+ measures: [],
416
+ dimensions: ['LineItems.id', 'LineItems.createdAt'],
417
+ },
418
+ },
419
+ },
420
+ dimensions: {},
421
+ segments: {},
422
+ timeDimensions: {
423
+ 'LineItems.createdAt.week': {
424
+ title: 'Line Items Created at',
425
+ shortTitle: 'Created at',
426
+ type: 'time',
427
+ },
428
+ 'LineItems.createdAt': {
429
+ title: 'Line Items Created at',
430
+ shortTitle: 'Created at',
431
+ type: 'time',
432
+ },
433
+ },
434
+ },
435
+ slowQuery: false,
436
+ },
437
+ ],
438
+ pivotQuery: {
439
+ measures: ['LineItems.count'],
440
+ timeDimensions: [
441
+ {
442
+ dimension: 'LineItems.createdAt',
443
+ granularity: 'hour',
444
+ dateRange: ['2019-01-08T01:45:25.342', '2019-01-08T07:35:58.399'],
445
+ },
446
+ ],
447
+ filters: [],
448
+ timezone: 'UTC',
449
+ order: [],
450
+ dimensions: [],
451
+ queryType: 'regularQuery',
452
+ },
453
+ slowQuery: false,
454
+ });
455
+ expect(result.chartPivot()).toStrictEqual([
456
+ {
457
+ x: '2019-01-08T01:00:00.000',
458
+ xValues: ['2019-01-08T01:00:00.000'],
459
+ 'LineItems.count': 2,
460
+ },
461
+ {
462
+ x: '2019-01-08T02:00:00.000',
463
+ xValues: ['2019-01-08T02:00:00.000'],
464
+ 'LineItems.count': 3,
465
+ },
466
+ {
467
+ x: '2019-01-08T03:00:00.000',
468
+ xValues: ['2019-01-08T03:00:00.000'],
469
+ 'LineItems.count': 4,
470
+ },
471
+ {
472
+ x: '2019-01-08T04:00:00.000',
473
+ xValues: ['2019-01-08T04:00:00.000'],
474
+ 'LineItems.count': 5,
475
+ },
476
+ {
477
+ x: '2019-01-08T05:00:00.000',
478
+ xValues: ['2019-01-08T05:00:00.000'],
479
+ 'LineItems.count': 6,
480
+ },
481
+ {
482
+ x: '2019-01-08T06:00:00.000',
483
+ xValues: ['2019-01-08T06:00:00.000'],
484
+ 'LineItems.count': 7,
485
+ },
486
+ {
487
+ x: '2019-01-08T07:00:00.000',
488
+ xValues: ['2019-01-08T07:00:00.000'],
489
+ 'LineItems.count': 0,
490
+ },
491
+ ]);
492
+ });
217
493
  });
218
494
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cubejs-client/core",
3
- "version": "1.3.68",
3
+ "version": "1.3.70",
4
4
  "engines": {},
5
5
  "repository": {
6
6
  "type": "git",
@@ -38,7 +38,7 @@
38
38
  ],
39
39
  "license": "MIT",
40
40
  "devDependencies": {
41
- "@cubejs-backend/linter": "1.3.68",
41
+ "@cubejs-backend/linter": "1.3.70",
42
42
  "@types/jest": "^29",
43
43
  "@types/moment-range": "^4.0.0",
44
44
  "@types/ramda": "^0.27.34",
@@ -50,5 +50,5 @@
50
50
  "eslintConfig": {
51
51
  "extends": "../cubejs-linter"
52
52
  },
53
- "gitHead": "0fde75d3975d6911ec67353dacb9cfa0f62f0096"
53
+ "gitHead": "020e45546da160800297e7b4bdfbb22cd610480e"
54
54
  }