Skip to content

Commit 9a4d13f

Browse files
committed
extend cube validator to support named timeshifts
1 parent 3f16a39 commit 9a4d13f

File tree

5 files changed

+28
-16
lines changed

5 files changed

+28
-16
lines changed

packages/cubejs-schema-compiler/src/compiler/CubeValidator.ts

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -576,9 +576,12 @@ const timeShiftItemRequired = Joi.object({
576576

577577
const timeShiftItemOptional = Joi.object({
578578
timeDimension: Joi.func(), // not required
579-
interval: regexTimeInterval.required(),
580-
type: Joi.string().valid('next', 'prior').required(),
581-
});
579+
interval: regexTimeInterval,
580+
name: identifier,
581+
type: Joi.string().valid('next', 'prior'),
582+
})
583+
.xor('name', 'interval')
584+
.and('interval', 'type');
582585

583586
const MeasuresSchema = Joi.object().pattern(identifierRegex, Joi.alternatives().conditional(Joi.ref('.multiStage'), [
584587
{
@@ -623,6 +626,16 @@ const MeasuresSchema = Joi.object().pattern(identifierRegex, Joi.alternatives().
623626
]
624627
));
625628

629+
const CalendarTimeShiftItem = Joi.object({
630+
name: identifier,
631+
interval: regexTimeInterval,
632+
type: Joi.string().valid('next', 'prior'),
633+
sql: Joi.func().required(),
634+
})
635+
.or('name', 'interval')
636+
.with('interval', 'type')
637+
.with('type', 'interval');
638+
626639
const DimensionsSchema = Joi.object().pattern(identifierRegex, Joi.alternatives().try(
627640
inherit(BaseDimensionWithoutSubQuery, {
628641
case: Joi.object().keys({
@@ -667,11 +680,7 @@ const DimensionsSchema = Joi.object().pattern(identifierRegex, Joi.alternatives(
667680
inherit(BaseDimensionWithoutSubQuery, {
668681
type: Joi.any().valid('time').required(),
669682
sql: Joi.func().required(),
670-
timeShift: Joi.array().items(Joi.object({
671-
interval: regexTimeInterval.required(),
672-
type: Joi.string().valid('next', 'prior').required(),
673-
sql: Joi.func().required(),
674-
})),
683+
timeShift: Joi.array().items(CalendarTimeShiftItem),
675684
})
676685
));
677686

packages/cubejs-schema-compiler/test/unit/__snapshots__/schema.test.ts.snap

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,8 @@ Object {
8787
"type": "prior",
8888
},
8989
Object {
90-
"interval": "1 year",
90+
"name": "retail_date_prev_year",
9191
"sql": [Function],
92-
"type": "prior",
9392
},
9493
Object {
9594
"interval": "2 year",
@@ -273,9 +272,8 @@ Object {
273272
"type": "prior",
274273
},
275274
Object {
276-
"interval": "1 year",
275+
"name": "retail_date_prev_year",
277276
"sql": [Function],
278-
"type": "prior",
279277
},
280278
Object {
281279
"interval": "2 year",

packages/cubejs-schema-compiler/test/unit/fixtures/calendar_orders.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,13 @@ cubes:
4646
interval: 1 year
4747
type: prior
4848

49+
- name: count_shifted_named
50+
type: count
51+
multi_stage: true
52+
sql: "{count}"
53+
time_shift:
54+
- name: retail_date_prev_year
55+
4956
- name: completed_count
5057
type: count
5158
filters:

packages/cubejs-schema-compiler/test/unit/fixtures/custom_calendar.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,7 @@ cube(`custom_calendar_js`, {
4141
sql: `{CUBE.retail_date_prev_month}`,
4242
},
4343
{
44-
interval: '1 year',
45-
type: 'prior',
44+
name: 'retail_date_prev_year',
4645
sql: `{CUBE.retail_date_prev_year}`,
4746
},
4847
{

packages/cubejs-schema-compiler/test/unit/fixtures/custom_calendar.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,7 @@ cubes:
4545
type: prior
4646
sql: "{CUBE.retail_date_prev_month}"
4747

48-
- interval: 1 year
49-
type: prior
48+
- name: retail_date_prev_year
5049
sql: "{CUBE.retail_date_prev_year}"
5150

5251
# All needed intervals should be defined explicitly

0 commit comments

Comments
 (0)