UNPKG

ddl-manager

Version:

store postgres procedures and triggers in files

65 lines (50 loc) 2.01 kB
import { Cache, Expression } from "../../ast"; export function buildConditionsMatrix(cache: Cache) { // top level is "or" // second level is "and" let conditionsMatrix: Expression[][] = []; if ( cache.select.where ) { const orConditions = cache.select.where.splitBy("or"); for (const orCondition of orConditions) { const andConditions = orCondition.splitBy("and"); conditionsMatrix.push(andConditions); } } const onConditionsByTable: { [tableName: string]: Expression[][] } = {}; for (const rootFromItem of cache.select.from) { for (const join of rootFromItem.joins) { const tableName = join.getTableId().toString(); const joinOrConditions = join.on.splitBy("or"); const tableConditionsMatrix = onConditionsByTable[ tableName ] || []; for (const joinCondition of joinOrConditions) { const joinAndConditions = joinCondition.splitBy("and"); tableConditionsMatrix.push( joinAndConditions ); } onConditionsByTable[ tableName ] = tableConditionsMatrix; } } for (const tableName in onConditionsByTable) { const originalTableMatrix = conditionsMatrix.map(line => line.slice()); conditionsMatrix = []; const tableConditionsMatrix = onConditionsByTable[ tableName ]; for (const andConditions of tableConditionsMatrix) { const newMatrix = originalTableMatrix.map(conditions => [...conditions, ...andConditions] ); conditionsMatrix.push(...newMatrix); } } // remove: AND true const outputMatrix = conditionsMatrix .map(andConditions => andConditions.filter(condition => condition.toString() !== "true" ) ) .filter(andConditions => andConditions.length > 0 ); return outputMatrix; }