mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
If the template variable query has two columns named __text and __value then return a list of key values. The value is used when the variable is interpolated in the query. Allows mapping of texts to ids.
144 lines
3.6 KiB
TypeScript
144 lines
3.6 KiB
TypeScript
///<reference path="../../../headers/common.d.ts" />
|
|
|
|
import _ from 'lodash';
|
|
|
|
export default class ResponseParser {
|
|
constructor(private $q){}
|
|
|
|
processQueryResult(res) {
|
|
var data = [];
|
|
|
|
if (!res.data.results) {
|
|
return {data: data};
|
|
}
|
|
|
|
for (let key in res.data.results) {
|
|
let queryRes = res.data.results[key];
|
|
|
|
if (queryRes.series) {
|
|
for (let series of queryRes.series) {
|
|
data.push({
|
|
target: series.name,
|
|
datapoints: series.points,
|
|
refId: queryRes.refId,
|
|
meta: queryRes.meta,
|
|
});
|
|
}
|
|
}
|
|
|
|
if (queryRes.tables) {
|
|
for (let table of queryRes.tables) {
|
|
table.type = 'table';
|
|
table.refId = queryRes.refId;
|
|
table.meta = queryRes.meta;
|
|
data.push(table);
|
|
}
|
|
}
|
|
}
|
|
|
|
return {data: data};
|
|
}
|
|
|
|
parseMetricFindQueryResult(refId, results) {
|
|
if (!results || results.data.length === 0 || results.data.results[refId].meta.rowCount === 0) { return []; }
|
|
|
|
const columns = results.data.results[refId].tables[0].columns;
|
|
const rows = results.data.results[refId].tables[0].rows;
|
|
const textColIndex = this.findColIndex(columns, '__text');
|
|
const valueColIndex = this.findColIndex(columns, '__value');
|
|
|
|
if (columns.length === 2 && textColIndex !== -1 && valueColIndex !== -1){
|
|
return this.transformToKeyValueList(rows, textColIndex, valueColIndex);
|
|
}
|
|
|
|
return this.transformToSimpleList(rows);
|
|
}
|
|
|
|
transformToKeyValueList(rows, textColIndex, valueColIndex) {
|
|
const res = [];
|
|
|
|
for (let i = 0; i < rows.length; i++) {
|
|
if (!this.containsKey(res, rows[i][textColIndex])) {
|
|
res.push({text: rows[i][textColIndex], value: rows[i][valueColIndex]});
|
|
}
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
transformToSimpleList(rows) {
|
|
const res = [];
|
|
|
|
for (let i = 0; i < rows.length; i++) {
|
|
for (let j = 0; j < rows[i].length; j++) {
|
|
const value = rows[i][j];
|
|
if ( res.indexOf( value ) === -1 ) {
|
|
res.push(value);
|
|
}
|
|
}
|
|
}
|
|
|
|
return _.map(res, value => {
|
|
return { text: value};
|
|
});
|
|
}
|
|
|
|
findColIndex(columns, colName) {
|
|
for (let i = 0; i < columns.length; i++) {
|
|
if (columns[i].text === colName) {
|
|
return i;
|
|
}
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
containsKey(res, key) {
|
|
for (let i = 0; i < res.length; i++) {
|
|
if (res[i].text === key) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
transformAnnotationResponse(options, data) {
|
|
const table = data.data.results[options.annotation.name].tables[0];
|
|
|
|
let timeColumnIndex = -1;
|
|
let titleColumnIndex = -1;
|
|
let textColumnIndex = -1;
|
|
let tagsColumnIndex = -1;
|
|
|
|
for (let i = 0; i < table.columns.length; i++) {
|
|
if (table.columns[i].text === 'time_sec') {
|
|
timeColumnIndex = i;
|
|
} else if (table.columns[i].text === 'title') {
|
|
titleColumnIndex = i;
|
|
} else if (table.columns[i].text === 'text') {
|
|
textColumnIndex = i;
|
|
} else if (table.columns[i].text === 'tags') {
|
|
tagsColumnIndex = i;
|
|
}
|
|
}
|
|
|
|
if (timeColumnIndex === -1) {
|
|
return this.$q.reject({message: 'Missing mandatory time column (with time_sec column alias) in annotation query.'});
|
|
}
|
|
|
|
const list = [];
|
|
for (let i = 0; i < table.rows.length; i++) {
|
|
const row = table.rows[i];
|
|
list.push({
|
|
annotation: options.annotation,
|
|
time: Math.floor(row[timeColumnIndex]) * 1000,
|
|
title: row[titleColumnIndex],
|
|
text: row[textColumnIndex],
|
|
tags: row[tagsColumnIndex] ? row[tagsColumnIndex].trim().split(/\s*,\s*/) : []
|
|
});
|
|
}
|
|
|
|
return list;
|
|
}
|
|
}
|