diff --git a/superset-frontend/src/SqlLab/reducers/sqlLab.js b/superset-frontend/src/SqlLab/reducers/sqlLab.js index 5f0b27e97..5741ad887 100644 --- a/superset-frontend/src/SqlLab/reducers/sqlLab.js +++ b/superset-frontend/src/SqlLab/reducers/sqlLab.js @@ -17,6 +17,8 @@ * under the License. */ import { normalizeTimestamp, QueryState, t } from '@superset-ui/core'; +import { isEqual, omit } from 'lodash'; +import { shallowEqual } from 'react-redux'; import * as actions from '../actions/sqlLab'; import { now } from '../../utils/dates'; import { @@ -696,7 +698,17 @@ export default function sqlLabReducer(state = {}, action) { ? prevState : currentState, }; - change = true; + if ( + shallowEqual( + omit(newQueries[id], ['extra']), + omit(state.queries[id], ['extra']), + ) && + isEqual(newQueries[id].extra, state.queries[id].extra) + ) { + newQueries[id] = state.queries[id]; + } else { + change = true; + } } }); if (!change) { diff --git a/superset-frontend/src/SqlLab/reducers/sqlLab.test.js b/superset-frontend/src/SqlLab/reducers/sqlLab.test.js index c3b603667..d805b2cf1 100644 --- a/superset-frontend/src/SqlLab/reducers/sqlLab.test.js +++ b/superset-frontend/src/SqlLab/reducers/sqlLab.test.js @@ -449,6 +449,35 @@ describe('sqlLabReducer', () => { expect(newState.queries.abcd.endDttm).toBe(Number(endDttmInStr)); expect(newState.queriesLastUpdate).toBe(CHANGED_ON_TIMESTAMP); }); + it('should skip refreshing queries when polling contains existing results', () => { + const completedQuery = { + ...query, + extra: { + columns: [], + progress: null, + }, + }; + newState = sqlLabReducer( + { + ...newState, + queries: { abcd: query, def: completedQuery }, + }, + actions.refreshQueries({ + abcd: { + ...query, + }, + def: { + ...completedQuery, + extra: { + columns: [], + progress: null, + }, + }, + }), + ); + expect(newState.queries.abcd).toBe(query); + expect(newState.queries.def).toBe(completedQuery); + }); it('should refresh queries when polling returns empty', () => { newState = sqlLabReducer(newState, actions.refreshQueries({})); });