1{"version":3,"file":"mixedPlugin.0e38943fa459e872fe93.js","mappings":"ijDAoBO,MAAMA,UAAwBC,EAAAA,cACnCC,YAAYC,GACVC,MAAMD,GAGRE,MAAMC,GAEJ,MAAMC,EAAUD,EAAQE,QAAQC,QAAQC,IAAM,MAC5C,MAf+B,iBAexB,UAAAA,EAAEC,kBAAF,eAAcC,QAGvB,IAAKL,EAAQM,OACX,OAAOC,EAAAA,EAAAA,IAAG,CAAEC,KAAM,KAIpB,MAAMC,GAAuCC,EAAAA,EAAAA,SAAQV,EAAS,kBACxDW,EAA0B,GAEhC,IAAK,MAAMC,KAAOH,EAAM,CACtB,MAAMR,EAAUQ,EAAKG,GAErBD,EAAME,KAAK,CACTT,YAAYU,EAAAA,EAAAA,oBAAmBC,IAAId,EAAQ,GAAGG,WAAYL,EAAQiB,YAClEf,QAAAA,IAKJ,OAAKU,EAAML,OAIJW,KAAKC,aAAaP,EAAOZ,IAHvBQ,EAAAA,EAAAA,IAAG,CAAEC,KAAM,KAMtBU,aAAaP,EAAyBZ,GACpC,MAAMoB,EAAiBR,EAAMT,OAAOe,KAAKG,aAAaC,KAAI,CAACvB,EAAOwB,KAChEC,EAAAA,EAAAA,IAAKzB,EAAMM,YAAYoB,MACrBC,EAAAA,EAAAA,IAAUC,IACR,MAAMC,GAAYC,EAAAA,EAAAA,WAAU7B,GAI5B,OAHA4B,EAAUE,UAAa,SAAQP,KAAKK,EAAUE,WAAa,KAC3DF,EAAU1B,QAAUH,EAAMG,SAEnBsB,EAAAA,EAAAA,IAAKG,EAAI5B,MAAM6B,IAAYH,MAChCH,EAAAA,EAAAA,IAAKS,GACH,iBACKA,EADL,CAEEtB,KAAMsB,EAAStB,MAAQ,GACvBuB,MAAOC,EAAAA,aAAAA,QACPpB,IAAM,SAAQU,KAAKQ,EAASlB,KAAO,UAGvCqB,EAAAA,EAAAA,MACAC,EAAAA,EAAAA,IAAYC,KACVA,GAAMC,EAAAA,EAAAA,kBAAiBD,IACnBE,QAAW,GAAEX,EAAIY,SAASH,EAAIE,WAE3B9B,EAAAA,EAAAA,IAAwB,CAC7B,CACEC,KAAM,GACNuB,MAAOC,EAAAA,aAAAA,MACPO,MAAOJ,EACPvB,IAAM,SAAQU,KAAKK,EAAUE,WAAa,kBASxD,OAAOW,EAAAA,EAAAA,GAASrB,GAAgBK,MA8B3BiB,EAAAA,EAAAA,IAAO,CAACC,EAA0BC,IAChCA,EAAQF,QAAO,CAACG,EAAUC,KAC/BD,EAAS/B,KAAKiC,MAAMF,EAAUC,GACvBD,IACNF,IACF,KAnCwDrB,EAAAA,EAAAA,GAAIJ,KAAK8B,oBAAoBC,EAAAA,EAAAA,MAGxFC,iBACE,OAAOC,QAAQC,QAAQ,IAGjB/B,YAAYtB,GAClB,OAAOA,GAASsD,MAAMC,QAAQvD,EAAMG,UAAYH,EAAMG,QAAQK,OAAS,EAGjEyC,kBAAkBO,GACxB,MAAM,OAAEhD,GAAWgD,EAEnB,GAAe,IAAXhD,EACF,OAAOgD,EAGT,MAAMf,EAAQe,EAAUC,MAAMzB,GAAaA,EAASC,QAAUC,EAAAA,aAAAA,QAO9D,OANIO,EACFe,EAAUzC,KAAK0B,GAEfe,EAAUhD,EAAS,GAAGyB,MAAQC,EAAAA,aAAAA,KAGzBsB","sources":["webpack://grafana/./public/app/plugins/datasource/mixed/MixedDataSource.ts"],"sourcesContent":["import {\n DataQuery,\n DataQueryRequest,\n DataQueryResponse,\n DataSourceApi,\n DataSourceInstanceSettings,\n LoadingState,\n} from '@grafana/data';\nimport { getDataSourceSrv, toDataQueryError } from '@grafana/runtime';\nimport { cloneDeep, groupBy } from 'lodash';\nimport { forkJoin, from, Observable, of, OperatorFunction } from 'rxjs';\nimport { catchError, map, mergeAll, mergeMap, reduce, toArray } from 'rxjs/operators';\n\nexport const MIXED_DATASOURCE_NAME = '-- Mixed --';\n\nexport interface BatchedQueries {\n datasource: Promise<DataSourceApi>;\n targets: DataQuery[];\n}\n\nexport class MixedDatasource extends DataSourceApi<DataQuery> {\n constructor(instanceSettings: DataSourceInstanceSettings) {\n super(instanceSettings);\n }\n\n query(request: DataQueryRequest<DataQuery>): Observable<DataQueryResponse> {\n // Remove any invalid queries\n const queries = request.targets.filter((t) => {\n return t.datasource?.uid !== MIXED_DATASOURCE_NAME;\n });\n\n if (!queries.length) {\n return of({ data: [] } as DataQueryResponse); // nothing\n }\n\n // Build groups of queries to run in parallel\n const sets: { [key: string]: DataQuery[] } = groupBy(queries, 'datasource.uid');\n const mixed: BatchedQueries[] = [];\n\n for (const key in sets) {\n const targets = sets[key];\n\n mixed.push({\n datasource: getDataSourceSrv().get(targets[0].datasource, request.scopedVars),\n targets,\n });\n }\n\n // Missing UIDs?\n if (!mixed.length) {\n return of({ data: [] } as DataQueryResponse); // nothing\n }\n\n return this.batchQueries(mixed, request);\n }\n\n batchQueries(mixed: BatchedQueries[], request: DataQueryRequest<DataQuery>): Observable<DataQueryResponse> {\n const runningQueries = mixed.filter(this.isQueryable).map((query, i) =>\n from(query.datasource).pipe(\n mergeMap((api: DataSourceApi) => {\n const dsRequest = cloneDeep(request);\n dsRequest.requestId = `mixed-${i}-${dsRequest.requestId || ''}`;\n dsRequest.targets = query.targets;\n\n return from(api.query(dsRequest)).pipe(\n map((response) => {\n return {\n ...response,\n data: response.data || [],\n state: LoadingState.Loading,\n key: `mixed-${i}-${response.key || ''}`,\n } as DataQueryResponse;\n }),\n toArray(),\n catchError((err) => {\n err = toDataQueryError(err);\n err.message = `${api.name}: ${err.message}`;\n\n return of<DataQueryResponse[]>([\n {\n data: [],\n state: LoadingState.Error,\n error: err,\n key: `mixed-${i}-${dsRequest.requestId || ''}`,\n },\n ]);\n })\n );\n })\n )\n );\n\n return forkJoin(runningQueries).pipe(flattenResponses(), map(this.finalizeResponses), mergeAll());\n }\n\n testDatasource() {\n return Promise.resolve({});\n }\n\n private isQueryable(query: BatchedQueries): boolean {\n return query && Array.isArray(query.targets) && query.targets.length > 0;\n }\n\n private finalizeResponses(responses: DataQueryResponse[]): DataQueryResponse[] {\n const { length } = responses;\n\n if (length === 0) {\n return responses;\n }\n\n const error = responses.find((response) => response.state === LoadingState.Error);\n if (error) {\n responses.push(error); // adds the first found error entry so error shows up in the panel\n } else {\n responses[length - 1].state = LoadingState.Done;\n }\n\n return responses;\n }\n}\n\nfunction flattenResponses(): OperatorFunction<DataQueryResponse[][], DataQueryResponse[]> {\n return reduce((all: DataQueryResponse[], current) => {\n return current.reduce((innerAll, innerCurrent) => {\n innerAll.push.apply(innerAll, innerCurrent);\n return innerAll;\n }, all);\n }, []);\n}\n"],"names":["MixedDatasource","DataSourceApi","constructor","instanceSettings","super","query","request","queries","targets","filter","t","datasource","uid","length","of","data","sets","groupBy","mixed","key","push","getDataSourceSrv","get","scopedVars","this","batchQueries","runningQueries","isQueryable","map","i","from","pipe","mergeMap","api","dsRequest","cloneDeep","requestId","response","state","LoadingState","toArray","catchError","err","toDataQueryError","message","name","error","forkJoin","reduce","all","current","innerAll","innerCurrent","apply","finalizeResponses","mergeAll","testDatasource","Promise","resolve","Array","isArray","responses","find"],"sourceRoot":""}