InputDatasource.ts 2.6 KB

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