2019-04-12 12:13:36 -05:00
|
|
|
// Types
|
|
|
|
import {
|
2019-04-18 23:56:27 -05:00
|
|
|
DataQueryRequest,
|
2019-07-01 14:00:29 -05:00
|
|
|
DataFrame,
|
2019-04-12 12:13:36 -05:00
|
|
|
DataQueryResponse,
|
|
|
|
DataSourceApi,
|
|
|
|
DataSourceInstanceSettings,
|
2019-06-10 07:39:53 -05:00
|
|
|
MetricFindValue,
|
2019-04-12 12:13:36 -05:00
|
|
|
} from '@grafana/ui/src/types';
|
2019-05-02 23:56:54 -05:00
|
|
|
import { InputQuery, InputOptions } from './types';
|
2019-04-12 12:13:36 -05:00
|
|
|
|
2019-05-10 04:37:43 -05:00
|
|
|
export class InputDatasource extends DataSourceApi<InputQuery, InputOptions> {
|
2019-07-01 14:00:29 -05:00
|
|
|
data: DataFrame[];
|
2019-04-12 12:13:36 -05:00
|
|
|
|
2019-05-02 23:56:54 -05:00
|
|
|
constructor(instanceSettings: DataSourceInstanceSettings<InputOptions>) {
|
2019-05-10 04:37:43 -05:00
|
|
|
super(instanceSettings);
|
2019-04-12 12:13:36 -05:00
|
|
|
|
2019-05-10 04:37:43 -05:00
|
|
|
this.data = instanceSettings.jsonData.data ? instanceSettings.jsonData.data : [];
|
2019-04-12 12:13:36 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Convert a query to a simple text string
|
|
|
|
*/
|
|
|
|
getQueryDisplayText(query: InputQuery): string {
|
|
|
|
if (query.data) {
|
2019-07-01 14:00:29 -05:00
|
|
|
return 'Panel Data: ' + describeDataFrame(query.data);
|
2019-04-12 12:13:36 -05:00
|
|
|
}
|
2019-07-01 14:00:29 -05:00
|
|
|
return `Shared Data From: ${this.name} (${describeDataFrame(this.data)})`;
|
2019-04-12 12:13:36 -05:00
|
|
|
}
|
|
|
|
|
2019-06-10 07:39:53 -05:00
|
|
|
metricFindQuery(query: string, options?: any): Promise<MetricFindValue[]> {
|
2019-04-12 12:13:36 -05:00
|
|
|
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);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2019-04-18 23:56:27 -05:00
|
|
|
query(options: DataQueryRequest<InputQuery>): Promise<DataQueryResponse> {
|
2019-07-01 14:00:29 -05:00
|
|
|
const results: DataFrame[] = [];
|
2019-04-12 12:13:36 -05:00
|
|
|
for (const query of options.targets) {
|
|
|
|
if (query.hide) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
const data = query.data ? query.data : this.data;
|
|
|
|
for (const series of data) {
|
|
|
|
results.push({
|
|
|
|
refId: query.refId,
|
|
|
|
...series,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
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) {
|
|
|
|
info += ` [${series.fields.length} Fields, ${series.rows.length} Rows]`;
|
|
|
|
rowCount += series.rows.length;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (rowCount > 0) {
|
|
|
|
resolve({
|
|
|
|
status: 'success',
|
|
|
|
message: info,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
reject({
|
|
|
|
status: 'error',
|
|
|
|
message: 'No Data Entered',
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-07-01 14:00:29 -05:00
|
|
|
export function describeDataFrame(data: DataFrame[]): string {
|
2019-05-15 00:20:27 -05:00
|
|
|
if (!data || !data.length) {
|
|
|
|
return '';
|
|
|
|
}
|
|
|
|
if (data.length > 1) {
|
|
|
|
const count = data.reduce((acc, series) => {
|
|
|
|
return acc + series.rows.length;
|
|
|
|
}, 0);
|
|
|
|
return `${data.length} Series, ${count} Rows`;
|
|
|
|
}
|
|
|
|
const series = data[0];
|
|
|
|
if (!series.fields) {
|
|
|
|
return 'Missing Fields';
|
|
|
|
}
|
|
|
|
return `${series.fields.length} Fields, ${series.rows.length} Rows`;
|
|
|
|
}
|
|
|
|
|
2019-04-12 12:13:36 -05:00
|
|
|
export default InputDatasource;
|