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

Commit

Permalink
Fixes #105
Browse files Browse the repository at this point in the history
  • Loading branch information
avivl committed Jul 1, 2019
1 parent 57f9455 commit 9606f9e
Show file tree
Hide file tree
Showing 6 changed files with 75 additions and 53 deletions.
38 changes: 25 additions & 13 deletions dist/module.js
Expand Up @@ -51310,16 +51310,22 @@ function () {
};

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

if (res) {
res = res[0].substr(1 + res[0].lastIndexOf(",")).trim();
interval[0] = res[0].split(",")[1];
interval[1] = res[0].split(",")[2];
}

return res;
return interval;
};

BigQueryQuery.getUnixSecondsFromString = function (str) {
if (str === undefined) {
return 0;
}

var res = _datasource.BigQueryDatasource._getShiftPeriod(str);

var groupPeriod = res[0];
Expand Down Expand Up @@ -51348,7 +51354,7 @@ function () {
return 31536000 * groupVal;
}

return "0";
return 0;
};

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

BigQueryQuery.prototype.getIntervalStr = function (interval) {
BigQueryQuery.prototype.getIntervalStr = function (interval, mininterval) {
var res = _datasource.BigQueryDatasource._getShiftPeriod(interval);

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

if (groupPeriod === "M") {
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'" + ")" + ")" + ")" + ")";
Expand Down Expand Up @@ -51733,18 +51742,21 @@ function () {
};

BigQueryQuery.prototype.replacetimeGroupAlias = function (q, alias) {
var interval = BigQueryQuery._getInterval(q, alias);
var res = BigQueryQuery._getInterval(q, alias);

var interval = res[0];
var mininterval = res[1];

if (!interval) {
return q;
}

var intervalStr = this.getIntervalStr(interval);
var intervalStr = this.getIntervalStr(interval, mininterval);

if (alias) {
return q.replace(/\$__timeGroupAlias\(([\w_.]+,+[a-zA-Z0-9_ ]+\))/g, intervalStr);
return q.replace(/\$__timeGroupAlias\(([\w_.]+,+[a-zA-Z0-9_ ]+.*\))/g, intervalStr);
} else {
return q.replace(/\$__timeGroup\(([\w_.]+,+[a-zA-Z0-9_ ]+\))/g, intervalStr);
return q.replace(/\$__timeGroup\(([\w_.]+,+[a-zA-Z0-9_ ]+.*\))/g, intervalStr);
}
};

Expand Down Expand Up @@ -53701,7 +53713,7 @@ function (_super) {
if (!_this.queryModel.hasTimeGroup()) {
options.push(_this.uiSegmentSrv.newSegment({
type: "time",
value: "time($__interval,none)"
value: "time($__interval,0)"
}));
}

Expand Down Expand Up @@ -54356,11 +54368,11 @@ register({
options: ["$__interval", "1s", "1min", "1h", "1d", "1w", "1m", "1y"],
type: "interval"
}, {
name: 'fill',
type: 'string',
options: ['none', 'NULL', 'previous', '0']
name: 'mininterval',
type: 'interval',
options: ["$__mininterval", "1s", "1min", "1h", "1d", "1w", "1m", "1y"]
}],
defaultParams: ['$__interval', 'none']
defaultParams: ['$__interval', '0']
});
register({
type: 'window',
Expand Down
2 changes: 1 addition & 1 deletion dist/module.js.map

Large diffs are not rendered by default.

54 changes: 32 additions & 22 deletions src/bigquery_query.ts
@@ -1,5 +1,5 @@
import _ from "lodash";
import { BigQueryDatasource } from './datasource';
import { BigQueryDatasource } from "./datasource";

export default class BigQueryQuery {
public static quoteLiteral(value) {
Expand Down Expand Up @@ -38,15 +38,20 @@ export default class BigQueryQuery {
}

public static _getInterval(q, alias: boolean) {
let res = alias
const interval: string[] = [];
const res = alias
? q.match(/(.*\$__timeGroupAlias\(([\w._]+,)).*?(?=\))/g)
: q.match(/(.*\$__timeGroup\(([\w_.]+,)).*?(?=\))/g);
if (res) {
res = res[0].substr(1 + res[0].lastIndexOf(",")).trim();
interval[0] = res[0].split(",")[1];
interval[1] = res[0].split(",")[2];
}
return res;
return interval;
}
public static getUnixSecondsFromString(str) {
if (str === undefined) {
return 0;
}
const res = BigQueryDatasource._getShiftPeriod(str);
const groupPeriod = res[0];
const groupVal = res[1];
Expand All @@ -66,7 +71,7 @@ export default class BigQueryQuery {
case "y":
return 31536000 * groupVal;
}
return "0";
return 0;
}

public static getTimeShift(q) {
Expand Down Expand Up @@ -115,12 +120,17 @@ export default class BigQueryQuery {
// give interpolateQueryStr access to this
this.interpolateQueryStr = this.interpolateQueryStr.bind(this);
}
public getIntervalStr(interval: string) {
public getIntervalStr(interval: string, mininterval: string) {
const res = BigQueryDatasource._getShiftPeriod(interval);
const groupPeriod = res[0];
let IntervalStr =
"TIMESTAMP_SECONDS(DIV(UNIX_SECONDS(" + this._dateToTimestamp() + "), ";
const unixSeconds = BigQueryQuery.getUnixSecondsFromString(interval);
let unixSeconds = BigQueryQuery.getUnixSecondsFromString(interval);
let minUnixSeconds;
minUnixSeconds = !(mininterval !== undefined || mininterval !== "0")
? 0
: BigQueryQuery.getUnixSecondsFromString(mininterval);
unixSeconds = Math.max(unixSeconds, minUnixSeconds);
if (groupPeriod === "M") {
IntervalStr =
"TIMESTAMP(" +
Expand All @@ -141,7 +151,6 @@ export default class BigQueryQuery {
return IntervalStr;
}


public hasTimeGroup() {
return _.find(this.target.group, (g: any) => g.type === "time");
}
Expand Down Expand Up @@ -267,10 +276,7 @@ export default class BigQueryQuery {
column,
(g: any) => g.type === "window" || g.type === "moving_window"
);
const timeshift = _.find(
column,
(g: any) => g.type === "timeshift"
);
const timeshift = _.find(column, (g: any) => g.type === "timeshift");
query = this._buildAggregate(aggregate, query);
if (windows) {
this.isWindow = true;
Expand Down Expand Up @@ -530,35 +536,39 @@ export default class BigQueryQuery {
const myRegexp = /\$__timeFilter\(([\w_.]+)\)/g;
this.target.timeColumn = myRegexp.exec(q)[1];
}
const range = BigQueryQuery.quoteFiledName(this.target.timeColumn) + " BETWEEN " + from + " AND " + to;
const range =
BigQueryQuery.quoteFiledName(this.target.timeColumn) +
" BETWEEN " +
from +
" AND " +
to;
return q.replace(/\$__timeFilter\(([\w_.]+)\)/g, range);
}

public replacetimeGroupAlias(q, alias: boolean) {
const interval = BigQueryQuery._getInterval(q, alias);
const res = BigQueryQuery._getInterval(q, alias);
const interval = res[0];
const mininterval = res[1];
if (!interval) {
return q;
}

const intervalStr = this.getIntervalStr(
interval,
);
const intervalStr = this.getIntervalStr(interval, mininterval);
if (alias) {
return q.replace(
/\$__timeGroupAlias\(([\w_.]+,+[a-zA-Z0-9_ ]+\))/g,
/\$__timeGroupAlias\(([\w_.]+,+[a-zA-Z0-9_ ]+.*\))/g,
intervalStr
);
} else {
return q.replace(
/\$__timeGroup\(([\w_.]+,+[a-zA-Z0-9_ ]+\))/g,
/\$__timeGroup\(([\w_.]+,+[a-zA-Z0-9_ ]+.*\))/g,
intervalStr
);
}
}

private _dateToTimestamp()
{
if (this.target.timeColumnType === "DATE"){
private _dateToTimestamp() {
if (this.target.timeColumnType === "DATE") {
return (
"Timestamp(" +
BigQueryQuery.quoteFiledName(this.target.timeColumn) +
Expand Down
2 changes: 1 addition & 1 deletion src/query_ctrl.ts
Expand Up @@ -736,7 +736,7 @@ export class BigQueryQueryCtrl extends QueryCtrl {
options.push(
this.uiSegmentSrv.newSegment({
type: "time",
value: "time($__interval,none)"
value: "time($__interval,0)"
})
);
}
Expand Down
24 changes: 12 additions & 12 deletions src/specs/bigquery_query.test.ts
Expand Up @@ -290,22 +290,22 @@ describe("BigQueryQuery", () => {
};
it("Check macros", () => {
expect(query.expend_macros(options)).toBe(
"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)"
"TIMESTAMP_SECONDS(DIV(UNIX_SECONDS(`t`), 86400) * 86400)"
);
target.rawSql =
"$__timeGroupAlias(start_date,1min), $__timeGroup(start_date,1min) WHERE $__timeFilter(start_date)";
expect(query.expend_macros(options)).toBe(
"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)"
"TIMESTAMP_SECONDS(DIV(UNIX_SECONDS(`t`), 60) * 60)"
);
target.rawSql =
"$__timeGroupAlias(start_date,1w), $__timeGroup(start_date,1w) WHERE $__timeFilter(start_date)";
expect(query.expend_macros(options)).toBe(
"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)"
"TIMESTAMP_SECONDS(DIV(UNIX_SECONDS(`t`), 604800) * 604800)"
);
target.rawSql =
"$__timeGroupAlias(start_date,1h), $__timeGroup(start_date,1h) WHERE $__timeFilter(start_date)";
expect(query.expend_macros(options)).toBe(
"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)"
"TIMESTAMP_SECONDS(DIV(UNIX_SECONDS(`t`), 3600) * 3600)"
);
});
});
Expand All @@ -327,25 +327,25 @@ describe("BigQueryQuery", () => {
where: []
};
const query = new BigQueryQuery(target, templateSrv);
expect(query.getIntervalStr("1s")).toBe(
expect(query.getIntervalStr("1s", "0")).toBe(
"TIMESTAMP_SECONDS(DIV(UNIX_SECONDS(`my_data`), 1) * 1)"
);
expect(query.getIntervalStr("1min")).toBe(
expect(query.getIntervalStr("1min", "0")).toBe(
"TIMESTAMP_SECONDS(DIV(UNIX_SECONDS(`my_data`), 60) * 60)"
);
expect(query.getIntervalStr("1h")).toBe(
expect(query.getIntervalStr("1h", "1s")).toBe(
"TIMESTAMP_SECONDS(DIV(UNIX_SECONDS(`my_data`), 3600) * 3600)"
);
expect(query.getIntervalStr("1d")).toBe(
expect(query.getIntervalStr("1d", "1s")).toBe(
"TIMESTAMP_SECONDS(DIV(UNIX_SECONDS(`my_data`), 86400) * 86400)"
);
expect(query.getIntervalStr("1w")).toBe(
expect(query.getIntervalStr("1w", "1d")).toBe(
"TIMESTAMP_SECONDS(DIV(UNIX_SECONDS(`my_data`), 604800) * 604800)"
);
expect(query.getIntervalStr("1m")).toBe(
expect(query.getIntervalStr("1m", "1d")).toBe(
"TIMESTAMP( (PARSE_DATE( \"%Y-%m-%d\",CONCAT( CAST((EXTRACT(YEAR FROM `my_data`)) AS STRING),'-',CAST((EXTRACT(MONTH FROM `my_data`)) AS STRING),'-','01'))))"
);
expect(query.getIntervalStr("1y")).toBe(
expect(query.getIntervalStr("1y", "2d")).toBe(
"TIMESTAMP_SECONDS(DIV(UNIX_SECONDS(`my_data`), 31536000) * 31536000)"
);
});
Expand All @@ -358,7 +358,7 @@ describe("BigQueryQuery", () => {
expect(BigQueryQuery.getUnixSecondsFromString("1w")).toBe(604800);
expect(BigQueryQuery.getUnixSecondsFromString("1m")).toBe(2629743);
expect(BigQueryQuery.getUnixSecondsFromString("1y")).toBe(31536000);
expect(BigQueryQuery.getUnixSecondsFromString("1z")).toBe("0");
expect(BigQueryQuery.getUnixSecondsFromString("1z")).toBe(0);
});

describe("replaceTimeShift", () => {
Expand Down
8 changes: 4 additions & 4 deletions src/sql_part.ts
Expand Up @@ -159,12 +159,12 @@ register({
type: "interval"
},
{
name: 'fill',
type: 'string',
options: ['none', 'NULL', 'previous', '0'],
name: 'mininterval',
type: 'interval',
options: ["$__mininterval", "1s", "1min", "1h", "1d", "1w", "1m", "1y"],
},
],
defaultParams: ['$__interval', 'none'],
defaultParams: ['$__interval', '0'],
});

register({
Expand Down

0 comments on commit 9606f9e

Please sign in to comment.