mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
noImplicitAnys: Fix InfluxDB type issues #17937)
This commit is contained in:
parent
de71875e6b
commit
418dba4b21
@ -30,7 +30,9 @@ describe('GraphiteQueryCtrl', () => {
|
||||
ctx.ctrl = new GraphiteQueryCtrl(
|
||||
{},
|
||||
{},
|
||||
//@ts-ignore
|
||||
new uiSegmentSrv({ trustAsHtml: html => html }, { highlightVariablesAsHtml: () => {} }),
|
||||
//@ts-ignore
|
||||
new TemplateSrvStub(),
|
||||
{}
|
||||
);
|
||||
@ -121,7 +123,7 @@ describe('GraphiteQueryCtrl', () => {
|
||||
ctx.ctrl.target.target = 'test.count';
|
||||
ctx.ctrl.datasource.metricFindQuery = () => Promise.resolve([]);
|
||||
ctx.ctrl.parseTarget();
|
||||
ctx.ctrl.getAltSegments(1).then(results => {
|
||||
ctx.ctrl.getAltSegments(1).then((results: any) => {
|
||||
ctx.altSegments = results;
|
||||
});
|
||||
});
|
||||
|
@ -48,11 +48,13 @@ export class InfluxLogsQueryField extends React.PureComponent<Props, State> {
|
||||
const queryBuilder = new InfluxQueryBuilder({ measurement: measurementObj.text, tags: [] }, datasource.database);
|
||||
const fieldsQuery = queryBuilder.buildExploreQuery('FIELDS');
|
||||
const influxFields = await datasource.metricFindQuery(fieldsQuery);
|
||||
const fields = influxFields.map((field: any) => ({
|
||||
label: field.text,
|
||||
value: field.text,
|
||||
children: [],
|
||||
}));
|
||||
const fields: any[] = influxFields.map(
|
||||
(field: any): any => ({
|
||||
label: field.text,
|
||||
value: field.text,
|
||||
children: [],
|
||||
})
|
||||
);
|
||||
measurements.push({
|
||||
label: measurementObj.text,
|
||||
value: measurementObj.text,
|
||||
|
@ -49,12 +49,12 @@ export default class InfluxDatasource extends DataSourceApi<InfluxQuery, InfluxO
|
||||
this.responseParser = new ResponseParser();
|
||||
}
|
||||
|
||||
query(options) {
|
||||
query(options: any) {
|
||||
let timeFilter = this.getTimeFilter(options);
|
||||
const scopedVars = options.scopedVars;
|
||||
const targets = _.cloneDeep(options.targets);
|
||||
const queryTargets = [];
|
||||
let queryModel;
|
||||
const queryTargets: any[] = [];
|
||||
let queryModel: InfluxQueryModel;
|
||||
let i, y;
|
||||
|
||||
let allQueries = _.map(targets, target => {
|
||||
@ -93,7 +93,7 @@ export default class InfluxDatasource extends DataSourceApi<InfluxQuery, InfluxO
|
||||
allQueries = this.templateSrv.replace(allQueries, scopedVars);
|
||||
|
||||
return this._seriesQuery(allQueries, options).then(
|
||||
(data): any => {
|
||||
(data: any): any => {
|
||||
if (!data || !data.results) {
|
||||
return [];
|
||||
}
|
||||
@ -136,7 +136,7 @@ export default class InfluxDatasource extends DataSourceApi<InfluxQuery, InfluxO
|
||||
);
|
||||
}
|
||||
|
||||
annotationQuery(options) {
|
||||
annotationQuery(options: any) {
|
||||
if (!options.annotation.query) {
|
||||
return this.$q.reject({
|
||||
message: 'Query missing in annotation definition',
|
||||
@ -147,7 +147,7 @@ export default class InfluxDatasource extends DataSourceApi<InfluxQuery, InfluxO
|
||||
let query = options.annotation.query.replace('$timeFilter', timeFilter);
|
||||
query = this.templateSrv.replace(query, null, 'regex');
|
||||
|
||||
return this._seriesQuery(query, options).then(data => {
|
||||
return this._seriesQuery(query, options).then((data: any) => {
|
||||
if (!data || !data.results || !data.results[0]) {
|
||||
throw { message: 'No results in response from InfluxDB' };
|
||||
}
|
||||
@ -158,7 +158,7 @@ export default class InfluxDatasource extends DataSourceApi<InfluxQuery, InfluxO
|
||||
});
|
||||
}
|
||||
|
||||
targetContainsTemplate(target) {
|
||||
targetContainsTemplate(target: any) {
|
||||
for (const group of target.groupBy) {
|
||||
for (const param of group.params) {
|
||||
if (this.templateSrv.variableExists(param)) {
|
||||
@ -207,7 +207,7 @@ export default class InfluxDatasource extends DataSourceApi<InfluxQuery, InfluxO
|
||||
return this._influxRequest(this.httpMode, '/query', { q: query, epoch: 'ms' }, options);
|
||||
}
|
||||
|
||||
serializeParams(params) {
|
||||
serializeParams(params: any) {
|
||||
if (!params) {
|
||||
return '';
|
||||
}
|
||||
@ -230,14 +230,14 @@ export default class InfluxDatasource extends DataSourceApi<InfluxQuery, InfluxO
|
||||
const query = queryBuilder.buildExploreQuery('RETENTION POLICIES');
|
||||
|
||||
return this._seriesQuery(query)
|
||||
.then(res => {
|
||||
.then((res: any) => {
|
||||
const error = _.get(res, 'results[0].error');
|
||||
if (error) {
|
||||
return { status: 'error', message: error };
|
||||
}
|
||||
return { status: 'success', message: 'Data source is working' };
|
||||
})
|
||||
.catch(err => {
|
||||
.catch((err: any) => {
|
||||
return { status: 'error', message: err.message };
|
||||
});
|
||||
}
|
||||
@ -292,10 +292,10 @@ export default class InfluxDatasource extends DataSourceApi<InfluxQuery, InfluxO
|
||||
}
|
||||
|
||||
return this.backendSrv.datasourceRequest(req).then(
|
||||
result => {
|
||||
(result: any) => {
|
||||
return result.data;
|
||||
},
|
||||
err => {
|
||||
(err: any) => {
|
||||
if (err.status !== 0 || err.status >= 300) {
|
||||
if (err.data && err.data.error) {
|
||||
throw {
|
||||
@ -315,7 +315,7 @@ export default class InfluxDatasource extends DataSourceApi<InfluxQuery, InfluxO
|
||||
);
|
||||
}
|
||||
|
||||
getTimeFilter(options) {
|
||||
getTimeFilter(options: any) {
|
||||
const from = this.getInfluxTime(options.rangeRaw.from, false, options.timezone);
|
||||
const until = this.getInfluxTime(options.rangeRaw.to, true, options.timezone);
|
||||
const fromIsAbsolute = from[from.length - 1] === 'ms';
|
||||
@ -327,7 +327,7 @@ export default class InfluxDatasource extends DataSourceApi<InfluxQuery, InfluxO
|
||||
return 'time >= ' + from + ' and time <= ' + until;
|
||||
}
|
||||
|
||||
getInfluxTime(date, roundUp, timezone) {
|
||||
getInfluxTime(date: any, roundUp: any, timezone: any) {
|
||||
if (_.isString(date)) {
|
||||
if (date === 'now') {
|
||||
return 'now()';
|
||||
|
@ -1,7 +1,9 @@
|
||||
import _ from 'lodash';
|
||||
import queryPart from './query_part';
|
||||
import kbn from 'app/core/utils/kbn';
|
||||
import { InfluxQuery } from './types';
|
||||
import { InfluxQuery, InfluxQueryTag } from './types';
|
||||
import { ScopedVars } from '@grafana/ui';
|
||||
import { TemplateSrv } from 'app/features/templating/template_srv';
|
||||
|
||||
export default class InfluxQueryModel {
|
||||
target: InfluxQuery;
|
||||
@ -13,7 +15,7 @@ export default class InfluxQueryModel {
|
||||
refId: string;
|
||||
|
||||
/** @ngInject */
|
||||
constructor(target: InfluxQuery, templateSrv?, scopedVars?) {
|
||||
constructor(target: InfluxQuery, templateSrv?: TemplateSrv, scopedVars?: ScopedVars) {
|
||||
this.target = target;
|
||||
this.templateSrv = templateSrv;
|
||||
this.scopedVars = scopedVars;
|
||||
@ -51,7 +53,7 @@ export default class InfluxQueryModel {
|
||||
return _.find(this.target.groupBy, (g: any) => g.type === 'fill');
|
||||
}
|
||||
|
||||
addGroupBy(value) {
|
||||
addGroupBy(value: string) {
|
||||
const stringParts = value.match(/^(\w+)\((.*)\)$/);
|
||||
const typePart = stringParts[1];
|
||||
const arg = stringParts[2];
|
||||
@ -75,7 +77,7 @@ export default class InfluxQueryModel {
|
||||
this.updateProjection();
|
||||
}
|
||||
|
||||
removeGroupByPart(part, index) {
|
||||
removeGroupByPart(part: { def: { type: string } }, index: number) {
|
||||
const categories = queryPart.getCategories();
|
||||
|
||||
if (part.def.type === 'time') {
|
||||
@ -105,7 +107,7 @@ export default class InfluxQueryModel {
|
||||
this.updateProjection();
|
||||
}
|
||||
|
||||
removeSelectPart(selectParts, part) {
|
||||
removeSelectPart(selectParts: any[], part: any) {
|
||||
// if we remove the field remove the whole statement
|
||||
if (part.def.type === 'field') {
|
||||
if (this.selectModels.length > 1) {
|
||||
@ -120,13 +122,13 @@ export default class InfluxQueryModel {
|
||||
this.updatePersistedParts();
|
||||
}
|
||||
|
||||
addSelectPart(selectParts, type) {
|
||||
addSelectPart(selectParts: any[], type: string) {
|
||||
const partModel = queryPart.create({ type: type });
|
||||
partModel.def.addStrategy(selectParts, partModel, this);
|
||||
this.updatePersistedParts();
|
||||
}
|
||||
|
||||
private renderTagCondition(tag, index, interpolate) {
|
||||
private renderTagCondition(tag: InfluxQueryTag, index: number, interpolate: boolean) {
|
||||
let str = '';
|
||||
let operator = tag.operator;
|
||||
let value = tag.value;
|
||||
@ -157,7 +159,7 @@ export default class InfluxQueryModel {
|
||||
return str + '"' + tag.key + '" ' + operator + ' ' + value;
|
||||
}
|
||||
|
||||
getMeasurementAndPolicy(interpolate) {
|
||||
getMeasurementAndPolicy(interpolate: any) {
|
||||
let policy = this.target.policy;
|
||||
let measurement = this.target.measurement || 'measurement';
|
||||
|
||||
@ -176,7 +178,7 @@ export default class InfluxQueryModel {
|
||||
return policy + measurement;
|
||||
}
|
||||
|
||||
interpolateQueryStr(value, variable, defaultFormatFn) {
|
||||
interpolateQueryStr(value: any[], variable: { multi: any; includeAll: any }, defaultFormatFn: any) {
|
||||
// if no multi or include all do not regexEscape
|
||||
if (!variable.multi && !variable.includeAll) {
|
||||
return value;
|
||||
@ -190,7 +192,7 @@ export default class InfluxQueryModel {
|
||||
return '(' + escapedValues.join('|') + ')';
|
||||
}
|
||||
|
||||
render(interpolate?) {
|
||||
render(interpolate?: boolean) {
|
||||
const target = this.target;
|
||||
|
||||
if (target.rawQuery) {
|
||||
@ -265,7 +267,7 @@ export default class InfluxQueryModel {
|
||||
return query;
|
||||
}
|
||||
|
||||
renderAdhocFilters(filters) {
|
||||
renderAdhocFilters(filters: any[]) {
|
||||
const conditions = _.map(filters, (tag, index) => {
|
||||
return this.renderTagCondition(tag, index, false);
|
||||
});
|
||||
|
@ -7,14 +7,14 @@ export default class InfluxSeries {
|
||||
alias: any;
|
||||
annotation: any;
|
||||
|
||||
constructor(options) {
|
||||
constructor(options: { series: any; alias?: any; annotation?: any }) {
|
||||
this.series = options.series;
|
||||
this.alias = options.alias;
|
||||
this.annotation = options.annotation;
|
||||
}
|
||||
|
||||
getTimeSeries() {
|
||||
const output = [];
|
||||
const output: any[] = [];
|
||||
let i, j;
|
||||
|
||||
if (this.series.length === 0) {
|
||||
@ -54,11 +54,11 @@ export default class InfluxSeries {
|
||||
return output;
|
||||
}
|
||||
|
||||
_getSeriesName(series, index) {
|
||||
_getSeriesName(series: any, index: number) {
|
||||
const regex = /\$(\w+)|\[\[([\s\S]+?)\]\]/g;
|
||||
const segments = series.name.split('.');
|
||||
|
||||
return this.alias.replace(regex, (match, g1, g2) => {
|
||||
return this.alias.replace(regex, (match: any, g1: any, g2: any) => {
|
||||
const group = g1 || g2;
|
||||
const segIndex = parseInt(group, 10);
|
||||
|
||||
@ -84,13 +84,13 @@ export default class InfluxSeries {
|
||||
}
|
||||
|
||||
getAnnotations() {
|
||||
const list = [];
|
||||
const list: any[] = [];
|
||||
|
||||
_.each(this.series, series => {
|
||||
let titleCol = null;
|
||||
let timeCol = null;
|
||||
const tagsCol = [];
|
||||
let textCol = null;
|
||||
let titleCol: any = null;
|
||||
let timeCol: any = null;
|
||||
const tagsCol: any = [];
|
||||
let textCol: any = null;
|
||||
|
||||
_.each(series.columns, (column, index) => {
|
||||
if (column === 'time') {
|
||||
@ -126,10 +126,10 @@ export default class InfluxSeries {
|
||||
// Remove empty values, then split in different tags for comma separated values
|
||||
tags: _.flatten(
|
||||
tagsCol
|
||||
.filter(t => {
|
||||
.filter((t: any) => {
|
||||
return value[t];
|
||||
})
|
||||
.map(t => {
|
||||
.map((t: any) => {
|
||||
return value[t].split(',');
|
||||
})
|
||||
),
|
||||
|
@ -1,7 +1,7 @@
|
||||
import _ from 'lodash';
|
||||
import kbn from 'app/core/utils/kbn';
|
||||
|
||||
function renderTagCondition(tag, index) {
|
||||
function renderTagCondition(tag: { operator: any; value: string; condition: any; key: string }, index: number) {
|
||||
let str = '';
|
||||
let operator = tag.operator;
|
||||
let value = tag.value;
|
||||
@ -26,7 +26,7 @@ function renderTagCondition(tag, index) {
|
||||
}
|
||||
|
||||
export class InfluxQueryBuilder {
|
||||
constructor(private target, private database?) {}
|
||||
constructor(private target: { measurement: any; tags: any; policy?: any }, private database?: string) {}
|
||||
|
||||
buildExploreQuery(type: string, withKey?: string, withMeasurementFilter?: string) {
|
||||
let query;
|
||||
|
@ -1,9 +1,10 @@
|
||||
import angular from 'angular';
|
||||
import angular, { auto, IQService } from 'angular';
|
||||
import _ from 'lodash';
|
||||
import { InfluxQueryBuilder } from './query_builder';
|
||||
import InfluxQueryModel from './influx_query_model';
|
||||
import queryPart from './query_part';
|
||||
import { QueryCtrl } from 'app/plugins/sdk';
|
||||
import { TemplateSrv } from 'app/features/templating/template_srv';
|
||||
|
||||
export class InfluxQueryCtrl extends QueryCtrl {
|
||||
static templateUrl = 'partials/query.editor.html';
|
||||
@ -20,7 +21,13 @@ export class InfluxQueryCtrl extends QueryCtrl {
|
||||
removeTagFilterSegment: any;
|
||||
|
||||
/** @ngInject */
|
||||
constructor($scope, $injector, private templateSrv, private $q, private uiSegmentSrv) {
|
||||
constructor(
|
||||
$scope: any,
|
||||
$injector: auto.IInjectorService,
|
||||
private templateSrv: TemplateSrv,
|
||||
private $q: IQService,
|
||||
private uiSegmentSrv: any
|
||||
) {
|
||||
super($scope, $injector);
|
||||
this.target = this.target;
|
||||
this.queryModel = new InfluxQueryModel(this.target, templateSrv, this.panel.scopedVars);
|
||||
@ -73,7 +80,7 @@ export class InfluxQueryCtrl extends QueryCtrl {
|
||||
(memo, cat, key) => {
|
||||
const menu = {
|
||||
text: key,
|
||||
submenu: cat.map(item => {
|
||||
submenu: cat.map((item: any) => {
|
||||
return { text: item.type, value: item.type };
|
||||
}),
|
||||
};
|
||||
@ -89,7 +96,7 @@ export class InfluxQueryCtrl extends QueryCtrl {
|
||||
|
||||
return this.datasource
|
||||
.metricFindQuery(query)
|
||||
.then(tags => {
|
||||
.then((tags: any) => {
|
||||
const options = [];
|
||||
if (!this.queryModel.hasFill()) {
|
||||
options.push(this.uiSegmentSrv.newSegment({ value: 'fill(null)' }));
|
||||
@ -146,12 +153,12 @@ export class InfluxQueryCtrl extends QueryCtrl {
|
||||
this.panelCtrl.refresh();
|
||||
}
|
||||
|
||||
addSelectPart(selectParts, cat, subitem) {
|
||||
addSelectPart(selectParts: any, cat: any, subitem: { value: any }) {
|
||||
this.queryModel.addSelectPart(selectParts, subitem.value);
|
||||
this.panelCtrl.refresh();
|
||||
}
|
||||
|
||||
handleSelectPartEvent(selectParts, part, evt) {
|
||||
handleSelectPartEvent(selectParts: any, part: any, evt: { name: any }) {
|
||||
switch (evt.name) {
|
||||
case 'get-param-options': {
|
||||
const fieldsQuery = this.queryBuilder.buildExploreQuery('FIELDS');
|
||||
@ -175,7 +182,7 @@ export class InfluxQueryCtrl extends QueryCtrl {
|
||||
}
|
||||
}
|
||||
|
||||
handleGroupByPartEvent(part, index, evt) {
|
||||
handleGroupByPartEvent(part: any, index: any, evt: { name: any }) {
|
||||
switch (evt.name) {
|
||||
case 'get-param-options': {
|
||||
const tagsQuery = this.queryBuilder.buildExploreQuery('TAG_KEYS');
|
||||
@ -235,7 +242,7 @@ export class InfluxQueryCtrl extends QueryCtrl {
|
||||
this.target.rawQuery = !this.target.rawQuery;
|
||||
}
|
||||
|
||||
getMeasurements(measurementFilter) {
|
||||
getMeasurements(measurementFilter: any) {
|
||||
const query = this.queryBuilder.buildExploreQuery('MEASUREMENTS', undefined, measurementFilter);
|
||||
return this.datasource
|
||||
.metricFindQuery(query)
|
||||
@ -243,13 +250,13 @@ export class InfluxQueryCtrl extends QueryCtrl {
|
||||
.catch(this.handleQueryError.bind(this));
|
||||
}
|
||||
|
||||
handleQueryError(err) {
|
||||
handleQueryError(err: any): any[] {
|
||||
this.error = err.message || 'Failed to issue metric query';
|
||||
return [];
|
||||
}
|
||||
|
||||
transformToSegments(addTemplateVars) {
|
||||
return results => {
|
||||
transformToSegments(addTemplateVars: any) {
|
||||
return (results: any) => {
|
||||
const segments = _.map(results, segment => {
|
||||
return this.uiSegmentSrv.newSegment({
|
||||
value: segment.text,
|
||||
@ -273,7 +280,7 @@ export class InfluxQueryCtrl extends QueryCtrl {
|
||||
};
|
||||
}
|
||||
|
||||
getTagsOrValues(segment, index) {
|
||||
getTagsOrValues(segment: { type: string }, index: number) {
|
||||
if (segment.type === 'condition') {
|
||||
return this.$q.when([this.uiSegmentSrv.newSegment('AND'), this.uiSegmentSrv.newSegment('OR')]);
|
||||
}
|
||||
@ -298,7 +305,7 @@ export class InfluxQueryCtrl extends QueryCtrl {
|
||||
return this.datasource
|
||||
.metricFindQuery(query)
|
||||
.then(this.transformToSegments(addTemplateVars))
|
||||
.then(results => {
|
||||
.then((results: any) => {
|
||||
if (segment.type === 'key') {
|
||||
results.splice(0, 0, angular.copy(this.removeTagFilterSegment));
|
||||
}
|
||||
@ -315,7 +322,7 @@ export class InfluxQueryCtrl extends QueryCtrl {
|
||||
.catch(this.handleQueryError);
|
||||
}
|
||||
|
||||
tagSegmentUpdated(segment, index) {
|
||||
tagSegmentUpdated(segment: { value: any; type: string; cssClass: string }, index: number) {
|
||||
this.tagSegments[index] = segment;
|
||||
|
||||
// handle remove tag condition
|
||||
@ -349,7 +356,7 @@ export class InfluxQueryCtrl extends QueryCtrl {
|
||||
}
|
||||
|
||||
rebuildTargetTagConditions() {
|
||||
const tags = [];
|
||||
const tags: any[] = [];
|
||||
let tagIndex = 0;
|
||||
let tagOperator = '';
|
||||
|
||||
@ -378,7 +385,7 @@ export class InfluxQueryCtrl extends QueryCtrl {
|
||||
this.panelCtrl.refresh();
|
||||
}
|
||||
|
||||
getTagValueOperator(tagValue, tagOperator): string {
|
||||
getTagValueOperator(tagValue: string, tagOperator: string): string {
|
||||
if (tagOperator !== '=~' && tagOperator !== '!~' && /^\/.*\/$/.test(tagValue)) {
|
||||
return '=~';
|
||||
} else if ((tagOperator === '=~' || tagOperator === '!~') && /^(?!\/.*\/$)/.test(tagValue)) {
|
||||
|
@ -1,8 +1,8 @@
|
||||
import _ from 'lodash';
|
||||
import { QueryPartDef, QueryPart, functionRenderer, suffixRenderer } from 'app/core/components/query_part/query_part';
|
||||
|
||||
const index = [];
|
||||
const categories = {
|
||||
const index: any[] = [];
|
||||
const categories: any = {
|
||||
Aggregations: [],
|
||||
Selectors: [],
|
||||
Transformations: [],
|
||||
@ -12,7 +12,7 @@ const categories = {
|
||||
Fields: [],
|
||||
};
|
||||
|
||||
function createPart(part): any {
|
||||
function createPart(part: any): any {
|
||||
const def = index[part.type];
|
||||
if (!def) {
|
||||
throw { message: 'Could not find query part ' + part.type };
|
||||
@ -26,20 +26,20 @@ function register(options: any) {
|
||||
options.category.push(index[options.type]);
|
||||
}
|
||||
|
||||
const groupByTimeFunctions = [];
|
||||
const groupByTimeFunctions: any[] = [];
|
||||
|
||||
function aliasRenderer(part, innerExpr) {
|
||||
function aliasRenderer(part: { params: string[] }, innerExpr: string) {
|
||||
return innerExpr + ' AS ' + '"' + part.params[0] + '"';
|
||||
}
|
||||
|
||||
function fieldRenderer(part, innerExpr) {
|
||||
function fieldRenderer(part: { params: string[] }, innerExpr: any) {
|
||||
if (part.params[0] === '*') {
|
||||
return '*';
|
||||
}
|
||||
return '"' + part.params[0] + '"';
|
||||
}
|
||||
|
||||
function replaceAggregationAddStrategy(selectParts, partModel) {
|
||||
function replaceAggregationAddStrategy(selectParts: any[], partModel: { def: { type: string } }) {
|
||||
// look for existing aggregation
|
||||
for (let i = 0; i < selectParts.length; i++) {
|
||||
const part = selectParts[i];
|
||||
@ -78,7 +78,7 @@ function replaceAggregationAddStrategy(selectParts, partModel) {
|
||||
selectParts.splice(1, 0, partModel);
|
||||
}
|
||||
|
||||
function addTransformationStrategy(selectParts, partModel) {
|
||||
function addTransformationStrategy(selectParts: any[], partModel: any) {
|
||||
let i;
|
||||
// look for index to add transformation
|
||||
for (i = 0; i < selectParts.length; i++) {
|
||||
@ -91,7 +91,7 @@ function addTransformationStrategy(selectParts, partModel) {
|
||||
selectParts.splice(i, 0, partModel);
|
||||
}
|
||||
|
||||
function addMathStrategy(selectParts, partModel) {
|
||||
function addMathStrategy(selectParts: any[], partModel: any) {
|
||||
const partCount = selectParts.length;
|
||||
if (partCount > 0) {
|
||||
// if last is math, replace it
|
||||
@ -112,7 +112,7 @@ function addMathStrategy(selectParts, partModel) {
|
||||
selectParts.push(partModel);
|
||||
}
|
||||
|
||||
function addAliasStrategy(selectParts, partModel) {
|
||||
function addAliasStrategy(selectParts: any[], partModel: any) {
|
||||
const partCount = selectParts.length;
|
||||
if (partCount > 0) {
|
||||
// if last is alias, replace it
|
||||
@ -124,7 +124,7 @@ function addAliasStrategy(selectParts, partModel) {
|
||||
selectParts.push(partModel);
|
||||
}
|
||||
|
||||
function addFieldStrategy(selectParts, partModel, query) {
|
||||
function addFieldStrategy(selectParts: any, partModel: any, query: { selectModels: any[][] }) {
|
||||
// copy all parts
|
||||
const parts = _.map(selectParts, (part: any) => {
|
||||
return createPart({ type: part.def.type, params: _.clone(part.params) });
|
||||
|
@ -1,7 +1,7 @@
|
||||
import _ from 'lodash';
|
||||
|
||||
export default class ResponseParser {
|
||||
parse(query, results) {
|
||||
parse(query: string, results: { results: any }) {
|
||||
if (!results || results.results.length === 0) {
|
||||
return [];
|
||||
}
|
||||
@ -52,6 +52,6 @@ export default class ResponseParser {
|
||||
}
|
||||
}
|
||||
|
||||
function addUnique(arr, value) {
|
||||
function addUnique(arr: { [x: string]: any }, value: string | number) {
|
||||
arr[value] = value;
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
import InfluxDatasource from '../datasource';
|
||||
//@ts-ignore
|
||||
import $q from 'q';
|
||||
import { TemplateSrvStub } from 'test/specs/helpers';
|
||||
|
||||
@ -6,6 +7,7 @@ describe('InfluxDataSource', () => {
|
||||
const ctx: any = {
|
||||
backendSrv: {},
|
||||
$q: $q,
|
||||
//@ts-ignore
|
||||
templateSrv: new TemplateSrvStub(),
|
||||
instanceSettings: { url: 'url', name: 'influxDb', jsonData: { httpMode: 'GET' } },
|
||||
};
|
||||
@ -23,10 +25,10 @@ describe('InfluxDataSource', () => {
|
||||
to: '2018-01-02T00:00:00Z',
|
||||
},
|
||||
};
|
||||
let requestQuery, requestMethod, requestData;
|
||||
let requestQuery: any, requestMethod: any, requestData: any;
|
||||
|
||||
beforeEach(async () => {
|
||||
ctx.backendSrv.datasourceRequest = req => {
|
||||
ctx.backendSrv.datasourceRequest = (req: any) => {
|
||||
requestMethod = req.method;
|
||||
requestQuery = req.params.q;
|
||||
requestData = req.data;
|
||||
@ -45,7 +47,7 @@ describe('InfluxDataSource', () => {
|
||||
});
|
||||
};
|
||||
|
||||
await ctx.ds.metricFindQuery(query, queryOptions).then(_ => {});
|
||||
await ctx.ds.metricFindQuery(query, queryOptions).then(() => {});
|
||||
});
|
||||
|
||||
it('should replace $timefilter', () => {
|
||||
@ -65,7 +67,8 @@ describe('InfluxDataSource', () => {
|
||||
describe('InfluxDataSource in POST query mode', () => {
|
||||
const ctx: any = {
|
||||
backendSrv: {},
|
||||
$q: $q,
|
||||
$q,
|
||||
//@ts-ignore
|
||||
templateSrv: new TemplateSrvStub(),
|
||||
instanceSettings: { url: 'url', name: 'influxDb', jsonData: { httpMode: 'POST' } },
|
||||
};
|
||||
@ -78,10 +81,10 @@ describe('InfluxDataSource in POST query mode', () => {
|
||||
describe('When issuing metricFindQuery', () => {
|
||||
const query = 'SELECT max(value) FROM measurement';
|
||||
const queryOptions: any = {};
|
||||
let requestMethod, requestQueryParameter, queryEncoded, requestQuery;
|
||||
let requestMethod: any, requestQueryParameter: any, queryEncoded: any, requestQuery: any;
|
||||
|
||||
beforeEach(async () => {
|
||||
ctx.backendSrv.datasourceRequest = req => {
|
||||
ctx.backendSrv.datasourceRequest = (req: any) => {
|
||||
requestMethod = req.method;
|
||||
requestQueryParameter = req.params;
|
||||
requestQuery = req.data;
|
||||
@ -101,7 +104,7 @@ describe('InfluxDataSource in POST query mode', () => {
|
||||
};
|
||||
|
||||
queryEncoded = await ctx.ds.serializeParams({ q: query });
|
||||
await ctx.ds.metricFindQuery(query, queryOptions).then(_ => {});
|
||||
await ctx.ds.metricFindQuery(query, queryOptions).then(() => {});
|
||||
});
|
||||
|
||||
it('should have the query form urlencoded', () => {
|
||||
|
@ -1,7 +1,7 @@
|
||||
import InfluxQueryModel from '../influx_query_model';
|
||||
|
||||
describe('InfluxQuery', () => {
|
||||
const templateSrv = { replace: val => val };
|
||||
const templateSrv: any = { replace: (val: any) => val };
|
||||
|
||||
describe('render series with mesurement only', () => {
|
||||
it('should generate correct query', () => {
|
||||
|
@ -19,10 +19,11 @@ describe('InfluxDBQueryCtrl', () => {
|
||||
|
||||
ctx.ctrl = new InfluxQueryCtrl(
|
||||
{},
|
||||
{},
|
||||
{},
|
||||
{},
|
||||
new uiSegmentSrv({ trustAsHtml: html => html }, { highlightVariablesAsHtml: () => {} })
|
||||
{} as any,
|
||||
{} as any,
|
||||
{} as any,
|
||||
//@ts-ignore
|
||||
new uiSegmentSrv({ trustAsHtml: (html: any) => html }, { highlightVariablesAsHtml: () => {} })
|
||||
);
|
||||
});
|
||||
|
||||
|
@ -12,7 +12,7 @@ export class MssqlConfigCtrl {
|
||||
onPasswordChange: ReturnType<typeof createChangeHandler>;
|
||||
|
||||
/** @ngInject */
|
||||
constructor($scope) {
|
||||
constructor($scope: any) {
|
||||
this.current.jsonData.encrypt = this.current.jsonData.encrypt || 'false';
|
||||
this.onPasswordReset = createResetHandler(this, PasswordFieldEnum.Password);
|
||||
this.onPasswordChange = createChangeHandler(this, PasswordFieldEnum.Password);
|
||||
|
@ -1,5 +1,9 @@
|
||||
import _ from 'lodash';
|
||||
import ResponseParser from './response_parser';
|
||||
import { BackendSrv } from 'app/core/services/backend_srv';
|
||||
import { IQService } from 'angular';
|
||||
import { TemplateSrv } from 'app/features/templating/template_srv';
|
||||
import { TimeSrv } from 'app/features/dashboard/services/TimeSrv';
|
||||
|
||||
export class MssqlDatasource {
|
||||
id: any;
|
||||
@ -8,14 +12,20 @@ export class MssqlDatasource {
|
||||
interval: string;
|
||||
|
||||
/** @ngInject */
|
||||
constructor(instanceSettings, private backendSrv, private $q, private templateSrv, private timeSrv) {
|
||||
constructor(
|
||||
instanceSettings: any,
|
||||
private backendSrv: BackendSrv,
|
||||
private $q: IQService,
|
||||
private templateSrv: TemplateSrv,
|
||||
private timeSrv: TimeSrv
|
||||
) {
|
||||
this.name = instanceSettings.name;
|
||||
this.id = instanceSettings.id;
|
||||
this.responseParser = new ResponseParser(this.$q);
|
||||
this.interval = (instanceSettings.jsonData || {}).timeInterval || '1m';
|
||||
}
|
||||
|
||||
interpolateVariable(value, variable) {
|
||||
interpolateVariable(value: any, variable: any) {
|
||||
if (typeof value === 'string') {
|
||||
if (variable.multi || variable.includeAll) {
|
||||
return "'" + value.replace(/'/g, `''`) + "'";
|
||||
@ -38,7 +48,7 @@ export class MssqlDatasource {
|
||||
return quotedValues.join(',');
|
||||
}
|
||||
|
||||
query(options) {
|
||||
query(options: any) {
|
||||
const queries = _.filter(options.targets, item => {
|
||||
return item.hide !== true;
|
||||
}).map(item => {
|
||||
@ -69,7 +79,7 @@ export class MssqlDatasource {
|
||||
.then(this.responseParser.processQueryResult);
|
||||
}
|
||||
|
||||
annotationQuery(options) {
|
||||
annotationQuery(options: any) {
|
||||
if (!options.annotation.rawQuery) {
|
||||
return this.$q.reject({ message: 'Query missing in annotation definition' });
|
||||
}
|
||||
@ -91,10 +101,10 @@ export class MssqlDatasource {
|
||||
queries: [query],
|
||||
},
|
||||
})
|
||||
.then(data => this.responseParser.transformAnnotationResponse(options, data));
|
||||
.then((data: any) => this.responseParser.transformAnnotationResponse(options, data));
|
||||
}
|
||||
|
||||
metricFindQuery(query, optionalOptions) {
|
||||
metricFindQuery(query: string, optionalOptions: { variable: { name: string } }) {
|
||||
let refId = 'tempvar';
|
||||
if (optionalOptions && optionalOptions.variable && optionalOptions.variable.name) {
|
||||
refId = optionalOptions.variable.name;
|
||||
@ -120,7 +130,7 @@ export class MssqlDatasource {
|
||||
method: 'POST',
|
||||
data: data,
|
||||
})
|
||||
.then(data => this.responseParser.parseMetricFindQueryResult(refId, data));
|
||||
.then((data: any) => this.responseParser.parseMetricFindQueryResult(refId, data));
|
||||
}
|
||||
|
||||
testDatasource() {
|
||||
@ -143,10 +153,10 @@ export class MssqlDatasource {
|
||||
],
|
||||
},
|
||||
})
|
||||
.then(res => {
|
||||
.then((res: any) => {
|
||||
return { status: 'success', message: 'Database Connection OK' };
|
||||
})
|
||||
.catch(err => {
|
||||
.catch((err: any) => {
|
||||
console.log(err);
|
||||
if (err.data && err.data.message) {
|
||||
return { status: 'error', message: err.data.message };
|
||||
|
@ -1,5 +1,6 @@
|
||||
import _ from 'lodash';
|
||||
import { QueryCtrl } from 'app/plugins/sdk';
|
||||
import { auto } from 'angular';
|
||||
|
||||
export interface MssqlQuery {
|
||||
refId: string;
|
||||
@ -34,7 +35,7 @@ export class MssqlQueryCtrl extends QueryCtrl {
|
||||
showHelp: boolean;
|
||||
|
||||
/** @ngInject */
|
||||
constructor($scope, $injector) {
|
||||
constructor($scope: any, $injector: auto.IInjectorService) {
|
||||
super($scope, $injector);
|
||||
|
||||
this.target.format = this.target.format || 'time_series';
|
||||
@ -55,7 +56,7 @@ export class MssqlQueryCtrl extends QueryCtrl {
|
||||
this.panelCtrl.events.on('data-error', this.onDataError.bind(this), $scope);
|
||||
}
|
||||
|
||||
onDataReceived(dataList) {
|
||||
onDataReceived(dataList: any) {
|
||||
this.lastQueryMeta = null;
|
||||
this.lastQueryError = null;
|
||||
|
||||
@ -65,7 +66,7 @@ export class MssqlQueryCtrl extends QueryCtrl {
|
||||
}
|
||||
}
|
||||
|
||||
onDataError(err) {
|
||||
onDataError(err: any) {
|
||||
if (err.data && err.data.results) {
|
||||
const queryRes = err.data.results[this.target.refId];
|
||||
if (queryRes) {
|
||||
|
Loading…
Reference in New Issue
Block a user