Skip to content

Commit 69f5184

Browse files
committed
override runningTotals funcs for BQ.
1 parent d73cd4c commit 69f5184

File tree

2 files changed

+71
-7
lines changed

2 files changed

+71
-7
lines changed

packages/cubejs-schema-compiler/src/adapter/BaseQuery.js

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -958,7 +958,7 @@ export class BaseQuery {
958958
.map(
959959
d => [
960960
d,
961-
(_dateFrom, dateTo, dateField, dimensionDateFrom, _dimensionDateTo) => `${dateField} >= ${dimensionDateFrom} AND ${dateField} <= ${this.timeStampCast(dateTo)}`
961+
(_dateFrom, dateTo, dateField, dimensionDateFrom, _dimensionDateTo) => `${dateField} >= ${dimensionDateFrom} AND ${dateField} <= ${dateTo}`
962962
]
963963
);
964964
}
@@ -969,7 +969,7 @@ export class BaseQuery {
969969
.map(
970970
d => [
971971
d,
972-
(dateFrom, dateTo, dateField, _dimensionDateFrom, _dimensionDateTo, _isFromStartToEnd) => `${dateField} >= ${this.timeGroupedColumn(granularity, dateFrom)} AND ${dateField} <= ${this.timeStampCast(dateTo)}`
972+
(dateFrom, dateTo, dateField, _dimensionDateFrom, _dimensionDateTo, _isFromStartToEnd) => `${dateField} >= ${this.timeGroupedColumn(granularity, dateFrom)} AND ${dateField} <= ${dateTo}`
973973
]
974974
);
975975
}
@@ -979,20 +979,20 @@ export class BaseQuery {
979979
return this.timeDimensions
980980
.filter(td => td.granularity)
981981
.map(
982-
d => [d, (dateFrom, dateTo, dateField, dimensionDateFrom, dimensionDateTo, isFromStartToEnd) => {
982+
d => [d, (dateFrom, dateTo, dateField, _dimensionDateFrom, _dimensionDateTo, isFromStartToEnd) => {
983983
// dateFrom based window
984984
const conditions = [];
985985
if (trailingInterval !== 'unbounded') {
986986
const startDate = isFromStartToEnd || offset === 'start' ? dateFrom : dateTo;
987987
const trailingStart = trailingInterval ? this.subtractInterval(startDate, trailingInterval) : startDate;
988988
const sign = offset === 'start' ? '>=' : '>';
989-
conditions.push(`${dateField} ${sign} ${this.timeStampCast(trailingStart)}`);
989+
conditions.push(`${dateField} ${sign} ${trailingStart}`);
990990
}
991991
if (leadingInterval !== 'unbounded') {
992992
const endDate = isFromStartToEnd || offset === 'end' ? dateTo : dateFrom;
993993
const leadingEnd = leadingInterval ? this.addInterval(endDate, leadingInterval) : endDate;
994994
const sign = offset === 'end' ? '<=' : '<';
995-
conditions.push(`${dateField} ${sign} ${this.timeStampCast(leadingEnd)}`);
995+
conditions.push(`${dateField} ${sign} ${leadingEnd}`);
996996
}
997997
return conditions.length ? conditions.join(' AND ') : '1 = 1';
998998
}]
@@ -1843,8 +1843,11 @@ export class BaseQuery {
18431843
.join(', ');
18441844
}
18451845

1846-
// BigQuery has strict date type and can not automatically convert between date
1847-
// and timestamp, so we override dateFromStartToEndConditionSql() in BigQuery Dialect
1846+
/**
1847+
* BigQuery has strict date type and can not automatically convert between date
1848+
* and timestamp, so we override dateFromStartToEndConditionSql() in BigQuery Dialect
1849+
* @protected
1850+
*/
18481851
dateFromStartToEndConditionSql(dateJoinCondition, fromRollup, isFromStartToEnd) {
18491852
return dateJoinCondition.map(
18501853
// TODO Consider adding strict definitions of local and UTC time type

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

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,67 @@ export class BigqueryQuery extends BaseQuery {
215215
return `UNIX_SECONDS(${this.nowTimestampSql()})`;
216216
}
217217

218+
/**
219+
* Should be protected, but BaseQuery is in js
220+
* Overridden from BaseQuery to support BigQuery strict data types for
221+
* joining conditions (note timeStampCast)
222+
*/
223+
public override runningTotalDateJoinCondition() {
224+
return this.timeDimensions
225+
.map(
226+
d => [
227+
d,
228+
(_dateFrom: string, dateTo: string, dateField: string, dimensionDateFrom: string, _dimensionDateTo: string) => `${dateField} >= ${dimensionDateFrom} AND ${dateField} <= ${this.timeStampCast(dateTo)}`
229+
]
230+
);
231+
}
232+
233+
/**
234+
* Should be protected, but BaseQuery is in js
235+
* Overridden from BaseQuery to support BigQuery strict data types for
236+
* joining conditions (note timeStampCast)
237+
*/
238+
public override rollingWindowToDateJoinCondition(granularity) {
239+
return this.timeDimensions
240+
.filter(td => td.granularity)
241+
.map(
242+
d => [
243+
d,
244+
(dateFrom: string, dateTo: string, dateField: string, _dimensionDateFrom: string, _dimensionDateTo: string, _isFromStartToEnd: boolean) => `${dateField} >= ${this.timeGroupedColumn(granularity, dateFrom)} AND ${dateField} <= ${this.timeStampCast(dateTo)}`
245+
]
246+
);
247+
}
248+
249+
/**
250+
* Should be protected, but BaseQuery is in js
251+
* Overridden from BaseQuery to support BigQuery strict data types for
252+
* joining conditions (note timeStampCast)
253+
*/
254+
public override rollingWindowDateJoinCondition(trailingInterval, leadingInterval, offset) {
255+
offset = offset || 'end';
256+
return this.timeDimensions
257+
.filter(td => td.granularity)
258+
.map(
259+
d => [d, (dateFrom: string, dateTo: string, dateField: string, _dimensionDateFrom: string, _dimensionDateTo: string, isFromStartToEnd: boolean) => {
260+
// dateFrom based window
261+
const conditions: string[] = [];
262+
if (trailingInterval !== 'unbounded') {
263+
const startDate = isFromStartToEnd || offset === 'start' ? dateFrom : dateTo;
264+
const trailingStart = trailingInterval ? this.subtractInterval(startDate, trailingInterval) : startDate;
265+
const sign = offset === 'start' ? '>=' : '>';
266+
conditions.push(`${dateField} ${sign} ${this.timeStampCast(trailingStart)}`);
267+
}
268+
if (leadingInterval !== 'unbounded') {
269+
const endDate = isFromStartToEnd || offset === 'end' ? dateTo : dateFrom;
270+
const leadingEnd = leadingInterval ? this.addInterval(endDate, leadingInterval) : endDate;
271+
const sign = offset === 'end' ? '<=' : '<';
272+
conditions.push(`${dateField} ${sign} ${this.timeStampCast(leadingEnd)}`);
273+
}
274+
return conditions.length ? conditions.join(' AND ') : '1 = 1';
275+
}]
276+
);
277+
}
278+
218279
// Should be protected, but BaseQuery is in js
219280
public override dateFromStartToEndConditionSql(dateJoinCondition, fromRollup, isFromStartToEnd) {
220281
return dateJoinCondition.map(

0 commit comments

Comments
 (0)