From 8a5dff8491a13874c3789f9e04f8b1068dd2bbc6 Mon Sep 17 00:00:00 2001 From: jqqin <63757369+jqqin@users.noreply.github.com> Date: Mon, 9 Jun 2025 12:42:55 -0400 Subject: [PATCH] fix(dataset): prevent metric duplication error when editing SQL and adding metric (#33523) Co-authored-by: QinQin (cherry picked from commit 2fba789e8d9f3f9009233606fa4223d88ca7aff6) --- .../Datasource/DatasourceModal.test.jsx | 4 +- .../components/Datasource/DatasourceModal.tsx | 42 ++----------------- 2 files changed, 6 insertions(+), 40 deletions(-) diff --git a/superset-frontend/src/components/Datasource/DatasourceModal.test.jsx b/superset-frontend/src/components/Datasource/DatasourceModal.test.jsx index 132cb545847..ce0804b4c53 100644 --- a/superset-frontend/src/components/Datasource/DatasourceModal.test.jsx +++ b/superset-frontend/src/components/Datasource/DatasourceModal.test.jsx @@ -39,8 +39,8 @@ import mockDatasource from 'spec/fixtures/mockDatasource'; // Define your constants here const SAVE_ENDPOINT = 'glob:*/api/v1/dataset/7'; const SAVE_PAYLOAD = { new: 'data' }; -const SAVE_DATASOURCE_ENDPOINT = 'glob:*/api/v1/dataset/7'; -const GET_DATASOURCE_ENDPOINT = SAVE_DATASOURCE_ENDPOINT; +const SAVE_DATASOURCE_ENDPOINT = 'glob:*/api/v1/dataset/7?override_columns=*'; +const GET_DATASOURCE_ENDPOINT = 'glob:*/api/v1/dataset/7'; const GET_DATABASE_ENDPOINT = 'glob:*/api/v1/database/?q=*'; const mockedProps = { diff --git a/superset-frontend/src/components/Datasource/DatasourceModal.tsx b/superset-frontend/src/components/Datasource/DatasourceModal.tsx index 33cd820677e..bdccc6fd44c 100644 --- a/superset-frontend/src/components/Datasource/DatasourceModal.tsx +++ b/superset-frontend/src/components/Datasource/DatasourceModal.tsx @@ -17,7 +17,7 @@ * under the License. */ import { FunctionComponent, useState, useRef } from 'react'; -import { useDispatch, useSelector } from 'react-redux'; +import { useSelector } from 'react-redux'; import Alert from 'src/components/Alert'; import Button from 'src/components/Button'; import { @@ -33,15 +33,6 @@ import Modal from 'src/components/Modal'; import AsyncEsmComponent from 'src/components/AsyncEsmComponent'; import ErrorMessageWithStackTrace from 'src/components/ErrorMessage/ErrorMessageWithStackTrace'; import withToasts from 'src/components/MessageToasts/withToasts'; -import { - startMetaDataLoading, - stopMetaDataLoading, - syncDatasourceMetadata, -} from 'src/explore/actions/exploreActions'; -import { - fetchSyncedColumns, - updateColumns, -} from 'src/components/Datasource/utils'; import { DatasetObject } from '../../features/datasets/types'; const DatasourceEditor = AsyncEsmComponent(() => import('./DatasourceEditor')); @@ -95,13 +86,11 @@ function buildExtraJsonObject( const DatasourceModal: FunctionComponent = ({ addSuccessToast, - addDangerToast, datasource, onDatasourceSave, onHide, show, }) => { - const dispatch = useDispatch(); const [currentDatasource, setCurrentDatasource] = useState(datasource); const currencies = useSelector< { @@ -184,36 +173,13 @@ const DatasourceModal: FunctionComponent = ({ const onConfirmSave = async () => { // Pull out extra fields into the extra object setIsSaving(true); + const overrideColumns = datasource.sql !== currentDatasource.sql; try { await SupersetClient.put({ - endpoint: `/api/v1/dataset/${currentDatasource.id}`, + endpoint: `/api/v1/dataset/${currentDatasource.id}?override_columns=${overrideColumns}`, jsonPayload: buildPayload(currentDatasource), }); - if (datasource.sql !== currentDatasource.sql) { - // if sql has changed, save a second time with synced columns - dispatch(startMetaDataLoading()); - try { - const columnJson = await fetchSyncedColumns(currentDatasource); - const columnChanges = updateColumns( - currentDatasource.columns, - columnJson, - addSuccessToast, - ); - currentDatasource.columns = columnChanges.finalColumns; - dispatch(syncDatasourceMetadata(currentDatasource)); - dispatch(stopMetaDataLoading()); - addSuccessToast(t('Metadata has been synced')); - } catch (error) { - dispatch(stopMetaDataLoading()); - addDangerToast( - t('An error has occurred while syncing virtual dataset columns'), - ); - } - await SupersetClient.put({ - endpoint: `/api/v1/dataset/${currentDatasource.id}`, - jsonPayload: buildPayload(currentDatasource), - }); - } + const { json } = await SupersetClient.get({ endpoint: `/api/v1/dataset/${currentDatasource?.id}`, });