grafana/public/app/plugins/datasource/input/InputDatasource.ts
Dominik Prokop 9b7748ec13
Chore: Reorg packages (#20111)
Primarily- moving majority of the types and utils from @grafana/ui to @grafana/data

* Move types from grafana-ui to grafana-data

* Move valueFormats to grafana-data

* Move utils from grafana-ui to grafana-data

* Update imports in grafana-ui

* revert data's tsconfig change

* Update imports in grafana-runtime

* Fix import paths in grafana-ui

* Move rxjs to devDeps

* Core import updates batch 1

* Import updates batch 2

* Imports fix batch 3

* Imports fixes batch i don't know

* Fix imorts in grafana-toolkit

* Fix imports after master merge
2019-10-31 10:48:05 +01:00

124 lines
3.0 KiB
TypeScript

// Types
import {
DataQueryRequest,
DataQueryResponse,
DataSourceApi,
DataSourceInstanceSettings,
MetricFindValue,
DataFrame,
DataFrameDTO,
toDataFrame,
} from '@grafana/data';
import { InputQuery, InputOptions } from './types';
export class InputDatasource extends DataSourceApi<InputQuery, InputOptions> {
data: DataFrame[] = [];
constructor(instanceSettings: DataSourceInstanceSettings<InputOptions>) {
super(instanceSettings);
if (instanceSettings.jsonData.data) {
this.data = instanceSettings.jsonData.data.map(v => toDataFrame(v));
}
}
/**
* Convert a query to a simple text string
*/
getQueryDisplayText(query: InputQuery): string {
if (query.data) {
return 'Panel Data: ' + describeDataFrame(query.data);
}
return `Shared Data From: ${this.name} (${describeDataFrame(this.data)})`;
}
metricFindQuery(query: string, options?: any): Promise<MetricFindValue[]> {
return new Promise((resolve, reject) => {
const names = [];
for (const series of this.data) {
for (const field of series.fields) {
// TODO, match query/options?
names.push({
text: field.name,
});
}
}
resolve(names);
});
}
query(options: DataQueryRequest<InputQuery>): Promise<DataQueryResponse> {
const results: DataFrame[] = [];
for (const query of options.targets) {
if (query.hide) {
continue;
}
let data = this.data;
if (query.data) {
data = query.data.map(v => toDataFrame(v));
}
for (let i = 0; i < data.length; i++) {
results.push({
...data[i],
refId: query.refId,
});
}
}
return Promise.resolve({ data: results });
}
testDatasource() {
return new Promise((resolve, reject) => {
let rowCount = 0;
let info = `${this.data.length} Series:`;
for (const series of this.data) {
const length = series.length;
info += ` [${series.fields.length} Fields, ${length} Rows]`;
rowCount += length;
}
if (rowCount > 0) {
resolve({
status: 'success',
message: info,
});
}
reject({
status: 'error',
message: 'No Data Entered',
});
});
}
}
function getLength(data?: DataFrameDTO | DataFrame) {
if (!data || !data.fields || !data.fields.length) {
return 0;
}
if (data.hasOwnProperty('length')) {
return (data as DataFrame).length;
}
return data.fields[0].values.length;
}
export function describeDataFrame(data: Array<DataFrameDTO | DataFrame>): string {
if (!data || !data.length) {
return '';
}
if (data.length > 1) {
const count = data.reduce((acc, series) => {
return acc + getLength(series);
}, 0);
return `${data.length} Series, ${count} Rows`;
}
const series = data[0];
if (!series.fields) {
return 'Missing Fields';
}
const length = getLength(series);
return `${series.fields.length} Fields, ${length} Rows`;
}
export default InputDatasource;