From 85fd14fa02bb2879c36bba53369dbf2e7fa578d4 Mon Sep 17 00:00:00 2001 From: Jonathan Fishner Date: Mon, 10 Feb 2025 10:54:22 +0200 Subject: [PATCH] fix(export-sql): show create script for only filtered schemas (#570) * fix(export-sql): show create script for only filtered schemas * add dependencies filter --------- Co-authored-by: Guy Ben-Aharon --- .../export-sql-dialog/export-sql-dialog.tsx | 51 +++++++++++++++++-- 1 file changed, 47 insertions(+), 4 deletions(-) diff --git a/src/dialogs/export-sql-dialog/export-sql-dialog.tsx b/src/dialogs/export-sql-dialog/export-sql-dialog.tsx index 436a2a7c..d93ac6bb 100644 --- a/src/dialogs/export-sql-dialog/export-sql-dialog.tsx +++ b/src/dialogs/export-sql-dialog/export-sql-dialog.tsx @@ -20,10 +20,12 @@ import { } from '@/lib/data/export-metadata/export-sql-script'; import { databaseTypeToLabelMap } from '@/lib/databases'; import { DatabaseType } from '@/lib/domain/database-type'; +import { shouldShowTablesBySchemaFilter } from '@/lib/domain/db-table'; import { Annoyed, Sparkles } from 'lucide-react'; import React, { useCallback, useEffect, useRef } from 'react'; import { Trans, useTranslation } from 'react-i18next'; import type { BaseDialogProps } from '../common/base-dialog-props'; +import type { Diagram } from '@/lib/domain/diagram'; export interface ExportSQLDialogProps extends BaseDialogProps { targetDatabaseType: DatabaseType; @@ -34,7 +36,7 @@ export const ExportSQLDialog: React.FC = ({ targetDatabaseType, }) => { const { closeExportSQLDialog } = useDialog(); - const { currentDiagram } = useChartDB(); + const { currentDiagram, filteredSchemas } = useChartDB(); const { t } = useTranslation(); const [script, setScript] = React.useState(); const [error, setError] = React.useState(false); @@ -43,17 +45,58 @@ export const ExportSQLDialog: React.FC = ({ const abortControllerRef = useRef(null); const exportSQLScript = useCallback(async () => { + const filteredDiagram: Diagram = { + ...currentDiagram, + tables: currentDiagram.tables?.filter((table) => + shouldShowTablesBySchemaFilter(table, filteredSchemas) + ), + relationships: currentDiagram.relationships?.filter((rel) => { + const sourceTable = currentDiagram.tables?.find( + (t) => t.id === rel.sourceTableId + ); + const targetTable = currentDiagram.tables?.find( + (t) => t.id === rel.targetTableId + ); + return ( + sourceTable && + targetTable && + shouldShowTablesBySchemaFilter( + sourceTable, + filteredSchemas + ) && + shouldShowTablesBySchemaFilter(targetTable, filteredSchemas) + ); + }), + dependencies: currentDiagram.dependencies?.filter((dep) => { + const table = currentDiagram.tables?.find( + (t) => t.id === dep.tableId + ); + const dependentTable = currentDiagram.tables?.find( + (t) => t.id === dep.dependentTableId + ); + return ( + table && + dependentTable && + shouldShowTablesBySchemaFilter(table, filteredSchemas) && + shouldShowTablesBySchemaFilter( + dependentTable, + filteredSchemas + ) + ); + }), + }; + if (targetDatabaseType === DatabaseType.GENERIC) { - return Promise.resolve(exportBaseSQL(currentDiagram)); + return Promise.resolve(exportBaseSQL(filteredDiagram)); } else { - return exportSQL(currentDiagram, targetDatabaseType, { + return exportSQL(filteredDiagram, targetDatabaseType, { stream: true, onResultStream: (text) => setScript((prev) => (prev ? prev + text : text)), signal: abortControllerRef.current?.signal, }); } - }, [targetDatabaseType, currentDiagram]); + }, [targetDatabaseType, currentDiagram, filteredSchemas]); useEffect(() => { if (!dialog.open) {