@jakub.knejzlik/ts-query
Version:
TypeScript implementation of SQL builder
92 lines (91 loc) • 4.15 kB
JavaScript
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;
;