runQueriesEpic.ts 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. import { Epic } from 'redux-observable';
  2. import { NEVER } from 'rxjs';
  3. import { mergeMap } from 'rxjs/operators';
  4. import { ActionOf } from 'app/core/redux/actionCreatorFactory';
  5. import { StoreState } from 'app/types/store';
  6. import { hasNonEmptyQuery } from 'app/core/utils/explore';
  7. import {
  8. clearQueriesAction,
  9. runQueriesAction,
  10. RunQueriesPayload,
  11. runQueriesBatchAction,
  12. stateSaveAction,
  13. } from '../actionTypes';
  14. export const runQueriesEpic: Epic<ActionOf<any>, ActionOf<any>, StoreState> = (action$, state$) => {
  15. return action$.ofType(runQueriesAction.type).pipe(
  16. mergeMap((action: ActionOf<RunQueriesPayload>) => {
  17. const { exploreId } = action.payload;
  18. const { datasourceInstance, queries, datasourceError, containerWidth, isLive } = state$.value.explore[exploreId];
  19. if (datasourceError) {
  20. // let's not run any queries if data source is in a faulty state
  21. return NEVER;
  22. }
  23. if (!hasNonEmptyQuery(queries)) {
  24. return [clearQueriesAction({ exploreId }), stateSaveAction()]; // Remember to save to state and update location
  25. }
  26. // Some datasource's query builders allow per-query interval limits,
  27. // but we're using the datasource interval limit for now
  28. const interval = datasourceInstance.interval;
  29. const live = isLive;
  30. return [runQueriesBatchAction({ exploreId, queryOptions: { interval, maxDataPoints: containerWidth, live } })];
  31. })
  32. );
  33. };