ddl-manager
Version:
store postgres procedures and triggers in files
48 lines (36 loc) • 1.62 kB
text/typescript
import { findMinimalRoute } from "./findMinimalRoute";
import { Expression } from "../../ast";
import { CacheContext } from "../trigger-builder/CacheContext";
import { buildConditionsMatrix } from "./buildConditionsMatrix";
export function findNecessaryTableMatrix(context: CacheContext) {
const conditionsMatrix: Expression[][] = buildConditionsMatrix(context.cache);
const linksToChangedTable = context.getTableReferencesToTriggerTable();
const necessaryTableMatrix: string[][] = [];
for (const andConditions of conditionsMatrix) {
const necessaryTableAliases: string[] = [];
const graph = andConditions.map(condition => {
const points: string[] = condition.getColumnReferences()
.map(columnRef => columnRef.tableReference.getIdentifier());
return points;
});
for (const changedTableInSelect of linksToChangedTable) {
const minimalRoute = findMinimalRoute({
graph,
start: changedTableInSelect.getIdentifier(),
end: context.cache.for.getIdentifier()
});
if ( !minimalRoute ) {
continue;
}
const middlePoints = minimalRoute.slice(1, -1);
for (const middlePoint of middlePoints) {
if ( necessaryTableAliases.includes(middlePoint) ) {
continue;
}
necessaryTableAliases.push(middlePoint);
}
}
necessaryTableMatrix.push(necessaryTableAliases);
}
return necessaryTableMatrix;
}