InputDatasource.ts 2.5 KB

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