From 6c012e1136ddb5d3a1167d38679e23a38d588305 Mon Sep 17 00:00:00 2001 From: justinpark Date: Wed, 27 Sep 2023 10:48:13 -0700 Subject: [PATCH] fix(sqllab): invalid running query startdate --- .../SqlLab/reducers/getInitialState.test.ts | 52 +++++++++++++++++++ .../src/SqlLab/reducers/getInitialState.ts | 30 +++++------ .../src/hooks/apiResources/sqlLab.ts | 9 +++- 3 files changed, 75 insertions(+), 16 deletions(-) diff --git a/superset-frontend/src/SqlLab/reducers/getInitialState.test.ts b/superset-frontend/src/SqlLab/reducers/getInitialState.test.ts index c4f064f650e66..aca11e2cca10f 100644 --- a/superset-frontend/src/SqlLab/reducers/getInitialState.test.ts +++ b/superset-frontend/src/SqlLab/reducers/getInitialState.test.ts @@ -18,6 +18,7 @@ */ import { DEFAULT_COMMON_BOOTSTRAP_DATA } from 'src/constants'; +import { runningQuery, successfulQuery } from 'src/SqlLab/fixtures'; import getInitialState, { dedupeTabHistory } from './getInitialState'; const apiData = { @@ -192,5 +193,56 @@ describe('getInitialState', () => { }).sqlLab.tables; expect(initializedTables.map(({ id }) => id)).toEqual([1, 2, 6]); }); + + it('should parse the float dttm value', () => { + const startDttmInStr = '1693433503447.166992'; + const endDttmInStr = '1693433503500.23132'; + + localStorage.setItem( + 'redux', + JSON.stringify({ + sqlLab: { + tables: [ + { id: 1, name: 'test1' }, + { id: 6, name: 'test6' }, + ], + queryEditors: [{ id: 1, title: 'editor1' }], + queries: { + localStoragePersisted: { + ...successfulQuery, + id: 'localStoragePersisted', + startDttm: startDttmInStr, + endDttm: endDttmInStr, + }, + }, + tabHistory: [], + }, + }), + ); + + const initializedQueries = getInitialState({ + ...apiData, + queries: { + backendPersisted: { + ...runningQuery, + id: 'backendPersisted', + startDttm: startDttmInStr, + endDttm: endDttmInStr, + }, + }, + }).sqlLab.queries; + expect(initializedQueries.backendPersisted).toEqual( + expect.objectContaining({ + startDttm: Number(startDttmInStr), + endDttm: Number(endDttmInStr), + }), + ); + expect(initializedQueries.localStoragePersisted).toEqual( + expect.objectContaining({ + startDttm: Number(startDttmInStr), + endDttm: Number(endDttmInStr), + }), + ); + }); }); }); diff --git a/superset-frontend/src/SqlLab/reducers/getInitialState.ts b/superset-frontend/src/SqlLab/reducers/getInitialState.ts index 9867e9bf2cf23..cd5c46540b288 100644 --- a/superset-frontend/src/SqlLab/reducers/getInitialState.ts +++ b/superset-frontend/src/SqlLab/reducers/getInitialState.ts @@ -130,20 +130,7 @@ export default function getInitialState({ }); } - const queries = Object.fromEntries( - Object.entries(queries_ || {}).map(([queryId, query]) => [ - queryId, - { - ...query, - ...(query.startDttm && { - startDttm: Number(query.startDttm), - }), - ...(query.endDttm && { - endDttm: Number(query.endDttm), - }), - }, - ]), - ); + const queries = { ...queries_ }; /** * If the `SQLLAB_BACKEND_PERSISTENCE` feature flag is off, or if the user @@ -205,7 +192,20 @@ export default function getInitialState({ alerts: [], databases, offline: false, - queries, + queries: Object.fromEntries( + Object.entries(queries).map(([queryId, query]) => [ + queryId, + { + ...query, + ...(query.startDttm && { + startDttm: Number(query.startDttm), + }), + ...(query.endDttm && { + endDttm: Number(query.endDttm), + }), + }, + ]), + ), queryEditors: Object.values(queryEditors), tabHistory: dedupeTabHistory(tabHistory), tables: Object.values(tables), diff --git a/superset-frontend/src/hooks/apiResources/sqlLab.ts b/superset-frontend/src/hooks/apiResources/sqlLab.ts index dac53043c3dda..123db414e2681 100644 --- a/superset-frontend/src/hooks/apiResources/sqlLab.ts +++ b/superset-frontend/src/hooks/apiResources/sqlLab.ts @@ -53,7 +53,14 @@ export type InitialState = { extra_json?: object; }; databases: object[]; - queries: Record; + queries: Record< + string, + Omit & { + startDttm: number | string; + endDttm: number | string; + inLocalStorage?: boolean; + } + >; tab_state_ids: { id: number; label: string;