Skip to content

Commit 2fd8ea7

Browse files
authored
fix(client-core): Fix time series generation (#9978)
1 parent 96908c3 commit 2fd8ea7

File tree

3 files changed

+283
-2
lines changed

3 files changed

+283
-2
lines changed

packages/cubejs-client-core/src/ResultSet.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -549,7 +549,8 @@ export default class ResultSet<T extends Record<string, any> = any> {
549549
const series = this.loadResponses.map(
550550
(loadResponse) => this.timeSeries(
551551
loadResponse.query.timeDimensions![0],
552-
resultIndex, loadResponse.annotation.timeDimensions
552+
resultIndex,
553+
loadResponse.annotation.timeDimensions
553554
)
554555
);
555556

packages/cubejs-client-core/src/time.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ export const dayRange = (from: any, to: any): DayRange => ({
8686
let start = internalDayjs(from);
8787
const end = internalDayjs(to);
8888

89-
while (start.isBefore(end) || start.isSame(end)) {
89+
while (start.startOf(value).isBefore(end) || start.isSame(end)) {
9090
results.push(start);
9191
start = start.add(1, value);
9292
}

packages/cubejs-client-core/test/granularity.test.ts

Lines changed: 280 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,5 +219,285 @@ describe('ResultSet Granularity', () => {
219219
},
220220
]);
221221
});
222+
223+
test('hour granularity (end minutes > start minutes)', () => {
224+
const result = new ResultSet({
225+
queryType: 'regularQuery',
226+
results: [
227+
{
228+
query: {
229+
measures: ['LineItems.count'],
230+
timeDimensions: [
231+
{
232+
dimension: 'LineItems.createdAt',
233+
granularity: 'hour',
234+
dateRange: ['2019-01-08T01:45:25.342', '2019-01-08T07:45:58.399'],
235+
},
236+
],
237+
filters: [],
238+
timezone: 'UTC',
239+
order: [],
240+
dimensions: [],
241+
},
242+
data: [
243+
{
244+
'LineItems.createdAt.hour': '2019-01-08T01:00:00.000',
245+
'LineItems.createdAt': '2019-01-08T01:00:00.000',
246+
'LineItems.count': '2',
247+
},
248+
{
249+
'LineItems.createdAt.hour': '2019-01-08T02:00:00.000',
250+
'LineItems.createdAt': '2019-01-08T02:00:00.000',
251+
'LineItems.count': '3',
252+
},
253+
{
254+
'LineItems.createdAt.hour': '2019-01-08T03:00:00.000',
255+
'LineItems.createdAt': '2019-01-08T03:00:00.000',
256+
'LineItems.count': '4',
257+
},
258+
{
259+
'LineItems.createdAt.hour': '2019-01-08T04:00:00.000',
260+
'LineItems.createdAt': '2019-01-08T04:00:00.000',
261+
'LineItems.count': '5',
262+
},
263+
{
264+
'LineItems.createdAt.hour': '2019-01-08T05:00:00.000',
265+
'LineItems.createdAt': '2019-01-08T05:00:00.000',
266+
'LineItems.count': '6',
267+
},
268+
{
269+
'LineItems.createdAt.hour': '2019-01-08T06:00:00.000',
270+
'LineItems.createdAt': '2019-01-08T06:00:00.000',
271+
'LineItems.count': '7',
272+
},
273+
],
274+
lastRefreshTime: '2021-07-07T14:31:30.458Z',
275+
annotation: {
276+
measures: {
277+
'LineItems.count': {
278+
title: 'Line Items Count',
279+
shortTitle: 'Count',
280+
type: 'number',
281+
drillMembers: ['LineItems.id', 'LineItems.createdAt'],
282+
drillMembersGrouped: {
283+
measures: [],
284+
dimensions: ['LineItems.id', 'LineItems.createdAt'],
285+
},
286+
},
287+
},
288+
dimensions: {},
289+
segments: {},
290+
timeDimensions: {
291+
'LineItems.createdAt.week': {
292+
title: 'Line Items Created at',
293+
shortTitle: 'Created at',
294+
type: 'time',
295+
},
296+
'LineItems.createdAt': {
297+
title: 'Line Items Created at',
298+
shortTitle: 'Created at',
299+
type: 'time',
300+
},
301+
},
302+
},
303+
slowQuery: false,
304+
},
305+
],
306+
pivotQuery: {
307+
measures: ['LineItems.count'],
308+
timeDimensions: [
309+
{
310+
dimension: 'LineItems.createdAt',
311+
granularity: 'hour',
312+
dateRange: ['2019-01-08T01:45:25.342', '2019-01-08T07:45:58.399'],
313+
},
314+
],
315+
filters: [],
316+
timezone: 'UTC',
317+
order: [],
318+
dimensions: [],
319+
queryType: 'regularQuery',
320+
},
321+
slowQuery: false,
322+
} as any);
323+
324+
expect(result.chartPivot()).toStrictEqual([
325+
{
326+
x: '2019-01-08T01:00:00.000',
327+
xValues: ['2019-01-08T01:00:00.000'],
328+
'LineItems.count': 2,
329+
},
330+
{
331+
x: '2019-01-08T02:00:00.000',
332+
xValues: ['2019-01-08T02:00:00.000'],
333+
'LineItems.count': 3,
334+
},
335+
{
336+
x: '2019-01-08T03:00:00.000',
337+
xValues: ['2019-01-08T03:00:00.000'],
338+
'LineItems.count': 4,
339+
},
340+
{
341+
x: '2019-01-08T04:00:00.000',
342+
xValues: ['2019-01-08T04:00:00.000'],
343+
'LineItems.count': 5,
344+
},
345+
{
346+
x: '2019-01-08T05:00:00.000',
347+
xValues: ['2019-01-08T05:00:00.000'],
348+
'LineItems.count': 6,
349+
},
350+
{
351+
x: '2019-01-08T06:00:00.000',
352+
xValues: ['2019-01-08T06:00:00.000'],
353+
'LineItems.count': 7,
354+
},
355+
{
356+
x: '2019-01-08T07:00:00.000',
357+
xValues: ['2019-01-08T07:00:00.000'],
358+
'LineItems.count': 0,
359+
},
360+
]);
361+
});
362+
363+
test('hour granularity (end minutes < start minutes)', () => {
364+
const result = new ResultSet({
365+
queryType: 'regularQuery',
366+
results: [
367+
{
368+
query: {
369+
measures: ['LineItems.count'],
370+
timeDimensions: [
371+
{
372+
dimension: 'LineItems.createdAt',
373+
granularity: 'hour',
374+
dateRange: ['2019-01-08T01:45:25.342', '2019-01-08T07:35:58.399'],
375+
},
376+
],
377+
filters: [],
378+
timezone: 'UTC',
379+
order: [],
380+
dimensions: [],
381+
},
382+
data: [
383+
{
384+
'LineItems.createdAt.hour': '2019-01-08T01:00:00.000',
385+
'LineItems.createdAt': '2019-01-08T01:00:00.000',
386+
'LineItems.count': '2',
387+
},
388+
{
389+
'LineItems.createdAt.hour': '2019-01-08T02:00:00.000',
390+
'LineItems.createdAt': '2019-01-08T02:00:00.000',
391+
'LineItems.count': '3',
392+
},
393+
{
394+
'LineItems.createdAt.hour': '2019-01-08T03:00:00.000',
395+
'LineItems.createdAt': '2019-01-08T03:00:00.000',
396+
'LineItems.count': '4',
397+
},
398+
{
399+
'LineItems.createdAt.hour': '2019-01-08T04:00:00.000',
400+
'LineItems.createdAt': '2019-01-08T04:00:00.000',
401+
'LineItems.count': '5',
402+
},
403+
{
404+
'LineItems.createdAt.hour': '2019-01-08T05:00:00.000',
405+
'LineItems.createdAt': '2019-01-08T05:00:00.000',
406+
'LineItems.count': '6',
407+
},
408+
{
409+
'LineItems.createdAt.hour': '2019-01-08T06:00:00.000',
410+
'LineItems.createdAt': '2019-01-08T06:00:00.000',
411+
'LineItems.count': '7',
412+
},
413+
],
414+
lastRefreshTime: '2021-07-07T14:31:30.458Z',
415+
annotation: {
416+
measures: {
417+
'LineItems.count': {
418+
title: 'Line Items Count',
419+
shortTitle: 'Count',
420+
type: 'number',
421+
drillMembers: ['LineItems.id', 'LineItems.createdAt'],
422+
drillMembersGrouped: {
423+
measures: [],
424+
dimensions: ['LineItems.id', 'LineItems.createdAt'],
425+
},
426+
},
427+
},
428+
dimensions: {},
429+
segments: {},
430+
timeDimensions: {
431+
'LineItems.createdAt.week': {
432+
title: 'Line Items Created at',
433+
shortTitle: 'Created at',
434+
type: 'time',
435+
},
436+
'LineItems.createdAt': {
437+
title: 'Line Items Created at',
438+
shortTitle: 'Created at',
439+
type: 'time',
440+
},
441+
},
442+
},
443+
slowQuery: false,
444+
},
445+
],
446+
pivotQuery: {
447+
measures: ['LineItems.count'],
448+
timeDimensions: [
449+
{
450+
dimension: 'LineItems.createdAt',
451+
granularity: 'hour',
452+
dateRange: ['2019-01-08T01:45:25.342', '2019-01-08T07:35:58.399'],
453+
},
454+
],
455+
filters: [],
456+
timezone: 'UTC',
457+
order: [],
458+
dimensions: [],
459+
queryType: 'regularQuery',
460+
},
461+
slowQuery: false,
462+
} as any);
463+
464+
expect(result.chartPivot()).toStrictEqual([
465+
{
466+
x: '2019-01-08T01:00:00.000',
467+
xValues: ['2019-01-08T01:00:00.000'],
468+
'LineItems.count': 2,
469+
},
470+
{
471+
x: '2019-01-08T02:00:00.000',
472+
xValues: ['2019-01-08T02:00:00.000'],
473+
'LineItems.count': 3,
474+
},
475+
{
476+
x: '2019-01-08T03:00:00.000',
477+
xValues: ['2019-01-08T03:00:00.000'],
478+
'LineItems.count': 4,
479+
},
480+
{
481+
x: '2019-01-08T04:00:00.000',
482+
xValues: ['2019-01-08T04:00:00.000'],
483+
'LineItems.count': 5,
484+
},
485+
{
486+
x: '2019-01-08T05:00:00.000',
487+
xValues: ['2019-01-08T05:00:00.000'],
488+
'LineItems.count': 6,
489+
},
490+
{
491+
x: '2019-01-08T06:00:00.000',
492+
xValues: ['2019-01-08T06:00:00.000'],
493+
'LineItems.count': 7,
494+
},
495+
{
496+
x: '2019-01-08T07:00:00.000',
497+
xValues: ['2019-01-08T07:00:00.000'],
498+
'LineItems.count': 0,
499+
},
500+
]);
501+
});
222502
});
223503
});

0 commit comments

Comments
 (0)