From 55717769a31c5380c514dd18716e394d85bd0a73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Thu, 12 Sep 2019 21:42:50 +0200 Subject: [PATCH] QueryProcessing: Fixes showing last result in initial loading state (#19057) * PanelQueryRunner: Need to cache preProcessPanelData function between runs so last result can be remembered * Better fix for remembering lastResult * Code simplification * Simplify code a bit --- .../dashboard/state/PanelQueryRunner.ts | 7 +++-- .../features/dashboard/state/runRequest.ts | 27 +++++++------------ public/app/features/explore/state/actions.ts | 7 ++++- public/app/features/explore/state/reducers.ts | 4 +-- 4 files changed, 21 insertions(+), 24 deletions(-) diff --git a/public/app/features/dashboard/state/PanelQueryRunner.ts b/public/app/features/dashboard/state/PanelQueryRunner.ts index a8a5cf1f411..85e9c7eca2d 100644 --- a/public/app/features/dashboard/state/PanelQueryRunner.ts +++ b/public/app/features/dashboard/state/PanelQueryRunner.ts @@ -44,6 +44,7 @@ export class PanelQueryRunner { private subject?: ReplaySubject; private subscription?: Unsubscribable; private transformations?: DataTransformerConfig[]; + private lastResult?: PanelData; constructor() { this.subject = new ReplaySubject(1); @@ -153,12 +154,10 @@ export class PanelQueryRunner { this.subscription.unsubscribe(); } - // Makes sure everything is a proper DataFrame - const prepare = preProcessPanelData(); - this.subscription = observable.subscribe({ next: (data: PanelData) => { - this.subject.next(prepare(data)); + this.lastResult = preProcessPanelData(data, this.lastResult); + this.subject.next(this.lastResult); }, }); } diff --git a/public/app/features/dashboard/state/runRequest.ts b/public/app/features/dashboard/state/runRequest.ts index 9a41a060ec9..4575724f5fd 100644 --- a/public/app/features/dashboard/state/runRequest.ts +++ b/public/app/features/dashboard/state/runRequest.ts @@ -187,25 +187,18 @@ export function getProcessedDataFrames(results?: DataQueryResponseData[]): DataF return dataFrames; } -export function preProcessPanelData() { - let lastResult: PanelData = null; +export function preProcessPanelData(data: PanelData, lastResult: PanelData) { + let { series } = data; - return function mapper(data: PanelData) { - let { series } = data; - - // for loading states with no data, use last result - if (data.state === LoadingState.Loading && series.length === 0) { - if (!lastResult) { - lastResult = data; - } - - return { ...lastResult, state: LoadingState.Loading }; + // for loading states with no data, use last result + if (data.state === LoadingState.Loading && series.length === 0) { + if (!lastResult) { + lastResult = data; } - // Makes sure the data is properly formatted - series = getProcessedDataFrames(series); + return { ...lastResult, state: LoadingState.Loading }; + } - lastResult = { ...data, series }; - return lastResult; - }; + // Makes sure the data is properly formatted + return getProcessedDataFrames(series); } diff --git a/public/app/features/explore/state/actions.ts b/public/app/features/explore/state/actions.ts index f5fb5091082..c09d0f8c2c1 100644 --- a/public/app/features/explore/state/actions.ts +++ b/public/app/features/explore/state/actions.ts @@ -439,6 +439,7 @@ export function runQueries(exploreId: ExploreId): ThunkResult { queryIntervals, range, scanning, + queryResponse, querySubscription, history, mode, @@ -479,7 +480,11 @@ export function runQueries(exploreId: ExploreId): ThunkResult { let firstResponse = true; const newQuerySub = runRequest(datasourceInstance, transaction.request) - .pipe(map(preProcessPanelData())) + .pipe( + map((data: PanelData) => { + return preProcessPanelData(data, queryResponse); + }) + ) .subscribe((data: PanelData) => { if (!data.error && firstResponse) { // Side-effect: Saving history in localstorage diff --git a/public/app/features/explore/state/reducers.ts b/public/app/features/explore/state/reducers.ts index 1d8b0d2471f..8b57d63ba9b 100644 --- a/public/app/features/explore/state/reducers.ts +++ b/public/app/features/explore/state/reducers.ts @@ -618,8 +618,8 @@ export const processQueryResponse = ( const latency = request.endTime ? request.endTime - request.startTime : 0; const processor = new ResultProcessor(state, series); - const graphResult = processor.getGraphResult() || state.graphResult; // don't replace results until we receive new results - const tableResult = processor.getTableResult() || state.tableResult || new TableModel(); // don't replace results until we receive new results + const graphResult = processor.getGraphResult(); + const tableResult = processor.getTableResult(); const logsResult = processor.getLogsResult(); // Send legacy data to Angular editors