UNPKG

ddl-manager

Version:

store postgres procedures and triggers in files

99 lines (80 loc) 2.72 kB
import { uniq } from "lodash"; import { Cache, ColumnReference } from "../../ast"; import { TableReference } from "../../database/schema/TableReference"; export interface IDependencies { [table: string]: ITableDependencies; } export interface ITableDependencies { columns: string[]; } // TODO: split to two functions and fix tests export function findDependencies(cache: Cache, addCacheRefDeps = true) { const dependencies: IDependencies = { [cache.for.table.toString()]: {columns: []} }; for (const tableRef of cache.select.getAllTableReferences()) { dependencies[ tableRef.table.toString() ] = {columns: []}; } for (const columnRef of cache.select.getAllColumnReferences()) { if ( !addCacheRefDeps && columnRef.tableReference.equal(cache.for) ) { continue; } addColumnReference(dependencies, columnRef); } return dependencies; } export function findDependenciesToCacheTable(cache: Cache): ITableDependencies { const tableDependencies: ITableDependencies = {columns: []}; for (const columnRef of cache.select.getAllColumnReferences()) { if ( !columnRef.tableReference.equal(cache.for) ) { continue; } if ( !tableDependencies.columns.includes(columnRef.name) ) { tableDependencies.columns.push(columnRef.name); tableDependencies.columns.sort(); } } return tableDependencies; } export function findDependenciesTo( cache: Cache, table: TableReference, additionalColumns: string[] = [] ): string[] { const columns: string[] = []; for (const columnRef of cache.select.getAllColumnReferences()) { if ( !columnRef.tableReference.equal(table) ) { continue; } if ( !columns.includes(columnRef.name) ) { columns.push(columnRef.name); } } columns.push(...additionalColumns); return uniq(columns).sort(); } function addColumnReference( dependencies: IDependencies, columnRef: ColumnReference ) { const tableDependencies = getOrCreateTableDependencies( dependencies, columnRef ); if ( !tableDependencies.columns.includes(columnRef.name) ) { tableDependencies.columns.push(columnRef.name); tableDependencies.columns.sort(); } } function getOrCreateTableDependencies( dependencies: IDependencies, columnRef: ColumnReference ) { const table = columnRef.tableReference.table.toString(); const tableDependencies = dependencies[ table ]; if ( tableDependencies ) { return tableDependencies; } dependencies[ table ] = {columns: []}; return dependencies[ table ]; }