autosql
Version:
An auto-parser of JSON into SQL.
108 lines (107 loc) • 4.25 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.PostgresIndexQueryBuilder = void 0;
const utilities_1 = require("../../../helpers/utilities");
class PostgresIndexQueryBuilder {
static getPrimaryKeysQuery(table, schema) {
const schemaPrefix = schema ? `"${schema}".` : "";
return {
query: `
SELECT a.attname AS column_name
FROM pg_index i
JOIN pg_attribute a ON a.attrelid = i.indrelid AND a.attnum = ANY(i.indkey)
WHERE i.indrelid = '${schemaPrefix}${table}'::regclass
AND i.indisprimary;
`,
params: []
};
}
static getForeignKeyConstraintsQuery(table, schema) {
const schemaPrefix = schema ? `"${schema}".` : "";
return {
query: `
SELECT conname AS constraint_name, conrelid::regclass AS table_name
FROM pg_constraint
WHERE confrelid = '${schemaPrefix}${table}'::regclass;
`,
params: []
};
}
static getViewDependenciesQuery(table, schema) {
const schemaPrefix = schema ? `"${schema}".` : "";
return {
query: `
SELECT viewname
FROM pg_views
WHERE schemaname = '${schema}'
AND definition LIKE '%' || $1 || '%';
`,
params: [table]
};
}
static getDropPrimaryKeyQuery(table, schema) {
const schemaPrefix = schema ? `"${schema}".` : "";
return {
query: `ALTER TABLE ${schemaPrefix}"${table}" DROP CONSTRAINT "${table}_pkey";`,
params: []
};
}
static getDropUniqueConstraintQuery(table, indexName, schema) {
const schemaPrefix = schema ? `"${schema}".` : "";
return {
query: `ALTER TABLE ${schemaPrefix}"${table}" DROP CONSTRAINT "${indexName}";`,
params: []
};
}
static getAddPrimaryKeyQuery(table, primaryKeys, schema) {
const schemaPrefix = schema ? `"${schema}".` : "";
return {
query: `ALTER TABLE ${schemaPrefix}"${table}" ADD PRIMARY KEY (${primaryKeys.map(pk => `"${pk}"`).join(", ")});`,
params: []
};
}
static getUniqueIndexesQuery(table, columnName, schema) {
const schemaPrefix = schema ? `"${schema}".` : "";
let query = `
SELECT i.relname AS index_name, array_to_string(array_agg(a.attname), ', ') AS columns
FROM pg_index ix
JOIN pg_class i ON i.oid = ix.indexrelid
JOIN pg_class t ON t.oid = ix.indrelid
JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY(ix.indkey)
WHERE t.relname = $1
AND ix.indisunique = true
`;
const params = [table];
if (columnName) {
query += " AND a.attname = $2";
params.push(columnName);
}
query += " GROUP BY i.relname;";
return { query, params };
}
static generateConstraintConflictBreakdownQuery(table, structure, schema) {
const schemaPrefix = schema ? `"${schema}".` : "";
const tempTable = (0, utilities_1.getTempTableName)(table);
const t1 = "t1";
const t2 = "t2";
const conflictColumns = Object.entries(structure.uniques).map(([index_name, cols]) => {
const condition = cols.map(col => `${t1}."${col}" = ${t2}."${col}"`).join(" AND ");
const alias = index_name;
return ` SUM(CASE WHEN ${condition} THEN 1 ELSE 0 END) AS "${alias}"`;
});
const primaryMismatch = structure.primary.length
? structure.primary.map(col => `${t1}."${col}" IS DISTINCT FROM ${t2}."${col}"`).join(" OR ")
: "FALSE";
const query = `SELECT
${conflictColumns.join(",\n")}
FROM ${schemaPrefix}"${table}" ${t1}
JOIN ${schemaPrefix}"${tempTable}" ${t2}
ON (${primaryMismatch});
`.trim();
return {
query,
params: []
};
}
}
exports.PostgresIndexQueryBuilder = PostgresIndexQueryBuilder;