datasource.ts 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import _ from 'lodash';
  2. import { DataSourceApi, DataQuery, DataQueryRequest, DataSourceInstanceSettings } from '@grafana/ui';
  3. import DatasourceSrv from 'app/features/plugins/datasource_srv';
  4. class MixedDatasource extends DataSourceApi<DataQuery> {
  5. /** @ngInject */
  6. constructor(instanceSettings: DataSourceInstanceSettings, private datasourceSrv: DatasourceSrv) {
  7. super(instanceSettings);
  8. }
  9. query(options: DataQueryRequest<DataQuery>) {
  10. const sets = _.groupBy(options.targets, 'datasource');
  11. const promises: any = _.map(sets, (targets: DataQuery[]) => {
  12. const dsName = targets[0].datasource;
  13. if (dsName === '-- Mixed --') {
  14. return Promise.resolve([]);
  15. }
  16. if (targets.length === 0) {
  17. return { data: [] };
  18. }
  19. return this.datasourceSrv.get(dsName).then(ds => {
  20. // Remove any unused hidden queries
  21. if (!ds.meta.hiddenQueries) {
  22. targets = _.filter(targets, (t: DataQuery) => {
  23. return !t.hide;
  24. });
  25. if (targets.length === 0) {
  26. return { data: [] };
  27. }
  28. }
  29. const opt = _.cloneDeep(options);
  30. opt.targets = targets;
  31. return ds.query(opt);
  32. });
  33. });
  34. return Promise.all(promises).then(results => {
  35. return { data: _.flatten(_.map(results, 'data')) };
  36. });
  37. }
  38. testDatasource() {
  39. return Promise.resolve({});
  40. }
  41. }
  42. export { MixedDatasource, MixedDatasource as Datasource };