UNPKG

ddl-manager

Version:

store postgres procedures and triggers in files

76 lines 3.11 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.buildReferenceMeta = void 0; function buildReferenceMeta(cache, triggerTable, excludeRef = cache.for) { const referenceMeta = { columns: [], filters: [], expressions: [], unknownExpressions: [], cacheTableFilters: [] }; const where = cache.select.where; if (!where) { return referenceMeta; } for (let andCondition of where.splitBy("and")) { andCondition = andCondition.extrude(); const conditionColumns = andCondition.getColumnReferences(); const columnsFromCacheTable = conditionColumns.filter(columnRef => columnRef.tableReference.equal(cache.for)); const columnsFromTriggerTable = conditionColumns.filter(columnRef => columnRef.isRefTo(cache, triggerTable, excludeRef)); const fromTriggerTable = cache.select.from.find(from => from.source.toString() === triggerTable.toString()); const leftJoinsOverTriggerTable = (fromTriggerTable || { joins: [] }).joins .filter(join => join.on.getColumnReferences() .some(columnRef => columnRef.tableReference.table.equal(triggerTable))); const columnsFromTriggerTableOverLeftJoin = conditionColumns.filter(columnRef => leftJoinsOverTriggerTable.some(join => join.getTable().equal(columnRef.tableReference.table))); if (columnsFromCacheTable.length === conditionColumns.length) { referenceMeta.cacheTableFilters.push(andCondition); } const isReference = (columnsFromCacheTable.length && columnsFromTriggerTable.length); if (isReference) { if (isUnknownExpression(andCondition)) { referenceMeta.unknownExpressions.push(andCondition); } else { referenceMeta.expressions.push(andCondition); } referenceMeta.columns.push(...columnsFromTriggerTable.map(columnRef => columnRef.name)); } else if (columnsFromTriggerTableOverLeftJoin.length || columnsFromTriggerTable.length) { referenceMeta.filters.push(andCondition); } } return referenceMeta; } exports.buildReferenceMeta = buildReferenceMeta; function isUnknownExpression(expression) { expression = expression.extrude(); if (expression.isBinary("=")) { return false; } if (expression.isBinary("&&")) { return false; } if (expression.isBinary("@>")) { return false; } if (expression.isBinary("<@")) { return false; } if (expression.isIn()) { return false; } const orConditions = expression.splitBy("or"); if (orConditions.length > 1) { return orConditions.some(subExpression => isUnknownExpression(subExpression)); } const andConditions = expression.splitBy("and"); if (andConditions.length > 1) { return andConditions.some(subExpression => isUnknownExpression(subExpression)); } return true; } //# sourceMappingURL=buildReferenceMeta.js.map