InputDatasource.ts 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. // Types
  2. import {
  3. DataQueryRequest,
  4. SeriesData,
  5. DataQueryResponse,
  6. DataSourceApi,
  7. DataSourceInstanceSettings,
  8. } from '@grafana/ui/src/types';
  9. import { InputQuery, InputOptions } from './types';
  10. export class InputDatasource extends DataSourceApi<InputQuery, InputOptions> {
  11. data: SeriesData[];
  12. constructor(instanceSettings: DataSourceInstanceSettings<InputOptions>) {
  13. super(instanceSettings);
  14. this.data = instanceSettings.jsonData.data ? instanceSettings.jsonData.data : [];
  15. }
  16. /**
  17. * Convert a query to a simple text string
  18. */
  19. getQueryDisplayText(query: InputQuery): string {
  20. if (query.data) {
  21. return 'Panel Data: ' + describeSeriesData(query.data);
  22. }
  23. return `Shared Data From: ${this.name} (${describeSeriesData(this.data)})`;
  24. }
  25. metricFindQuery(query: string, options?: any) {
  26. return new Promise((resolve, reject) => {
  27. const names = [];
  28. for (const series of this.data) {
  29. for (const field of series.fields) {
  30. // TODO, match query/options?
  31. names.push({
  32. text: field.name,
  33. });
  34. }
  35. }
  36. resolve(names);
  37. });
  38. }
  39. query(options: DataQueryRequest<InputQuery>): Promise<DataQueryResponse> {
  40. const results: SeriesData[] = [];
  41. for (const query of options.targets) {
  42. if (query.hide) {
  43. continue;
  44. }
  45. const data = query.data ? query.data : this.data;
  46. for (const series of data) {
  47. results.push({
  48. refId: query.refId,
  49. ...series,
  50. });
  51. }
  52. }
  53. return Promise.resolve({ data: results });
  54. }
  55. testDatasource() {
  56. return new Promise((resolve, reject) => {
  57. let rowCount = 0;
  58. let info = `${this.data.length} Series:`;
  59. for (const series of this.data) {
  60. info += ` [${series.fields.length} Fields, ${series.rows.length} Rows]`;
  61. rowCount += series.rows.length;
  62. }
  63. if (rowCount > 0) {
  64. resolve({
  65. status: 'success',
  66. message: info,
  67. });
  68. }
  69. reject({
  70. status: 'error',
  71. message: 'No Data Entered',
  72. });
  73. });
  74. }
  75. }
  76. export function describeSeriesData(data: SeriesData[]): string {
  77. if (!data || !data.length) {
  78. return '';
  79. }
  80. if (data.length > 1) {
  81. const count = data.reduce((acc, series) => {
  82. return acc + series.rows.length;
  83. }, 0);
  84. return `${data.length} Series, ${count} Rows`;
  85. }
  86. const series = data[0];
  87. if (!series.fields) {
  88. return 'Missing Fields';
  89. }
  90. return `${series.fields.length} Fields, ${series.rows.length} Rows`;
  91. }
  92. export default InputDatasource;