UNPKG

@jakub.knejzlik/ts-query

Version:

TypeScript implementation of SQL builder

92 lines (91 loc) 4.15 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Fn = exports.Function = void 0; const dayjs_1 = __importDefault(require("dayjs")); const Condition_1 = require("./Condition"); const Expression_1 = require("./Expression"); const Query_1 = require("./Query"); const formatDayjs = (d) => (0, dayjs_1.default)(d).format("YYYY-MM-DD HH:mm:ss"); const ifFn = (condition, trueValue, falseValue) => { return new Expression_1.FunctionExpression("IF", condition, trueValue, falseValue); }; const dateAddFn = (date, value, interval) => { return new Expression_1.FunctionExpression("DATEADD", date, Query_1.Q.value(value), Query_1.Q.value(interval)); }; exports.Function = { count: (column) => { return new Expression_1.FunctionExpression("COUNT", column); }, add: (...columns) => { return new Expression_1.OperationExpression("+", ...columns); }, subtract: (...columns) => { return new Expression_1.OperationExpression("-", ...columns); }, divide: (...columns) => { return new Expression_1.OperationExpression("/", ...columns); }, multiply: (...columns) => { return new Expression_1.OperationExpression("*", ...columns); }, sum: (column) => { return new Expression_1.FunctionExpression("SUM", column); }, year: (column) => { return new Expression_1.FunctionExpression("YEAR", column); }, month: (column) => { return new Expression_1.FunctionExpression("MONTH", column); }, min: (column) => { return new Expression_1.FunctionExpression("MIN", column); }, max: (column) => { return new Expression_1.FunctionExpression("MAX", column); }, avg: (column) => { return new Expression_1.FunctionExpression("AVG", column); }, abs: (column) => { return new Expression_1.FunctionExpression("ABS", column); }, dateDiff: (interval, date1, date2) => { if (interval === "month") { return Query_1.Q.expr(`TIMESTAMPDIFF(MONTH, ${Expression_1.Expression.escapeExpressionValue(date1)}, ${Expression_1.Expression.escapeExpressionValue(date2)})`); } else if (interval === "day") { return new Expression_1.FunctionExpression("DATEDIFF", date1, date2); } else { return new Expression_1.OperationExpression("-", exports.Function.year(date1), exports.Function.year(date2)); } }, formatDate: (date) => { return Query_1.Q.expr(`'${formatDayjs(date)}'`); }, substring: (string, start, length) => { return new Expression_1.FunctionExpression("SUBSTRING", string, Query_1.Q.value(start), Query_1.Q.value(length)); }, string: (value) => { return Query_1.Q.expr(Expression_1.Expression.escapeString(`${value}`)); }, null: () => { return Query_1.Q.expr(`NULL`); }, ifnull: (name, value) => { return new Expression_1.FunctionExpression("IFNULL", name, value); }, concat: (...values) => { return new Expression_1.FunctionExpression("CONCAT", ...values); }, if: ifFn, dateAdd: dateAddFn, dateRangeSumField: ({ dateColumn, valueColumn, start, end, }) => { return new Expression_1.FunctionExpression("SUM", new Expression_1.FunctionExpression("IF", Condition_1.Cond.between(dateColumn, [(0, dayjs_1.default)(start), (0, dayjs_1.default)(end)]), valueColumn, Query_1.Q.value(0))); }, priceCurrentAndPreviousDiffField: ({ thisYearColumn, lastYearColumn, }) => ifFn(Condition_1.Cond.and([Condition_1.Cond.equal(thisYearColumn, 0), Condition_1.Cond.equal(lastYearColumn, 0)]), Query_1.Q.expr(`+0`), ifFn(Condition_1.Cond.equal(lastYearColumn, 0), Query_1.Q.expr("NULL"), ifFn(Condition_1.Cond.equal(thisYearColumn, 0), Query_1.Q.expr(`-1`), new Expression_1.OperationExpression("/", new Expression_1.OperationExpression("-", thisYearColumn, lastYearColumn), lastYearColumn)))), }; exports.Fn = exports.Function;