UNPKG

@jakub.knejzlik/ts-query

Version:

TypeScript implementation of SQL builder

60 lines (59 loc) 2.31 kB
"use strict"; 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;