MixedDataSource.ts 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import cloneDeep from 'lodash/cloneDeep';
  2. import groupBy from 'lodash/groupBy';
  3. import map from 'lodash/map';
  4. import flatten from 'lodash/flatten';
  5. import filter from 'lodash/filter';
  6. import {
  7. DataSourceApi,
  8. DataQuery,
  9. DataQueryRequest,
  10. DataQueryResponse,
  11. DataStreamObserver,
  12. DataSourceInstanceSettings,
  13. } from '@grafana/ui';
  14. import { getDataSourceSrv } from '@grafana/runtime';
  15. export const MIXED_DATASOURCE_NAME = '-- Mixed --';
  16. export class MixedDatasource extends DataSourceApi<DataQuery> {
  17. constructor(instanceSettings: DataSourceInstanceSettings) {
  18. super(instanceSettings);
  19. }
  20. async query(request: DataQueryRequest<DataQuery>, observer: DataStreamObserver): Promise<DataQueryResponse> {
  21. // Remove any invalid queries
  22. const queries = request.targets.filter(t => {
  23. return t.datasource !== MIXED_DATASOURCE_NAME;
  24. });
  25. if (!queries.length) {
  26. return Promise.resolve({ data: [] }); // nothing
  27. }
  28. const sets = groupBy(queries, 'datasource');
  29. const promises = map(sets, (targets: DataQuery[]) => {
  30. const dsName = targets[0].datasource;
  31. return getDataSourceSrv()
  32. .get(dsName)
  33. .then((ds: DataSourceApi) => {
  34. const opt = cloneDeep(request);
  35. // Remove any unused hidden queries
  36. if (!ds.meta.hiddenQueries) {
  37. targets = filter(targets, (t: DataQuery) => {
  38. return !t.hide;
  39. });
  40. if (targets.length === 0) {
  41. return { data: [] };
  42. }
  43. }
  44. opt.targets = targets;
  45. return ds.query(opt);
  46. });
  47. });
  48. return Promise.all(promises).then(results => {
  49. return { data: flatten(map(results, 'data')) };
  50. });
  51. }
  52. testDatasource() {
  53. return Promise.resolve({});
  54. }
  55. }