Skip to content

Commit 534e565

Browse files
authored
Refactor variable interop (#36)
1 parent eb6c542 commit 534e565

File tree

4 files changed

+49
-39
lines changed

4 files changed

+49
-39
lines changed

src/components/QueryHelper.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React from "react";
22
import { QueryEditorHelpProps } from "@grafana/data";
3-
import {Divider, Text} from "@grafana/ui";
3+
import { Divider, Text } from "@grafana/ui";
44

55
export function QueryHelper(_props: QueryEditorHelpProps) {
66
return (

src/datasource.ts

Lines changed: 41 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import { DataSourceInstanceSettings, CoreApp, ScopedVars, DataQueryRequest, DataQueryResponse, LegacyMetricFindQueryOptions, MetricFindValue, dateTime } from "@grafana/data";
1+
import { DataSourceInstanceSettings, CoreApp, ScopedVars, DataQueryRequest, LegacyMetricFindQueryOptions, MetricFindValue, dateTime } from "@grafana/data";
22
import { DataSourceWithBackend, getTemplateSrv } from "@grafana/runtime";
3-
import { parseJsQuery, datetimeToJson, getBucketCount, parseJsQueryLegacy, randomId, getMetricValues } from "./utils";
3+
import { parseJsQuery, getBucketCount, parseJsQueryLegacy, randomId, getMetricValues, datetimeToJson } from "./utils";
44
import { MongoQuery, MongoDataSourceOptions, DEFAULT_QUERY, QueryLanguage, VariableQuery } from "./types";
5-
import { Observable, firstValueFrom } from "rxjs";
5+
import { firstValueFrom } from "rxjs";
66

77

88
export class DataSource extends DataSourceWithBackend<MongoQuery, MongoDataSourceOptions> {
@@ -14,10 +14,47 @@ export class DataSource extends DataSourceWithBackend<MongoQuery, MongoDataSourc
1414
return DEFAULT_QUERY;
1515
}
1616

17+
1718
applyTemplateVariables(query: MongoQuery, scopedVars: ScopedVars) {
19+
let queryText = query.queryText!;
20+
21+
if (query.queryLanguage === QueryLanguage.JAVASCRIPT || query.queryLanguage === QueryLanguage.JAVASCRIPT_SHADOW) {
22+
const { jsonQuery } =
23+
query.queryLanguage === QueryLanguage.JAVASCRIPT_SHADOW
24+
? parseJsQuery(queryText)
25+
: parseJsQueryLegacy(queryText);
26+
queryText = jsonQuery!;
27+
}
28+
29+
const from = getTemplateSrv().replace("$__from", {});
30+
const to = getTemplateSrv().replace("$__to", {});
31+
32+
// Compatible with legacy plugin $from
33+
if (from !== "$__from") {
34+
queryText = queryText.replaceAll(/"\$from"/g, datetimeToJson(from));
35+
}
36+
37+
// Compatible with legacy plugin $to
38+
if (to !== "$__to") {
39+
queryText = queryText.replaceAll(/"\$to"/g, datetimeToJson(to));
40+
}
41+
42+
const interval = scopedVars["__interval_ms"]?.value;
43+
44+
// Compatible with legacy plugin $dateBucketCount
45+
if (interval && from && to) {
46+
queryText = queryText.replaceAll(
47+
/"\$dateBucketCount"/g,
48+
getBucketCount(from, to, interval).toString()
49+
);
50+
}
51+
52+
const text = getTemplateSrv().replace(queryText, scopedVars);
53+
54+
console.log(text);
1855
return {
1956
...query,
20-
queryText: getTemplateSrv().replace(query.queryText, scopedVars),
57+
queryText: text
2158
};
2259
}
2360

@@ -59,29 +96,4 @@ export class DataSource extends DataSourceWithBackend<MongoQuery, MongoDataSourc
5996
return !!query.queryText && !!query.collection;
6097
}
6198

62-
query(request: DataQueryRequest<MongoQuery>): Observable<DataQueryResponse> {
63-
const queries = request.targets.map((query) => {
64-
let queryText = query.queryText!;
65-
if (query.queryLanguage === QueryLanguage.JAVASCRIPT || query.queryLanguage === QueryLanguage.JAVASCRIPT_SHADOW) {
66-
const { jsonQuery } =
67-
query.queryLanguage === QueryLanguage.JAVASCRIPT_SHADOW
68-
? parseJsQuery(queryText)
69-
: parseJsQueryLegacy(queryText);
70-
queryText = jsonQuery!;
71-
}
72-
73-
return {
74-
...query,
75-
queryText: queryText
76-
.replaceAll(/"\$from"/g, datetimeToJson(request.range.from))
77-
.replaceAll(/"\$to"/g, datetimeToJson(request.range.to))
78-
.replaceAll(
79-
/"\$dateBucketCount"/g,
80-
getBucketCount(request.range.from, request.range.to, request.intervalMs).toString()
81-
),
82-
};
83-
});
84-
85-
return super.query({ ...request, targets: queries });
86-
}
8799
}

src/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export interface MongoQuery extends DataQuery {
1414
aggregateAllowDiskUse?: boolean;
1515
aggregateMaxAwaitTime?: number;
1616
aggregateBypassDocumentValidation?: boolean;
17-
17+
1818
}
1919

2020
export const QueryType = {

src/utils.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { DataFrameSchema, DataQueryResponse, DateTime, FieldType, MetricFindValue } from "@grafana/data";
1+
import { DataFrameSchema, DataQueryResponse, FieldType, MetricFindValue } from "@grafana/data";
22
import { JsQueryResult } from "types";
33
import shadow from "shadowrealm-api";
44
import { getTemplateSrv } from "@grafana/runtime";
@@ -65,19 +65,17 @@ export function parseJsQuery(queryText: string): JsQueryResult {
6565
}
6666
}
6767

68-
69-
70-
export function datetimeToJson(datetime: DateTime) {
68+
export function datetimeToJson(datetime: string) {
7169
return JSON.stringify({
7270
$date: {
73-
$numberLong: datetime.toDate().getTime().toString()
71+
$numberLong: datetime
7472
}
7573
});
7674
}
7775

78-
export function getBucketCount(from: DateTime, to: DateTime, intervalMs: number) {
79-
let current = from.toDate().getTime();
80-
const toMs = to.toDate().getTime();
76+
export function getBucketCount(from: string, to: string, intervalMs: number) {
77+
let current = parseInt(from, 10);
78+
const toMs = parseInt(to, 10);
8179
let count = 0;
8280
while (current < toMs) {
8381
current += intervalMs;

0 commit comments

Comments
 (0)