diff --git a/packages/tools/src/chooseTopTables.ts b/packages/tools/src/chooseTopTables.ts new file mode 100644 index 000000000..cedcd8e41 --- /dev/null +++ b/packages/tools/src/chooseTopTables.ts @@ -0,0 +1,41 @@ +import { DatabaseInfo, TableInfo } from 'dbgate-types'; +import { extendDatabaseInfo } from './structureTools'; +import _sortBy from 'lodash/sortBy'; + +function tableWeight(table: TableInfo, maxRowcount?: number) { + let weight = 0; + if (table.primaryKey) weight += 1; + if (table.foreignKeys) weight += table.foreignKeys.length * 1; + if (maxRowcount && table.tableRowCount) { + const rowcount = parseInt(table.tableRowCount as string); + if (rowcount > 0) + weight += + Math.log(rowcount) * table.columns.length * (table.dependencies.length || 1) * (table.dependencies.length || 1); + } else { + if (table.columns) weight += table.columns.length * 2; + } + if (table.dependencies) weight += table.dependencies.length * 10; + if (maxRowcount) return weight; +} + +export function chooseTopTables(tables: TableInfo[], count: number) { + const dbinfo: DatabaseInfo = { + tables, + } as DatabaseInfo; + + const extended = extendDatabaseInfo(dbinfo); + + const maxRowcount = Math.max( + ...extended.tables + .map(x => x.tableRowCount || 0) + .map(x => parseInt(x as string)) + .filter(x => x > 0) + ); + + const sorted = _sortBy( + _sortBy(extended.tables, x => `${x.schemaName}.${x.pureName}`), + table => -tableWeight(table, maxRowcount) + ); + + return sorted.slice(0, count); +} diff --git a/packages/tools/src/index.ts b/packages/tools/src/index.ts index 48c137d11..35c01ef73 100644 --- a/packages/tools/src/index.ts +++ b/packages/tools/src/index.ts @@ -25,4 +25,5 @@ export * from './detectSqlFilterBehaviour'; export * from './filterBehaviours'; export * from './schemaInfoTools'; export * from './dbKeysLoader'; -export * from './rowProgressReporter'; \ No newline at end of file +export * from './rowProgressReporter'; +export * from './chooseTopTables'; diff --git a/packages/web/src/designer/Designer.svelte b/packages/web/src/designer/Designer.svelte index e1593f90a..3792681f5 100644 --- a/packages/web/src/designer/Designer.svelte +++ b/packages/web/src/designer/Designer.svelte @@ -47,10 +47,11 @@ import { showModal } from '../modals/modalTools'; import ChooseColorModal from '../modals/ChooseColorModal.svelte'; import { currentThemeDefinition } from '../stores'; - import { extendDatabaseInfoFromApps } from 'dbgate-tools'; + import { chooseTopTables, extendDatabaseInfoFromApps } from 'dbgate-tools'; import SearchInput from '../elements/SearchInput.svelte'; import CloseSearchButton from '../buttons/CloseSearchButton.svelte'; import DragColumnMemory from './DragColumnMemory.svelte'; + import createRef from '../utility/createRef'; export let value; export let onChange; @@ -76,14 +77,19 @@ const dbInfo = settings?.updateFromDbInfo ? useDatabaseInfo({ conid, database }) : null; $: dbInfoExtended = $dbInfo ? extendDatabaseInfoFromApps($dbInfo, $apps) : null; - $: tables = value?.tables as any[]; - $: references = value?.references as any[]; + $: tables = + (value?.style?.topTables > 0 && value?.tables + ? chooseTopTables(value?.tables, value?.style?.topTables) + : value?.tables) || ([] as any[]); + $: references = (value?.references || [])?.filter( + ref => tables.find(x => x.designerId == ref.sourceId) && tables.find(x => x.designerId == ref.targetId) + ) as any[]; $: zoomKoef = settings?.customizeStyle && value?.style?.zoomKoef ? value?.style?.zoomKoef : 1; $: apps = useUsedApps(); $: isMultipleTableSelection = tables.filter(x => x.isSelectedTable).length >= 2; - const tableRefs = {}; + let tableRefs = {}; const referenceRefs = {}; let domTables; $: { @@ -663,7 +669,7 @@ export function arrange(skipUndoChain = false, arrangeAll = true, circleMiddle = { x: 0, y: 0 }) { const graph = new GraphDefinition(); - for (const table of value?.tables || []) { + for (const table of tables || []) { const domTable = domTables[table.designerId] as any; if (!domTable) continue; const rect = domTable.getRect(); @@ -676,8 +682,8 @@ } for (const reference of settings?.sortAutoLayoutReferences - ? settings?.sortAutoLayoutReferences(value?.references) - : value?.references) { + ? settings?.sortAutoLayoutReferences(references) + : references) { graph.addEdge(reference.sourceId, reference.targetId); } @@ -877,6 +883,20 @@ recomputeDomTables(); }); } + + const oldTopTablesRef = createRef(value?.style?.topTables); + $: { + if (value?.style?.topTables > 0 && oldTopTablesRef.get() != value?.style?.topTables) { + oldTopTablesRef.set(value?.style?.topTables); + tick().then(() => { + arrange(); + tick().then(() => { + recomputeReferencePositions(); + recomputeDomTables(); + }); + }); + } + }
diff --git a/packages/web/src/designer/DiagramSettings.svelte b/packages/web/src/designer/DiagramSettings.svelte index eb3772a20..6dc9ace31 100644 --- a/packages/web/src/designer/DiagramSettings.svelte +++ b/packages/web/src/designer/DiagramSettings.svelte @@ -5,6 +5,7 @@ import FormProviderCore from '../forms/FormProviderCore.svelte'; import FormSelectField from '../forms/FormSelectField.svelte'; import FormTextField from '../forms/FormTextField.svelte'; + import { isProApp } from '../utility/proTools'; export let values; @@ -102,4 +103,8 @@ + + {#if isProApp()} + + {/if}