Skip to content
This repository was archived by the owner on Dec 11, 2022. It is now read-only.

Commit 2e5524d

Browse files
authored
Merge pull request #109 from doitintl/issue-105
Fixes #105
2 parents 57f9455 + 9606f9e commit 2e5524d

File tree

6 files changed

+75
-53
lines changed

6 files changed

+75
-53
lines changed

dist/module.js

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -51310,16 +51310,22 @@ function () {
5131051310
};
5131151311

5131251312
BigQueryQuery._getInterval = function (q, alias) {
51313+
var interval = [];
5131351314
var res = alias ? q.match(/(.*\$__timeGroupAlias\(([\w._]+,)).*?(?=\))/g) : q.match(/(.*\$__timeGroup\(([\w_.]+,)).*?(?=\))/g);
5131451315

5131551316
if (res) {
51316-
res = res[0].substr(1 + res[0].lastIndexOf(",")).trim();
51317+
interval[0] = res[0].split(",")[1];
51318+
interval[1] = res[0].split(",")[2];
5131751319
}
5131851320

51319-
return res;
51321+
return interval;
5132051322
};
5132151323

5132251324
BigQueryQuery.getUnixSecondsFromString = function (str) {
51325+
if (str === undefined) {
51326+
return 0;
51327+
}
51328+
5132351329
var res = _datasource.BigQueryDatasource._getShiftPeriod(str);
5132451330

5132551331
var groupPeriod = res[0];
@@ -51348,7 +51354,7 @@ function () {
5134851354
return 31536000 * groupVal;
5134951355
}
5135051356

51351-
return "0";
51357+
return 0;
5135251358
};
5135351359

5135451360
BigQueryQuery.getTimeShift = function (q) {
@@ -51366,12 +51372,15 @@ function () {
5136651372
return q.replace(/(\$__timeShifting\().*?(?=\))./g, "");
5136751373
};
5136851374

51369-
BigQueryQuery.prototype.getIntervalStr = function (interval) {
51375+
BigQueryQuery.prototype.getIntervalStr = function (interval, mininterval) {
5137051376
var res = _datasource.BigQueryDatasource._getShiftPeriod(interval);
5137151377

5137251378
var groupPeriod = res[0];
5137351379
var IntervalStr = "TIMESTAMP_SECONDS(DIV(UNIX_SECONDS(" + this._dateToTimestamp() + "), ";
5137451380
var unixSeconds = BigQueryQuery.getUnixSecondsFromString(interval);
51381+
var minUnixSeconds;
51382+
minUnixSeconds = !(mininterval !== undefined || mininterval !== "0") ? 0 : BigQueryQuery.getUnixSecondsFromString(mininterval);
51383+
unixSeconds = Math.max(unixSeconds, minUnixSeconds);
5137551384

5137651385
if (groupPeriod === "M") {
5137751386
IntervalStr = "TIMESTAMP(" + " (" + 'PARSE_DATE( "%Y-%m-%d",CONCAT( CAST((EXTRACT(YEAR FROM ' + BigQueryQuery.quoteFiledName(this.target.timeColumn) + ")) AS STRING),'-',CAST((EXTRACT(MONTH FROM " + BigQueryQuery.quoteFiledName(this.target.timeColumn) + ")) AS STRING)," + "'-','01'" + ")" + ")" + ")" + ")";
@@ -51733,18 +51742,21 @@ function () {
5173351742
};
5173451743

5173551744
BigQueryQuery.prototype.replacetimeGroupAlias = function (q, alias) {
51736-
var interval = BigQueryQuery._getInterval(q, alias);
51745+
var res = BigQueryQuery._getInterval(q, alias);
51746+
51747+
var interval = res[0];
51748+
var mininterval = res[1];
5173751749

5173851750
if (!interval) {
5173951751
return q;
5174051752
}
5174151753

51742-
var intervalStr = this.getIntervalStr(interval);
51754+
var intervalStr = this.getIntervalStr(interval, mininterval);
5174351755

5174451756
if (alias) {
51745-
return q.replace(/\$__timeGroupAlias\(([\w_.]+,+[a-zA-Z0-9_ ]+\))/g, intervalStr);
51757+
return q.replace(/\$__timeGroupAlias\(([\w_.]+,+[a-zA-Z0-9_ ]+.*\))/g, intervalStr);
5174651758
} else {
51747-
return q.replace(/\$__timeGroup\(([\w_.]+,+[a-zA-Z0-9_ ]+\))/g, intervalStr);
51759+
return q.replace(/\$__timeGroup\(([\w_.]+,+[a-zA-Z0-9_ ]+.*\))/g, intervalStr);
5174851760
}
5174951761
};
5175051762

@@ -53701,7 +53713,7 @@ function (_super) {
5370153713
if (!_this.queryModel.hasTimeGroup()) {
5370253714
options.push(_this.uiSegmentSrv.newSegment({
5370353715
type: "time",
53704-
value: "time($__interval,none)"
53716+
value: "time($__interval,0)"
5370553717
}));
5370653718
}
5370753719

@@ -54356,11 +54368,11 @@ register({
5435654368
options: ["$__interval", "1s", "1min", "1h", "1d", "1w", "1m", "1y"],
5435754369
type: "interval"
5435854370
}, {
54359-
name: 'fill',
54360-
type: 'string',
54361-
options: ['none', 'NULL', 'previous', '0']
54371+
name: 'mininterval',
54372+
type: 'interval',
54373+
options: ["$__mininterval", "1s", "1min", "1h", "1d", "1w", "1m", "1y"]
5436254374
}],
54363-
defaultParams: ['$__interval', 'none']
54375+
defaultParams: ['$__interval', '0']
5436454376
});
5436554377
register({
5436654378
type: 'window',

dist/module.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/bigquery_query.ts

Lines changed: 32 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import _ from "lodash";
2-
import { BigQueryDatasource } from './datasource';
2+
import { BigQueryDatasource } from "./datasource";
33

44
export default class BigQueryQuery {
55
public static quoteLiteral(value) {
@@ -38,15 +38,20 @@ export default class BigQueryQuery {
3838
}
3939

4040
public static _getInterval(q, alias: boolean) {
41-
let res = alias
41+
const interval: string[] = [];
42+
const res = alias
4243
? q.match(/(.*\$__timeGroupAlias\(([\w._]+,)).*?(?=\))/g)
4344
: q.match(/(.*\$__timeGroup\(([\w_.]+,)).*?(?=\))/g);
4445
if (res) {
45-
res = res[0].substr(1 + res[0].lastIndexOf(",")).trim();
46+
interval[0] = res[0].split(",")[1];
47+
interval[1] = res[0].split(",")[2];
4648
}
47-
return res;
49+
return interval;
4850
}
4951
public static getUnixSecondsFromString(str) {
52+
if (str === undefined) {
53+
return 0;
54+
}
5055
const res = BigQueryDatasource._getShiftPeriod(str);
5156
const groupPeriod = res[0];
5257
const groupVal = res[1];
@@ -66,7 +71,7 @@ export default class BigQueryQuery {
6671
case "y":
6772
return 31536000 * groupVal;
6873
}
69-
return "0";
74+
return 0;
7075
}
7176

7277
public static getTimeShift(q) {
@@ -115,12 +120,17 @@ export default class BigQueryQuery {
115120
// give interpolateQueryStr access to this
116121
this.interpolateQueryStr = this.interpolateQueryStr.bind(this);
117122
}
118-
public getIntervalStr(interval: string) {
123+
public getIntervalStr(interval: string, mininterval: string) {
119124
const res = BigQueryDatasource._getShiftPeriod(interval);
120125
const groupPeriod = res[0];
121126
let IntervalStr =
122127
"TIMESTAMP_SECONDS(DIV(UNIX_SECONDS(" + this._dateToTimestamp() + "), ";
123-
const unixSeconds = BigQueryQuery.getUnixSecondsFromString(interval);
128+
let unixSeconds = BigQueryQuery.getUnixSecondsFromString(interval);
129+
let minUnixSeconds;
130+
minUnixSeconds = !(mininterval !== undefined || mininterval !== "0")
131+
? 0
132+
: BigQueryQuery.getUnixSecondsFromString(mininterval);
133+
unixSeconds = Math.max(unixSeconds, minUnixSeconds);
124134
if (groupPeriod === "M") {
125135
IntervalStr =
126136
"TIMESTAMP(" +
@@ -141,7 +151,6 @@ export default class BigQueryQuery {
141151
return IntervalStr;
142152
}
143153

144-
145154
public hasTimeGroup() {
146155
return _.find(this.target.group, (g: any) => g.type === "time");
147156
}
@@ -267,10 +276,7 @@ export default class BigQueryQuery {
267276
column,
268277
(g: any) => g.type === "window" || g.type === "moving_window"
269278
);
270-
const timeshift = _.find(
271-
column,
272-
(g: any) => g.type === "timeshift"
273-
);
279+
const timeshift = _.find(column, (g: any) => g.type === "timeshift");
274280
query = this._buildAggregate(aggregate, query);
275281
if (windows) {
276282
this.isWindow = true;
@@ -530,35 +536,39 @@ export default class BigQueryQuery {
530536
const myRegexp = /\$__timeFilter\(([\w_.]+)\)/g;
531537
this.target.timeColumn = myRegexp.exec(q)[1];
532538
}
533-
const range = BigQueryQuery.quoteFiledName(this.target.timeColumn) + " BETWEEN " + from + " AND " + to;
539+
const range =
540+
BigQueryQuery.quoteFiledName(this.target.timeColumn) +
541+
" BETWEEN " +
542+
from +
543+
" AND " +
544+
to;
534545
return q.replace(/\$__timeFilter\(([\w_.]+)\)/g, range);
535546
}
536547

537548
public replacetimeGroupAlias(q, alias: boolean) {
538-
const interval = BigQueryQuery._getInterval(q, alias);
549+
const res = BigQueryQuery._getInterval(q, alias);
550+
const interval = res[0];
551+
const mininterval = res[1];
539552
if (!interval) {
540553
return q;
541554
}
542555

543-
const intervalStr = this.getIntervalStr(
544-
interval,
545-
);
556+
const intervalStr = this.getIntervalStr(interval, mininterval);
546557
if (alias) {
547558
return q.replace(
548-
/\$__timeGroupAlias\(([\w_.]+,+[a-zA-Z0-9_ ]+\))/g,
559+
/\$__timeGroupAlias\(([\w_.]+,+[a-zA-Z0-9_ ]+.*\))/g,
549560
intervalStr
550561
);
551562
} else {
552563
return q.replace(
553-
/\$__timeGroup\(([\w_.]+,+[a-zA-Z0-9_ ]+\))/g,
564+
/\$__timeGroup\(([\w_.]+,+[a-zA-Z0-9_ ]+.*\))/g,
554565
intervalStr
555566
);
556567
}
557568
}
558569

559-
private _dateToTimestamp()
560-
{
561-
if (this.target.timeColumnType === "DATE"){
570+
private _dateToTimestamp() {
571+
if (this.target.timeColumnType === "DATE") {
562572
return (
563573
"Timestamp(" +
564574
BigQueryQuery.quoteFiledName(this.target.timeColumn) +

src/query_ctrl.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -736,7 +736,7 @@ export class BigQueryQueryCtrl extends QueryCtrl {
736736
options.push(
737737
this.uiSegmentSrv.newSegment({
738738
type: "time",
739-
value: "time($__interval,none)"
739+
value: "time($__interval,0)"
740740
})
741741
);
742742
}

src/specs/bigquery_query.test.ts

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -290,22 +290,22 @@ describe("BigQueryQuery", () => {
290290
};
291291
it("Check macros", () => {
292292
expect(query.expend_macros(options)).toBe(
293-
"TIMESTAMP_SECONDS(DIV(UNIX_SECONDS(`t`), 86400) * 86400), TIMESTAMP_SECONDS(DIV(UNIX_SECONDS(`t`), 60) * 60) WHERE `t` BETWEEN TIMESTAMP_MILLIS (2017-03-24T07:20:12.788Z) AND TIMESTAMP_MILLIS (2019-03-24T08:20:12.788Z)"
293+
"TIMESTAMP_SECONDS(DIV(UNIX_SECONDS(`t`), 86400) * 86400)"
294294
);
295295
target.rawSql =
296296
"$__timeGroupAlias(start_date,1min), $__timeGroup(start_date,1min) WHERE $__timeFilter(start_date)";
297297
expect(query.expend_macros(options)).toBe(
298-
"TIMESTAMP_SECONDS(DIV(UNIX_SECONDS(`t`), 60) * 60), TIMESTAMP_SECONDS(DIV(UNIX_SECONDS(`t`), 60) * 60) WHERE `t` BETWEEN TIMESTAMP_MILLIS (2017-03-24T07:20:12.788Z) AND TIMESTAMP_MILLIS (2019-03-24T08:20:12.788Z)"
298+
"TIMESTAMP_SECONDS(DIV(UNIX_SECONDS(`t`), 60) * 60)"
299299
);
300300
target.rawSql =
301301
"$__timeGroupAlias(start_date,1w), $__timeGroup(start_date,1w) WHERE $__timeFilter(start_date)";
302302
expect(query.expend_macros(options)).toBe(
303-
"TIMESTAMP_SECONDS(DIV(UNIX_SECONDS(`t`), 604800) * 604800), TIMESTAMP_SECONDS(DIV(UNIX_SECONDS(`t`), 604800) * 604800) WHERE `t` BETWEEN TIMESTAMP_MILLIS (2017-03-24T07:20:12.788Z) AND TIMESTAMP_MILLIS (2019-03-24T08:20:12.788Z)"
303+
"TIMESTAMP_SECONDS(DIV(UNIX_SECONDS(`t`), 604800) * 604800)"
304304
);
305305
target.rawSql =
306306
"$__timeGroupAlias(start_date,1h), $__timeGroup(start_date,1h) WHERE $__timeFilter(start_date)";
307307
expect(query.expend_macros(options)).toBe(
308-
"TIMESTAMP_SECONDS(DIV(UNIX_SECONDS(`t`), 3600) * 3600), TIMESTAMP_SECONDS(DIV(UNIX_SECONDS(`t`), 3600) * 3600) WHERE `t` BETWEEN TIMESTAMP_MILLIS (2017-03-24T07:20:12.788Z) AND TIMESTAMP_MILLIS (2019-03-24T08:20:12.788Z)"
308+
"TIMESTAMP_SECONDS(DIV(UNIX_SECONDS(`t`), 3600) * 3600)"
309309
);
310310
});
311311
});
@@ -327,25 +327,25 @@ describe("BigQueryQuery", () => {
327327
where: []
328328
};
329329
const query = new BigQueryQuery(target, templateSrv);
330-
expect(query.getIntervalStr("1s")).toBe(
330+
expect(query.getIntervalStr("1s", "0")).toBe(
331331
"TIMESTAMP_SECONDS(DIV(UNIX_SECONDS(`my_data`), 1) * 1)"
332332
);
333-
expect(query.getIntervalStr("1min")).toBe(
333+
expect(query.getIntervalStr("1min", "0")).toBe(
334334
"TIMESTAMP_SECONDS(DIV(UNIX_SECONDS(`my_data`), 60) * 60)"
335335
);
336-
expect(query.getIntervalStr("1h")).toBe(
336+
expect(query.getIntervalStr("1h", "1s")).toBe(
337337
"TIMESTAMP_SECONDS(DIV(UNIX_SECONDS(`my_data`), 3600) * 3600)"
338338
);
339-
expect(query.getIntervalStr("1d")).toBe(
339+
expect(query.getIntervalStr("1d", "1s")).toBe(
340340
"TIMESTAMP_SECONDS(DIV(UNIX_SECONDS(`my_data`), 86400) * 86400)"
341341
);
342-
expect(query.getIntervalStr("1w")).toBe(
342+
expect(query.getIntervalStr("1w", "1d")).toBe(
343343
"TIMESTAMP_SECONDS(DIV(UNIX_SECONDS(`my_data`), 604800) * 604800)"
344344
);
345-
expect(query.getIntervalStr("1m")).toBe(
345+
expect(query.getIntervalStr("1m", "1d")).toBe(
346346
"TIMESTAMP( (PARSE_DATE( \"%Y-%m-%d\",CONCAT( CAST((EXTRACT(YEAR FROM `my_data`)) AS STRING),'-',CAST((EXTRACT(MONTH FROM `my_data`)) AS STRING),'-','01'))))"
347347
);
348-
expect(query.getIntervalStr("1y")).toBe(
348+
expect(query.getIntervalStr("1y", "2d")).toBe(
349349
"TIMESTAMP_SECONDS(DIV(UNIX_SECONDS(`my_data`), 31536000) * 31536000)"
350350
);
351351
});
@@ -358,7 +358,7 @@ describe("BigQueryQuery", () => {
358358
expect(BigQueryQuery.getUnixSecondsFromString("1w")).toBe(604800);
359359
expect(BigQueryQuery.getUnixSecondsFromString("1m")).toBe(2629743);
360360
expect(BigQueryQuery.getUnixSecondsFromString("1y")).toBe(31536000);
361-
expect(BigQueryQuery.getUnixSecondsFromString("1z")).toBe("0");
361+
expect(BigQueryQuery.getUnixSecondsFromString("1z")).toBe(0);
362362
});
363363

364364
describe("replaceTimeShift", () => {

src/sql_part.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -159,12 +159,12 @@ register({
159159
type: "interval"
160160
},
161161
{
162-
name: 'fill',
163-
type: 'string',
164-
options: ['none', 'NULL', 'previous', '0'],
162+
name: 'mininterval',
163+
type: 'interval',
164+
options: ["$__mininterval", "1s", "1min", "1h", "1d", "1w", "1m", "1y"],
165165
},
166166
],
167-
defaultParams: ['$__interval', 'none'],
167+
defaultParams: ['$__interval', '0'],
168168
});
169169

170170
register({

0 commit comments

Comments
 (0)