Files
dbgate/packages/tools/src/diagramTools.ts
2025-10-08 11:19:15 +02:00

64 lines
2.1 KiB
TypeScript

import { DatabaseInfo, TableInfo } from 'dbgate-types';
import { extendDatabaseInfo } from './structureTools';
import _sortBy from 'lodash/sortBy';
import _uniq from 'lodash/uniq';
import { filterName } from './filterName';
function tableWeight(table: TableInfo, maxRowcount?: number) {
let weight = 0;
const tableDependenciesCount = _uniq(table.dependencies?.map(x => x.pureName) || []).length;
const tableFkCount = _uniq(table.foreignKeys?.map(x => x.refTableName) || []).length;
if (table.primaryKey) weight += 1;
if (tableFkCount) weight += tableFkCount * 1;
if (maxRowcount && table.tableRowCount) {
const rowcount = parseInt(table.tableRowCount as string);
if (rowcount > 0)
weight += Math.log(rowcount) * table.columns.length * (tableFkCount || 1) * (tableDependenciesCount || 1);
} else {
if (table.columns) weight += table.columns.length * 2;
}
if (table.dependencies) weight += tableDependenciesCount * 10;
if (maxRowcount) return weight;
}
export function chooseTopTables(tables: TableInfo[], count: number, tableFilter: string, omitTablesFilter: string) {
const filteredTables = tables.filter(table => {
if (tableFilter) {
if (!filterName(tableFilter, table?.pureName)) return false;
}
if (omitTablesFilter) {
if (filterName(omitTablesFilter, table?.pureName)) return false;
}
return true;
});
if (!(count > 0)) {
return filteredTables;
}
const dbinfo: DatabaseInfo = {
tables: filteredTables,
} 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);
}
export const DIAGRAM_ZOOMS = [0.1, 0.15, 0.2, 0.3, 0.4, 0.5, 0.6, 0.8, 1, 1.25, 1.5, 1.75, 2];
export const DIAGRAM_DEFAULT_WATERMARK = 'Powered by [dbgate.io](https://www.dbgate.io)';