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

Commit f88d240

Browse files
authored
Merge pull request #167 from doitintl/issue-165
Fixes #165
2 parents 848cd4b + bf88c63 commit f88d240

File tree

6 files changed

+386
-351
lines changed

6 files changed

+386
-351
lines changed

dist/module.js

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58975,18 +58975,26 @@ function () {
5897558975
};
5897658976

5897758977
BigQueryQuery.prototype.replaceTimeFilters = function (q, options) {
58978+
var fromD = this.templateSrv.timeRange.from._d;
58979+
var toD = this.templateSrv.timeRange.to._d;
58980+
58981+
if (this.target.convertToUTC === true) {
58982+
fromD = new Date(this.templateSrv.timeRange.from._d.getTime() + this.templateSrv.timeRange.from._d.getTimezoneOffset() * 60000);
58983+
toD = new Date(this.templateSrv.timeRange.to._d.getTime() + this.templateSrv.timeRange.to._d.getTimezoneOffset() * 60000);
58984+
}
58985+
5897858986
var to = "";
5897958987
var from = "";
5898058988

5898158989
if (this.target.timeColumnType === "DATE") {
58982-
from = "'" + BigQueryQuery.formatDateToString(this.templateSrv.timeRange.from._d, "-") + "'";
58983-
to = "'" + BigQueryQuery.formatDateToString(this.templateSrv.timeRange.to._d, "-") + "'";
58990+
from = "'" + BigQueryQuery.formatDateToString(fromD, "-") + "'";
58991+
to = "'" + BigQueryQuery.formatDateToString(toD, "-") + "'";
5898458992
} else if (this.target.timeColumnType === "DATETIME") {
58985-
from = "'" + BigQueryQuery.formatDateToString(this.templateSrv.timeRange.from._d, "-", true) + "'";
58986-
to = "'" + BigQueryQuery.formatDateToString(this.templateSrv.timeRange.to._d, "-", true) + "'";
58993+
from = "'" + BigQueryQuery.formatDateToString(fromD, "-", true) + "'";
58994+
to = "'" + BigQueryQuery.formatDateToString(toD, "-", true) + "'";
5898758995
} else {
58988-
from = "TIMESTAMP_MILLIS (" + options.range.from.valueOf().toString() + ")";
58989-
to = "TIMESTAMP_MILLIS (" + options.range.to.valueOf().toString() + ")";
58996+
from = "TIMESTAMP_MILLIS (" + fromD.valueOf().toString() + ")";
58997+
to = "TIMESTAMP_MILLIS (" + toD.valueOf().toString() + ")";
5899058998
}
5899158999

5899259000
if (this.target.timeColumn === "-- time --") {

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.

dist/partials/query.editor.html

Lines changed: 174 additions & 155 deletions
Original file line numberDiff line numberDiff line change
@@ -1,177 +1,196 @@
11
<query-editor-row query-ctrl="ctrl" has-text-edit-mode="true">
22

3-
<div ng-if="ctrl.target.rawQuery">
4-
<div class="gf-form-inline">
5-
<div class="gf-form gf-form--grow">
6-
<code-editor content="ctrl.target.rawSql" datasource="ctrl.datasource"
7-
on-change="ctrl.panelCtrl.refresh()" data-mode="sql">
8-
</code-editor>
9-
</div>
10-
</div>
3+
<div ng-if="ctrl.target.rawQuery">
4+
<div class="gf-form-inline">
5+
<div class="gf-form gf-form--grow">
6+
<code-editor content="ctrl.target.rawSql" datasource="ctrl.datasource"
7+
on-change="ctrl.panelCtrl.refresh()" data-mode="sql">
8+
</code-editor>
9+
</div>
10+
</div>
11+
</div>
12+
13+
<div ng-if="!ctrl.target.rawQuery">
14+
<div class="gf-form-inline">
15+
<div class="gf-form">
16+
<label class="gf-form-label query-keyword width-8">FROM</label>
17+
<metric-segment segment="ctrl.projectSegment"
18+
get-options="ctrl.getProjectSegments()"
19+
on-change="ctrl.projectChanged()"></metric-segment>
20+
<metric-segment segment="ctrl.datasetSegment"
21+
get-options="ctrl.getDatasetSegments()"
22+
on-change="ctrl.datasetChanged()"></metric-segment>
23+
<metric-segment segment="ctrl.tableSegment"
24+
get-options="ctrl.getTableSegments()"
25+
on-change="ctrl.tableChanged()"></metric-segment>
26+
27+
<label class="gf-form-label query-keyword width-7">Time column</label>
28+
<metric-segment segment="ctrl.timeColumnSegment"
29+
get-options="ctrl.getTimeColumnSegments()"
30+
on-change="ctrl.timeColumnChanged()"></metric-segment>
31+
32+
<label class="gf-form-label query-keyword width-10">
33+
Metric column
34+
<info-popover mode="right-normal">Column to be used as metric name for
35+
the value column.
36+
</info-popover>
37+
</label>
38+
<metric-segment segment="ctrl.metricColumnSegment"
39+
get-options="ctrl.getMetricColumnSegments()"
40+
on-change="ctrl.metricColumnChanged()"></metric-segment>
41+
</div>
42+
43+
<div class="gf-form gf-form--grow">
44+
<div class="gf-form-label gf-form-label--grow"></div>
45+
</div>
46+
1147
</div>
1248

13-
<div ng-if="!ctrl.target.rawQuery">
14-
<div class="gf-form-inline">
15-
<div class="gf-form">
16-
<label class="gf-form-label query-keyword width-8">FROM</label>
17-
<metric-segment segment="ctrl.projectSegment"
18-
get-options="ctrl.getProjectSegments()"
19-
on-change="ctrl.projectChanged()"></metric-segment>
20-
<metric-segment segment="ctrl.datasetSegment"
21-
get-options="ctrl.getDatasetSegments()"
22-
on-change="ctrl.datasetChanged()"></metric-segment>
23-
<metric-segment segment="ctrl.tableSegment" get-options="ctrl.getTableSegments()"
24-
on-change="ctrl.tableChanged()"></metric-segment>
25-
26-
<label class="gf-form-label query-keyword width-7">Time column</label>
27-
<metric-segment segment="ctrl.timeColumnSegment" get-options="ctrl.getTimeColumnSegments()"
28-
on-change="ctrl.timeColumnChanged()"></metric-segment>
29-
30-
<label class="gf-form-label query-keyword width-10">
31-
Metric column
32-
<info-popover mode="right-normal">Column to be used as metric name for the value column.
33-
</info-popover>
34-
</label>
35-
<metric-segment segment="ctrl.metricColumnSegment" get-options="ctrl.getMetricColumnSegments()"
36-
on-change="ctrl.metricColumnChanged()"></metric-segment>
37-
</div>
38-
39-
<div class="gf-form gf-form--grow">
40-
<div class="gf-form-label gf-form-label--grow"></div>
41-
</div>
42-
43-
</div>
44-
45-
<div class="gf-form-inline" ng-repeat="selectParts in ctrl.selectParts">
46-
<div class="gf-form">
47-
<label class="gf-form-label query-keyword width-8">
48-
<span ng-show="$index === 0">SELECT</span>&nbsp;
49-
</label>
50-
</div>
51-
52-
<div class="gf-form" ng-repeat="part in selectParts">
53-
<sql-part-editor class="gf-form-label sql-part" part="part"
54-
handle-event="ctrl.handleSelectPartEvent(selectParts, part, $event)">
55-
</sql-part-editor>
56-
</div>
57-
58-
<div class="gf-form">
59-
<label class="dropdown"
60-
dropdown-typeahead2="ctrl.selectMenu"
61-
dropdown-typeahead-on-select="ctrl.addSelectPart(selectParts, $item, $subItem)"
62-
button-template-class="gf-form-label query-part"
63-
>
64-
</label>
65-
</div>
66-
67-
<div class="gf-form gf-form--grow">
68-
<div class="gf-form-label gf-form-label--grow"></div>
69-
</div>
70-
</div>
71-
72-
<div class="gf-form-inline">
73-
<div class="gf-form">
74-
<label class="gf-form-label query-keyword width-8">WHERE</label>
75-
</div>
76-
77-
<div class="gf-form" ng-repeat="part in ctrl.whereParts">
78-
<sql-part-editor class="gf-form-label sql-part" part="part"
79-
handle-event="ctrl.handleWherePartEvent(ctrl.whereParts, part, $event, $index)">
80-
</sql-part-editor>
81-
</div>
82-
83-
<div class="gf-form">
84-
<metric-segment segment="ctrl.whereAdd" get-options="ctrl.getWhereOptions()"
85-
on-change="ctrl.addWhereAction(part, $index)"></metric-segment>
86-
</div>
87-
88-
<div class="gf-form gf-form--grow">
89-
<div class="gf-form-label gf-form-label--grow"></div>
90-
</div>
91-
92-
</div>
93-
94-
<div class="gf-form-inline">
95-
<div class="gf-form">
96-
<label class="gf-form-label query-keyword width-8">
97-
<span>GROUP BY</span>
98-
</label>
99-
100-
<sql-part-editor ng-repeat="part in ctrl.groupParts"
101-
part="part" class="gf-form-label sql-part"
102-
handle-event="ctrl.handleGroupPartEvent(part, $index, $event)">
103-
</sql-part-editor>
104-
</div>
105-
106-
<div class="gf-form">
107-
<metric-segment segment="ctrl.groupAdd" get-options="ctrl.getGroupOptions()"
108-
on-change="ctrl.addGroupAction(part, $index)"></metric-segment>
109-
</div>
110-
111-
<div class="gf-form gf-form--grow">
112-
<div class="gf-form-label gf-form-label--grow"></div>
113-
</div>
114-
</div>
49+
<div class="gf-form-inline" ng-repeat="selectParts in ctrl.selectParts">
50+
<div class="gf-form">
51+
<label class="gf-form-label query-keyword width-8">
52+
<span ng-show="$index === 0">SELECT</span>&nbsp;
53+
</label>
54+
</div>
55+
56+
<div class="gf-form" ng-repeat="part in selectParts">
57+
<sql-part-editor class="gf-form-label sql-part" part="part"
58+
handle-event="ctrl.handleSelectPartEvent(selectParts, part, $event)">
59+
</sql-part-editor>
60+
</div>
61+
62+
<div class="gf-form">
63+
<label class="dropdown"
64+
dropdown-typeahead2="ctrl.selectMenu"
65+
dropdown-typeahead-on-select="ctrl.addSelectPart(selectParts, $item, $subItem)"
66+
button-template-class="gf-form-label query-part"
67+
>
68+
</label>
69+
</div>
70+
71+
<div class="gf-form gf-form--grow">
72+
<div class="gf-form-label gf-form-label--grow"></div>
73+
</div>
11574
</div>
11675

76+
<div class="gf-form-inline">
77+
<div class="gf-form">
78+
<label class="gf-form-label query-keyword width-8">WHERE</label>
79+
</div>
80+
81+
<div class="gf-form" ng-repeat="part in ctrl.whereParts">
82+
<sql-part-editor class="gf-form-label sql-part" part="part"
83+
handle-event="ctrl.handleWherePartEvent(ctrl.whereParts, part, $event, $index)">
84+
</sql-part-editor>
85+
</div>
86+
87+
<div class="gf-form">
88+
<metric-segment segment="ctrl.whereAdd"
89+
get-options="ctrl.getWhereOptions()"
90+
on-change="ctrl.addWhereAction(part, $index)"></metric-segment>
91+
</div>
92+
93+
<div class="gf-form gf-form--grow">
94+
<div class="gf-form-label gf-form-label--grow"></div>
95+
</div>
96+
97+
</div>
98+
99+
<div class="gf-form-inline">
100+
<div class="gf-form">
101+
<label class="gf-form-label query-keyword width-8">
102+
<span>GROUP BY</span>
103+
</label>
104+
105+
<sql-part-editor ng-repeat="part in ctrl.groupParts"
106+
part="part" class="gf-form-label sql-part"
107+
handle-event="ctrl.handleGroupPartEvent(part, $index, $event)">
108+
</sql-part-editor>
109+
</div>
110+
111+
<div class="gf-form">
112+
<metric-segment segment="ctrl.groupAdd"
113+
get-options="ctrl.getGroupOptions()"
114+
on-change="ctrl.addGroupAction(part, $index)"></metric-segment>
115+
</div>
116+
117+
<div class="gf-form gf-form--grow">
118+
<div class="gf-form-label gf-form-label--grow"></div>
119+
</div>
120+
</div>
121+
</div>
122+
117123
<!-- Start Order BY -->
118124

119125
<div class="gf-form">
120126
<label class="gf-form-label query-keyword width-8">ORDER BY</label>
121127
<div class="gf-form-select-wrapper">
122-
<select class="gf-form-input gf-size-auto" ng-model="ctrl.target.orderByCol" ng-options="f.value as f.text for f in ctrl.orderByCols"
128+
<select class="gf-form-input gf-size-auto"
129+
ng-model="ctrl.target.orderByCol"
130+
ng-options="f.value as f.text for f in ctrl.orderByCols"
123131
ng-change="ctrl.refresh()"></select>
124132
</div>
125133
<div class="gf-form-select-wrapper">
126-
<select class="gf-form-input gf-size-auto" ng-model="ctrl.target.orderBySort" ng-options="f.value as f.text for f in ctrl.orderBySorts"
134+
<select class="gf-form-input gf-size-auto"
135+
ng-model="ctrl.target.orderBySort"
136+
ng-options="f.value as f.text for f in ctrl.orderBySorts"
127137
ng-change="ctrl.refresh()"></select>
128138
</div>
129139
<div class="gf-form gf-form--grow">
130140
<div class="gf-form-label gf-form-label--grow"></div>
131141
</div>
142+
</div>
143+
<!-- End Order BY. -->
144+
145+
<div class="gf-form-inline">
146+
<div class="gf-form">
147+
<label class="gf-form-label query-keyword">Format as</label>
148+
<div class="gf-form-select-wrapper">
149+
<select class="gf-form-input gf-size-auto" ng-model="ctrl.target.format"
150+
ng-options="f.value as f.text for f in ctrl.formats"
151+
ng-change="ctrl.refresh()"></select>
152+
</div>
132153
</div>
133-
<!-- End Order BY. -->
134154

135-
<div class="gf-form-inline">
136-
<div class="gf-form">
137-
<label class="gf-form-label query-keyword">Format as</label>
138-
<div class="gf-form-select-wrapper">
139-
<select class="gf-form-input gf-size-auto" ng-model="ctrl.target.format"
140-
ng-options="f.value as f.text for f in ctrl.formats" ng-change="ctrl.refresh()"></select>
141-
</div>
142-
</div>
143-
<div class="gf-form">
144-
<label class="gf-form-label query-keyword pointer" ng-click="ctrl.toggleEditorMode()"
145-
ng-show="ctrl.panelCtrl.panel.type !== 'table'">
146-
<span ng-show="ctrl.target.rawQuery">Query Builder</span>
147-
<span ng-hide="ctrl.target.rawQuery">Edit SQL</span>
148-
</label>
149-
</div>
150-
<div class="gf-form">
151-
<label class="gf-form-label query-keyword pointer" ng-click="ctrl.showHelp = !ctrl.showHelp">
152-
Show Help
153-
<i class="fa fa-caret-down" ng-show="ctrl.showHelp"></i>
154-
<i class="fa fa-caret-right" ng-hide="ctrl.showHelp"></i>
155-
</label>
156-
</div>
157-
158-
<div class="gf-form" ng-show="ctrl.lastQueryMeta">
159-
<label class="gf-form-label query-keyword pointer"
160-
ng-click="ctrl.showLastQuerySQL = !ctrl.showLastQuerySQL">
161-
Generated SQL
162-
<i class="fa fa-caret-down" ng-show="ctrl.showLastQuerySQL"></i>
163-
<i class="fa fa-caret-right" ng-hide="ctrl.showLastQuerySQL"></i>
164-
</label>
165-
</div>
166-
<div class="gf-form gf-form--grow">
167-
<div class="gf-form-label gf-form-label--grow"></div>
168-
</div>
155+
<gf-form-switch class="gf-form"
156+
label="Convert time filters to UTC"
157+
label-class="query-keyword"
158+
checked="ctrl.target.convertToUTC"
159+
</gf-form-switch>
160+
<div class="gf-form">
161+
<label class="gf-form-label query-keyword pointer"
162+
ng-click="ctrl.toggleEditorMode()"
163+
ng-show="ctrl.panelCtrl.panel.type !== 'table'">
164+
<span ng-show="ctrl.target.rawQuery">Query Builder</span>
165+
<span ng-hide="ctrl.target.rawQuery">Edit SQL</span>
166+
</label>
167+
</div>
168+
<div class="gf-form">
169+
<label class="gf-form-label query-keyword pointer"
170+
ng-click="ctrl.showHelp = !ctrl.showHelp">
171+
Show Help
172+
<i class="fa fa-caret-down" ng-show="ctrl.showHelp"></i>
173+
<i class="fa fa-caret-right" ng-hide="ctrl.showHelp"></i>
174+
</label>
169175
</div>
170176

171-
<div class="gf-form" ng-show="ctrl.showLastQuerySQL">
172-
<pre class="gf-form-pre">{{ctrl.lastQueryMeta.sql}}</pre>
177+
<div class="gf-form" ng-show="ctrl.lastQueryMeta">
178+
<label class="gf-form-label query-keyword pointer"
179+
ng-click="ctrl.showLastQuerySQL = !ctrl.showLastQuerySQL">
180+
Generated SQL
181+
<i class="fa fa-caret-down" ng-show="ctrl.showLastQuerySQL"></i>
182+
<i class="fa fa-caret-right" ng-hide="ctrl.showLastQuerySQL"></i>
183+
</label>
184+
</div>
185+
<div class="gf-form gf-form--grow">
186+
<div class="gf-form-label gf-form-label--grow"></div>
173187
</div>
174-
<div class="gf-form" ng-show="ctrl.showHelp">
188+
</div>
189+
190+
<div class="gf-form" ng-show="ctrl.showLastQuerySQL">
191+
<pre class="gf-form-pre">{{ctrl.lastQueryMeta.sql}}</pre>
192+
</div>
193+
<div class="gf-form" ng-show="ctrl.showHelp">
175194
<pre class="gf-form-pre alert alert-info">Time series:
176195
- return column named <i>time</i> (UTC in seconds or timestamp)
177196
- return column(s) with numeric datatype as values
@@ -203,12 +222,12 @@
203222
ORDER BY time
204223

205224
</pre>
206-
</div>
225+
</div>
207226

208-
</div>
227+
</div>
209228

210-
<div class="gf-form" ng-show="ctrl.lastQueryError">
211-
<pre class="gf-form-pre alert alert-error">{{ctrl.lastQueryError}}</pre>
212-
</div>
229+
<div class="gf-form" ng-show="ctrl.lastQueryError">
230+
<pre class="gf-form-pre alert alert-error">{{ctrl.lastQueryError}}</pre>
231+
</div>
213232

214233
</query-editor-row>

0 commit comments

Comments
 (0)