blob: df71085588ff3ffee774055f4c717dddc8518450 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { DataSourceInstanceSettings, MetricFindValue, ScopedVars } from '@grafana/data';
import { IoTDBOptions, IoTDBQuery } from './types';
import { toMetricFindValue } from './functions';
import { DataSourceWithBackend, getTemplateSrv } from '@grafana/runtime';
export class DataSource extends DataSourceWithBackend<IoTDBQuery, IoTDBOptions> {
username: string;
url: string;
constructor(instanceSettings: DataSourceInstanceSettings<IoTDBOptions>) {
super(instanceSettings);
this.url = instanceSettings.jsonData.url;
this.username = instanceSettings.jsonData.username;
}
applyTemplateVariables(query: IoTDBQuery, scopedVars: ScopedVars) {
if (query.sqlType === 'SQL: Full Customized') {
if (query.expression) {
query.expression.map(
(_, index) => (query.expression[index] = getTemplateSrv().replace(query.expression[index], scopedVars))
);
}
if (query.prefixPath) {
query.prefixPath.map(
(_, index) => (query.prefixPath[index] = getTemplateSrv().replace(query.prefixPath[index], scopedVars))
);
}
if (query.condition) {
query.condition = getTemplateSrv().replace(query.condition, scopedVars);
}
if (query.control) {
query.control = getTemplateSrv().replace(query.control, scopedVars);
}
} else if (query.sqlType === 'SQL: Drop-down List') {
if (query.groupBy?.samplingInterval) {
query.groupBy.samplingInterval = getTemplateSrv().replace(query.groupBy.samplingInterval, scopedVars);
}
if (query.groupBy?.step) {
query.groupBy.step = getTemplateSrv().replace(query.groupBy.step, scopedVars);
}
if (query.groupBy?.groupByLevel) {
query.groupBy.groupByLevel = getTemplateSrv().replace(query.groupBy.groupByLevel, scopedVars);
}
if (query.fillClauses) {
query.fillClauses = getTemplateSrv().replace(query.fillClauses, scopedVars);
}
}
return query;
}
metricFindQuery(query: any, options?: any): Promise<MetricFindValue[]> {
query = getTemplateSrv().replace(query, options.scopedVars);
return this.getVariablesResult(query);
}
nodeQuery(query: any, options?: any): Promise<MetricFindValue[]> {
return this.getChildPaths(query);
}
async getChildPaths(detachedPath: string[]) {
if (this.url.substr(this.url.length - 1, 1) === '/') {
this.url = this.url.substr(0, this.url.length - 1);
}
return this.postResource('getNodes', { url: this.url, data: detachedPath })
.then((response) => {
if (response instanceof Array) {
return response;
} else {
throw 'the result is not array';
}
})
.then((data) => data.map(toMetricFindValue));
}
async getVariablesResult(sql: string) {
if (this.url.substr(this.url.length - 1, 1) === '/') {
this.url = this.url.substr(0, this.url.length - 1);
}
return this.getResource('getVariables', { url: this.url, sql: sql })
.then((response) => {
if (response instanceof Array) {
return response;
} else {
throw response.message;
}
})
.then((data) => data.map(toMetricFindValue));
}
}