Skip to content

Commit 232d117

Browse files
committed
feat: Rename refreshRangeStart/End to buildRangeStart/End
1 parent bedc064 commit 232d117

File tree

3 files changed

+156
-17
lines changed

3 files changed

+156
-17
lines changed

packages/cubejs-schema-compiler/src/compiler/CubeEvaluator.js

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export class CubeEvaluator extends CubeSymbols {
1717
super.compile(cubes, errorReporter);
1818
const validCubes = this.cubeList.filter(cube => this.cubeValidator.isCubeValid(cube));
1919

20-
Object.values(validCubes).map(this.prepareCube);
20+
Object.values(validCubes).map((cube) => this.prepareCube(cube, errorReporter));
2121

2222
this.evaluatedCubes = R.fromPairs(validCubes.map(v => [v.name, v]));
2323
this.byFileName = R.groupBy(v => v.fileName, validCubes);
@@ -30,7 +30,7 @@ export class CubeEvaluator extends CubeSymbols {
3030
}));
3131
}
3232

33-
prepareCube(cube) {
33+
prepareCube(cube, errorReporter) {
3434
if (cube.preAggregations) {
3535
// eslint-disable-next-line no-restricted-syntax
3636
for (const preAggregation of Object.values(cube.preAggregations)) {
@@ -58,6 +58,28 @@ export class CubeEvaluator extends CubeSymbols {
5858
preAggregation.rollupReferences = preAggregation.rollups;
5959
delete preAggregation.rollups;
6060
}
61+
62+
if (preAggregation.buildRangeStart) {
63+
if (preAggregation.refreshRangeStart) {
64+
errorReporter.warning({
65+
message: 'You specified both buildRangeStart and refreshRangeStart, buildRangeStart will be used.'
66+
});
67+
}
68+
69+
preAggregation.refreshRangeStart = preAggregation.buildRangeStart;
70+
delete preAggregation.buildRangeStart;
71+
}
72+
73+
if (preAggregation.buildRangeEnd) {
74+
if (preAggregation.refreshRangeEnd) {
75+
errorReporter.warning({
76+
message: 'You specified both buildRangeEnd and refreshRangeEnd, buildRangeEnd will be used.'
77+
});
78+
}
79+
80+
preAggregation.refreshRangeEnd = preAggregation.buildRangeEnd;
81+
delete preAggregation.buildRangeEnd;
82+
}
6183
}
6284
}
6385
}

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

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -82,12 +82,6 @@ const BasePreAggregationWithoutPartitionGranularity = {
8282
useOriginalSqlPreAggregations: Joi.boolean(),
8383
external: Joi.boolean(),
8484
scheduledRefresh: Joi.boolean(),
85-
refreshRangeStart: {
86-
sql: Joi.func().required()
87-
},
88-
refreshRangeEnd: {
89-
sql: Joi.func().required()
90-
},
9185
indexes: Joi.object().pattern(identifierRegex, Joi.alternatives().try(
9286
Joi.object().keys({
9387
sql: Joi.func().required()
@@ -96,6 +90,20 @@ const BasePreAggregationWithoutPartitionGranularity = {
9690
columns: Joi.func().required()
9791
})
9892
)),
93+
// refreshRange was deprecated
94+
refreshRangeStart: {
95+
sql: Joi.func().required()
96+
},
97+
refreshRangeEnd: {
98+
sql: Joi.func().required()
99+
},
100+
// new api
101+
buildRangeStart: {
102+
sql: Joi.func().required()
103+
},
104+
buildRangeEnd: {
105+
sql: Joi.func().required()
106+
},
99107
};
100108

101109
const BasePreAggregation = {

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

Lines changed: 118 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import { prepareCompiler } from './PrepareCompiler';
22

3-
describe('Schema Testing', () => {
4-
const schemaCompile = async () => {
5-
const { compiler, cubeEvaluator } = prepareCompiler(`
3+
export function makeCubeSchema({ preAggregations }) {
4+
return `
65
cube('CubeA', {
76
sql: \`select * from test\`,
87
@@ -35,29 +34,58 @@ describe('Schema Testing', () => {
3534
},
3635
3736
preAggregations: {
38-
main: {
37+
${preAggregations}
38+
},
39+
})
40+
`;
41+
}
42+
43+
describe('Schema Testing', () => {
44+
const schemaCompile = async () => {
45+
const { compiler, cubeEvaluator } = prepareCompiler(
46+
makeCubeSchema({
47+
preAggregations: `
48+
main: {
3949
type: 'originalSql',
4050
timeDimension: createdAt,
4151
partitionGranularity: \`month\`,
52+
refreshRangeStart: {
53+
sql: 'SELECT NOW()',
54+
},
55+
refreshRangeEnd: {
56+
sql: 'SELECT NOW()',
57+
}
4258
},
4359
// Pre-aggregation without type, rollup is used by default
4460
countCreatedAt: {
4561
measureReferences: [count],
4662
timeDimensionReference: createdAt,
4763
granularity: \`day\`,
48-
partitionGranularity: \`month\`
64+
partitionGranularity: \`month\`,
65+
buildRangeStart: {
66+
sql: 'SELECT NOW()',
67+
},
68+
buildRangeEnd: {
69+
sql: 'SELECT NOW()',
70+
}
4971
},
5072
countCreatedAtWithoutReferences: {
5173
dimensions: [type],
5274
measures: [count],
5375
timeDimension: [createdAt],
5476
segments: [sfUsers],
5577
granularity: \`day\`,
56-
partitionGranularity: \`month\`
78+
partitionGranularity: \`month\`,
79+
buildRangeStart: {
80+
sql: 'SELECT NOW()',
81+
},
82+
buildRangeEnd: {
83+
sql: 'SELECT NOW()',
84+
}
5785
}
58-
},
59-
})
60-
`);
86+
`
87+
})
88+
);
6189
await compiler.compile();
6290

6391
return { compiler, cubeEvaluator };
@@ -73,6 +101,12 @@ describe('Schema Testing', () => {
73101
timeDimensionReference: expect.any(Function),
74102
partitionGranularity: 'month',
75103
type: 'originalSql',
104+
refreshRangeStart: {
105+
sql: expect.any(Function),
106+
},
107+
refreshRangeEnd: {
108+
sql: expect.any(Function),
109+
},
76110
},
77111
countCreatedAt: {
78112
external: false,
@@ -82,6 +116,12 @@ describe('Schema Testing', () => {
82116
timeDimensionReference: expect.any(Function),
83117
partitionGranularity: 'month',
84118
type: 'rollup',
119+
refreshRangeStart: {
120+
sql: expect.any(Function),
121+
},
122+
refreshRangeEnd: {
123+
sql: expect.any(Function),
124+
},
85125
},
86126
countCreatedAtWithoutReferences: {
87127
// because preview
@@ -94,6 +134,12 @@ describe('Schema Testing', () => {
94134
dimensionReferences: expect.any(Function),
95135
partitionGranularity: 'month',
96136
type: 'rollup',
137+
refreshRangeStart: {
138+
sql: expect.any(Function),
139+
},
140+
refreshRangeEnd: {
141+
sql: expect.any(Function),
142+
},
97143
}
98144
});
99145
});
@@ -114,6 +160,12 @@ describe('Schema Testing', () => {
114160
timeDimensionReference: expect.any(Function),
115161
partitionGranularity: 'month',
116162
type: 'originalSql',
163+
refreshRangeStart: {
164+
sql: expect.any(Function),
165+
},
166+
refreshRangeEnd: {
167+
sql: expect.any(Function),
168+
},
117169
},
118170
countCreatedAt: {
119171
// because preview
@@ -124,6 +176,12 @@ describe('Schema Testing', () => {
124176
timeDimensionReference: expect.any(Function),
125177
partitionGranularity: 'month',
126178
type: 'rollup',
179+
refreshRangeStart: {
180+
sql: expect.any(Function),
181+
},
182+
refreshRangeEnd: {
183+
sql: expect.any(Function),
184+
},
127185
},
128186
countCreatedAtWithoutReferences: {
129187
// because preview
@@ -136,7 +194,58 @@ describe('Schema Testing', () => {
136194
timeDimensionReference: expect.any(Function),
137195
partitionGranularity: 'month',
138196
type: 'rollup',
197+
refreshRangeStart: {
198+
sql: expect.any(Function),
199+
},
200+
refreshRangeEnd: {
201+
sql: expect.any(Function),
202+
},
139203
}
140204
});
141205
});
206+
207+
it('invalid schema', async () => {
208+
const logger = jest.fn();
209+
210+
const { compiler } = prepareCompiler(
211+
makeCubeSchema({
212+
preAggregations: `
213+
main: {
214+
type: 'originalSql',
215+
timeDimension: createdAt,
216+
partitionGranularity: \`month\`,
217+
refreshRangeStart: {
218+
sql: 'SELECT NOW()',
219+
},
220+
buildRangeStart: {
221+
sql: 'SELECT NOW()',
222+
},
223+
refreshRangeEnd: {
224+
sql: 'SELECT NOW()',
225+
},
226+
buildRangeEnd: {
227+
sql: 'SELECT NOW()',
228+
}
229+
},
230+
`
231+
}),
232+
{
233+
omitErrors: true,
234+
errorReport: {
235+
logger,
236+
}
237+
}
238+
);
239+
240+
await compiler.compile();
241+
compiler.throwIfAnyErrors();
242+
243+
expect(logger.mock.calls.length).toEqual(2);
244+
expect(logger.mock.calls[0]).toEqual([
245+
'You specified both buildRangeStart and refreshRangeStart, buildRangeStart will be used.'
246+
]);
247+
expect(logger.mock.calls[1]).toEqual([
248+
'You specified both buildRangeEnd and refreshRangeEnd, buildRangeEnd will be used.'
249+
]);
250+
});
142251
});

0 commit comments

Comments
 (0)