Skip to content

Commit 34e20e1

Browse files
committed
fix(schema-compiler): Fix date alignment for week-based custom granularities
1 parent fd94b02 commit 34e20e1

File tree

2 files changed

+52
-1
lines changed

2 files changed

+52
-1
lines changed

packages/cubejs-schema-compiler/src/adapter/Granularity.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ export class Granularity {
2121

2222
public readonly granularityOffset: string | undefined;
2323

24-
public readonly origin: moment.Moment;
24+
public origin: moment.Moment;
2525

2626
private readonly predefinedGranularity: boolean;
2727

@@ -52,12 +52,23 @@ export class Granularity {
5252
if (customGranularity.origin) {
5353
this.origin = moment.tz(customGranularity.origin, query.timezone);
5454
} else if (customGranularity.offset) {
55+
// Needed because if interval is week-based, offset is expected to be relative to the start of a week
56+
this.fixOriginForWeeksIfNeeded();
5557
this.granularityOffset = customGranularity.offset;
5658
this.origin = addInterval(this.origin, parseSqlInterval(customGranularity.offset));
59+
} else {
60+
this.fixOriginForWeeksIfNeeded();
5761
}
5862
}
5963
}
6064

65+
private fixOriginForWeeksIfNeeded() {
66+
const parsedInterval = parseSqlInterval(this.granularityInterval);
67+
if (Object.keys(parsedInterval).length === 1 && parsedInterval.week) {
68+
this.origin = this.origin.isoWeekday(1);
69+
}
70+
}
71+
6172
public isPredefined(): boolean {
6273
return this.predefinedGranularity;
6374
}

packages/cubejs-schema-compiler/test/integration/postgres/custom-granularities.test.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ describe('Custom Granularities', () => {
4747
- name: two_weeks_by_friday
4848
interval: 2 weeks
4949
origin: '2024-08-23'
50+
- name: one_week_by_friday_by_offset
51+
interval: 1 week
52+
offset: 4 days
5053
- name: one_hour_by_5min_offset
5154
interval: 1 hour
5255
offset: 5 minutes
@@ -123,6 +126,43 @@ describe('Custom Granularities', () => {
123126
{ joinGraph, cubeEvaluator, compiler }
124127
));
125128

129+
it('works with one_week_by_friday_by_offset custom granularity w/o dimensions query', async () => dbRunner.runQueryTest(
130+
{
131+
measures: ['orders.count'],
132+
timeDimensions: [{
133+
dimension: 'orders.createdAt',
134+
granularity: 'one_week_by_friday_by_offset',
135+
dateRange: ['2024-01-01', '2024-03-01']
136+
}],
137+
dimensions: [],
138+
filters: [],
139+
timezone: 'Europe/London'
140+
},
141+
[
142+
{
143+
orders__count: '1',
144+
orders__created_at_one_week_by_friday_by_offset: '2023-12-29T00:00:00.000Z',
145+
},
146+
{
147+
orders__count: '1',
148+
orders__created_at_one_week_by_friday_by_offset: '2024-01-12T00:00:00.000Z',
149+
},
150+
{
151+
orders__count: '1',
152+
orders__created_at_one_week_by_friday_by_offset: '2024-01-26T00:00:00.000Z',
153+
},
154+
{
155+
orders__count: '1',
156+
orders__created_at_one_week_by_friday_by_offset: '2024-02-09T00:00:00.000Z',
157+
},
158+
{
159+
orders__count: '1',
160+
orders__created_at_one_week_by_friday_by_offset: '2024-02-23T00:00:00.000Z',
161+
},
162+
],
163+
{ joinGraph, cubeEvaluator, compiler }
164+
));
165+
126166
it('works with proxied createdAtHalfYear custom granularity as dimension query', async () => dbRunner.runQueryTest(
127167
{
128168
measures: ['orders.count'],

0 commit comments

Comments
 (0)