diff --git a/packages/cubejs-client-core/src/ResultSet.js b/packages/cubejs-client-core/src/ResultSet.js index 13543e81ea5c..c71cc448d0cb 100644 --- a/packages/cubejs-client-core/src/ResultSet.js +++ b/packages/cubejs-client-core/src/ResultSet.js @@ -9,12 +9,12 @@ import { import { aliasSeries } from './utils'; -dayjs.locale({ - ...en, - weekStart: 1, -}); dayjs.extend(quarterOfYear); +// When granularity is week, weekStart Value must be 1. However, since the client can change it globally (https://day.js.org/docs/en/i18n/changing-locale) +// So the function below has been added. +const internalDayjs = (...args) => dayjs(...args).locale({ ...en, weekStart: 1 }); + export const TIME_SERIES = { day: (range) => range.by('d').map(d => d.format('YYYY-MM-DDT00:00:00.000')), month: (range) => range.snapTo('month').by('M').map(d => d.format('YYYY-MM-01T00:00:00.000')), @@ -60,8 +60,8 @@ export const dayRange = (from, to) => ({ by: (value) => { const results = []; - let start = dayjs(from); - const end = dayjs(to); + let start = internalDayjs(from); + const end = internalDayjs(to); while (start.isBefore(end) || start.isSame(end)) { results.push(start); @@ -70,9 +70,9 @@ export const dayRange = (from, to) => ({ return results; }, - snapTo: (value) => dayRange(dayjs(from).startOf(value), dayjs(to).endOf(value)), - start: dayjs(from), - end: dayjs(to), + snapTo: (value) => dayRange(internalDayjs(from).startOf(value), internalDayjs(to).endOf(value)), + start: internalDayjs(from), + end: internalDayjs(to), }); export const QUERY_TYPE = { @@ -318,7 +318,7 @@ class ResultSet { if (!dateRange) { const member = ResultSet.timeDimensionMember(timeDimension); const dates = pipe( - map(row => row[member] && dayjs(row[member])), + map(row => row[member] && internalDayjs(row[member])), filter(Boolean) )(this.timeDimensionBackwardCompatibleData(resultIndex)); diff --git a/packages/cubejs-client-core/src/tests/granularity.test.js b/packages/cubejs-client-core/src/tests/granularity.test.js index 9aa11781ff92..93feafbaeada 100644 --- a/packages/cubejs-client-core/src/tests/granularity.test.js +++ b/packages/cubejs-client-core/src/tests/granularity.test.js @@ -1,5 +1,6 @@ import 'jest'; - +import dayjs from 'dayjs'; +import ko from 'dayjs/locale/ko'; import ResultSet from '../ResultSet'; describe('ResultSet Granularity', () => { @@ -110,5 +111,113 @@ describe('ResultSet Granularity', () => { }, ]); }); + + test('week granularity in other locale', () => { + dayjs.locale(ko); + const result = new ResultSet({ + queryType: 'regularQuery', + results: [ + { + query: { + measures: ['LineItems.count'], + timeDimensions: [ + { + dimension: 'LineItems.createdAt', + granularity: 'week', + dateRange: ['2019-01-08T00:00:00.000', '2019-01-18T00:00:00.000'], + }, + ], + filters: [ + { + operator: 'equals', + values: ['us-ut'], + member: 'Users.state', + }, + ], + limit: 2, + rowLimit: 2, + timezone: 'UTC', + order: [], + dimensions: [], + queryType: 'regularQuery', + }, + data: [ + { + 'LineItems.createdAt.week': '2019-01-07T00:00:00.000', + 'LineItems.createdAt': '2019-01-07T00:00:00.000', + 'LineItems.count': '2', + }, + ], + lastRefreshTime: '2021-07-07T14:31:30.458Z', + annotation: { + measures: { + 'LineItems.count': { + title: 'Line Items Count', + shortTitle: 'Count', + type: 'number', + drillMembers: ['LineItems.id', 'LineItems.createdAt'], + drillMembersGrouped: { + measures: [], + dimensions: ['LineItems.id', 'LineItems.createdAt'], + }, + }, + }, + dimensions: {}, + segments: {}, + timeDimensions: { + 'LineItems.createdAt.week': { + title: 'Line Items Created at', + shortTitle: 'Created at', + type: 'time', + }, + 'LineItems.createdAt': { + title: 'Line Items Created at', + shortTitle: 'Created at', + type: 'time', + }, + }, + }, + slowQuery: false, + }, + ], + pivotQuery: { + measures: ['LineItems.count'], + timeDimensions: [ + { + dimension: 'LineItems.createdAt', + granularity: 'week', + dateRange: ['2019-01-08T00:00:00.000', '2019-01-18T00:00:00.000'], + }, + ], + filters: [ + { + operator: 'equals', + values: ['us-ut'], + member: 'Users.state', + }, + ], + limit: 2, + rowLimit: 2, + timezone: 'UTC', + order: [], + dimensions: [], + queryType: 'regularQuery', + }, + slowQuery: false, + }); + + expect(result.chartPivot()).toStrictEqual([ + { + x: '2019-01-07T00:00:00.000', + xValues: ['2019-01-07T00:00:00.000'], + 'LineItems.count': 2, + }, + { + x: '2019-01-14T00:00:00.000', + xValues: ['2019-01-14T00:00:00.000'], + 'LineItems.count': 0, + }, + ]); + }); }); });