@jakub.knejzlik/ts-query
Version:
TypeScript implementation of SQL builder
60 lines (59 loc) • 2.31 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.PostgresFlavor = void 0;
const Expression_1 = require("../Expression");
const default_1 = require("./default");
class PostgresFlavor extends default_1.DefaultFlavor {
constructor() {
super(...arguments);
this.columnQuotes = '"';
this.stringQuotes = "'";
}
escapeFunction(fn) {
const args = fn.value.map((arg) => Expression_1.ExpressionBase.deserialize(arg).toSQL(this));
if (fn.name === "DATEADD") {
const argsValues = fn.value.map((x) => Expression_1.ExpressionBase.deserializeValue(x));
const interval = parseInt(argsValues[1].value.toString(), 10);
if (isNaN(interval)) {
throw new Error(`Invalid DATEADD interval: ${argsValues[1].value}`);
}
const intervalType = argsValues[2].value.toString().toLowerCase();
const validIntervalTypes = [
"year",
"month",
"day",
"hour",
"minute",
"second",
"week",
];
if (!validIntervalTypes.includes(intervalType)) {
throw new Error(`Invalid DATEADD interval type: ${intervalType}`);
}
return `(${args[0]} + INTERVAL '${interval} ${intervalType}')`;
}
if (fn.name === "YEAR") {
return `EXTRACT(YEAR FROM ${args.join(", ")})`;
}
if (fn.name === "MONTH") {
return `EXTRACT(MONTH FROM ${args.join(", ")})`;
}
if (fn.name === "IF") {
const [condition, thenValue, elseValue] = args;
return `CASE WHEN ${condition} THEN ${thenValue} ELSE ${elseValue} END`;
}
if (fn.name === "IFNULL") {
return `COALESCE(${args.join(",")})`;
}
return super.escapeFunction(fn);
}
escapeLikeCondition(column, pattern, isLike, caseInsensitive) {
const notPrefix = isLike ? "" : "NOT ";
if (caseInsensitive) {
// PostgreSQL: use native ILIKE
return `${column} ${notPrefix}ILIKE ${pattern}`;
}
return `${column} ${notPrefix}LIKE ${pattern}`;
}
}
exports.PostgresFlavor = PostgresFlavor;