diff --git a/packages/datalib/src/PerspectiveTreeNode.ts b/packages/datalib/src/PerspectiveTreeNode.ts index 3e300ad6d..94aa1e16a 100644 --- a/packages/datalib/src/PerspectiveTreeNode.ts +++ b/packages/datalib/src/PerspectiveTreeNode.ts @@ -164,6 +164,9 @@ export abstract class PerspectiveTreeNode { get db(): DatabaseInfo { return this.dbs?.[this.databaseConfig.conid]?.[this.databaseConfig.database]; } + get isCircular() { + return false; + } hasDesignerIdInIncestors(designerId: string): boolean { if (designerId == this.designerId) return true; @@ -349,7 +352,14 @@ export abstract class PerspectiveTreeNode { // } findNodeByDesignerId(designerId: string): PerspectiveTreeNode { - if (!designerId) return null; + console.log('findNodeByDesignerId', designerId, this.level, this.designerId); + + if (!this.designerId) { + return null; + } + if (!designerId) { + return null; + } if (designerId == this.designerId) { return this; } diff --git a/packages/datalib/src/processPerspectiveDefaultColunns.ts b/packages/datalib/src/processPerspectiveDefaultColunns.ts index 02388a130..a65451769 100644 --- a/packages/datalib/src/processPerspectiveDefaultColunns.ts +++ b/packages/datalib/src/processPerspectiveDefaultColunns.ts @@ -1,12 +1,13 @@ import { findForeignKeyForColumn } from 'dbgate-tools'; import { DatabaseInfo, TableInfo, ViewInfo } from 'dbgate-types'; -import { MultipleDatabaseInfo, PerspectiveConfig } from './PerspectiveConfig'; +import { createPerspectiveNodeConfig, MultipleDatabaseInfo, PerspectiveConfig } from './PerspectiveConfig'; +import { PerspectiveTableNode } from './PerspectiveTreeNode'; function getPerspectiveDefaultColumns( table: TableInfo | ViewInfo, db: DatabaseInfo, circularColumns: string[] -): string[] { +): [string[], string[]] { const columns = table.columns.map(x => x.columnName); const predicates = [ x => x.toLowerCase() == 'name', @@ -21,16 +22,24 @@ function getPerspectiveDefaultColumns( .find(y => y.columnName == x) ?.dataType?.toLowerCase() ?.includes('char'), - x => findForeignKeyForColumn(table as TableInfo, x)?.columns?.length == 1 && !circularColumns.includes(x), - x => findForeignKeyForColumn(table as TableInfo, x)?.columns?.length == 1, ]; for (const predicate of predicates) { const col = columns.find(predicate); - if (col) return [col]; + if (col) return [[col], null]; } - return [columns[0]]; + const keyPredicates = [ + x => findForeignKeyForColumn(table as TableInfo, x)?.columns?.length == 1 && !circularColumns.includes(x), + x => findForeignKeyForColumn(table as TableInfo, x)?.columns?.length == 1, + ]; + + for (const predicate of keyPredicates) { + const col = columns.find(predicate); + if (col) return [null, [col]]; + } + + return [[columns[0]], null]; } export function processPerspectiveDefaultColunns( @@ -39,31 +48,94 @@ export function processPerspectiveDefaultColunns( conid: string, database: string ) { + console.log('processPerspectiveDefaultColunns'); + const rootNode = config.nodes.find(x => x.designerId == config.rootDesignerId); + if (!rootNode) return null; + const rootDb = dbInfos?.[rootNode.conid || conid]?.[rootNode.database || database]; + if (!rootDb) return null; + const rootTable = rootDb.tables.find(x => x.pureName == rootNode.pureName && x.schemaName == rootNode.schemaName); + const rootView = rootDb.views.find(x => x.pureName == rootNode.pureName && x.schemaName == rootNode.schemaName); + + console.log('CREATE ROOT'); + + const root = new PerspectiveTableNode( + rootTable || rootView, + dbInfos, + config, + null, + null, + { conid, database }, + null, + config.rootDesignerId + ); + + console.log('ROOT', root); + for (const node of config.nodes) { if (node.defaultColumnsProcessed) continue; - const db = dbInfos?.[conid]?.[database]; + const db = dbInfos?.[node.conid || conid]?.[node.database || database]; if (!db) continue; const table = db.tables.find(x => x.pureName == node.pureName && x.schemaName == node.schemaName); const view = db.views.find(x => x.pureName == node.pureName && x.schemaName == node.schemaName); if (table || view) { - const defaultColumns = getPerspectiveDefaultColumns(table || view, db, []); - const newConfig = { - ...config, - nodes: config.nodes.map(n => - n.designerId == node.designerId - ? { - ...n, - defaultColumnsProcessed: true, - checkedColumns: defaultColumns, - } - : n - ), - }; + console.log('FINDING', node.pureName); + const treeNode = root.findNodeByDesignerId(node.designerId); + if (!treeNode) continue; + const circularColumns = treeNode.childNodes.filter(x => x.isCircular).map(x => x.columnName); + const [defaultColumns, defaultRefs] = getPerspectiveDefaultColumns(table || view, db, circularColumns); - return newConfig; + if (defaultRefs) { + const childNode = treeNode.childNodes.find(x => x.columnName == defaultRefs[0]); + if (childNode?.designerId) { + return { + ...config, + nodes: config.nodes.map(n => + n.designerId == childNode.designerId + ? { + ...n, + isNodeChecked: true, + } + : n.designerId == node.designerId + ? { + ...n, + defaultColumnsProcessed: true, + } + : n + ), + }; + } else if (childNode) { + const [newConfig, nodeConfig] = childNode.ensureNodeConfig(config); + nodeConfig.isNodeChecked = true; + + return { + ...newConfig, + nodes: newConfig.nodes.map(n => + n.designerId == node.designerId + ? { + ...n, + defaultColumnsProcessed: true, + } + : n + ), + }; + } + } else { + return { + ...config, + nodes: config.nodes.map(n => + n.designerId == node.designerId + ? { + ...n, + defaultColumnsProcessed: true, + checkedColumns: defaultColumns, + } + : n + ), + }; + } } } diff --git a/packages/web/src/perspectives/PerspectiveDesigner.svelte b/packages/web/src/perspectives/PerspectiveDesigner.svelte index 79c6078b4..db52071a9 100644 --- a/packages/web/src/perspectives/PerspectiveDesigner.svelte +++ b/packages/web/src/perspectives/PerspectiveDesigner.svelte @@ -94,6 +94,7 @@ async function detectAutoArrange(config: PerspectiveConfig, dbInfos) { if (config.nodes.find(x => !x.position)) { await tick(); + console.log('ARRANGE', config.nodes.length); runCommand('designer.arrange'); } } diff --git a/packages/web/src/perspectives/PerspectiveView.svelte b/packages/web/src/perspectives/PerspectiveView.svelte index 89a469cf5..cdf143c85 100644 --- a/packages/web/src/perspectives/PerspectiveView.svelte +++ b/packages/web/src/perspectives/PerspectiveView.svelte @@ -150,10 +150,20 @@ : null; $: { - const newConfig = processPerspectiveDefaultColunns(config, $dbInfos, conid, database); - if (newConfig) { - setConfig(() => newConfig); - } + tick().then(() => { + const newConfig = processPerspectiveDefaultColunns(config, $dbInfos, conid, database); + if (newConfig) { + if ( + newConfig.nodes.filter(x => x.defaultColumnsProcessed).length > + config.nodes.filter(x => x.defaultColumnsProcessed).length + ) { + console.log('CONFIG CHANGED'); + setConfig(() => newConfig); + } else { + console.warn('No new default columns', newConfig); + } + } + }); }