refql
Version:
A Node.js and Deno library for composing and running SQL queries.
147 lines (146 loc) • 4.46 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.nullable = nullable;
exports.eq = eq;
exports.isNull = isNull;
exports.like = like;
exports.whereIn = whereIn;
exports.ord = ord;
exports.dir = dir;
exports.omit = omit;
exports.logic = logic;
const Eq_1 = __importDefault(require("../RQLTag/Eq"));
const In_1 = __importDefault(require("../RQLTag/In"));
const IsNull_1 = __importDefault(require("../RQLTag/IsNull"));
const Like_1 = __importDefault(require("../RQLTag/Like"));
const Logic_1 = __importDefault(require("../RQLTag/Logic"));
const Ord_1 = __importDefault(require("../RQLTag/Ord"));
const OrderBy_1 = __importDefault(require("../RQLTag/OrderBy"));
const RQLNode_1 = require("../RQLTag/RQLNode");
const Raw_1 = __importDefault(require("../SQLTag/Raw"));
const consts_1 = require("../common/consts");
const copyObj_1 = __importDefault(require("../common/copyObj"));
const PropType_1 = require("./PropType");
const type = "refql/Prop";
const prototype = Object.assign({}, RQLNode_1.rqlNodePrototype, PropType_1.propTypePrototype, {
constructor: Prop,
[consts_1.refqlType]: type,
arrayOf: nullable,
nullable,
eq: eq(),
notEq: eq(true),
isNull: isNull(),
notIsNull: isNull(true),
like: like(true),
notLike: like(true, true),
iLike: like(),
notILike: like(false, true),
in: whereIn(),
notIn: whereIn(true),
gt: ord(">"),
gte: ord(">="),
lt: ord("<"),
lte: ord("<="),
asc: dir(),
desc: dir(true),
omit,
hasDefault,
or: logic("or"),
and: logic("and"),
interpret
});
function Prop(as, col) {
let prop = Object.create(prototype);
prop.as = as;
prop.col = col;
prop.operations = [];
prop.isOmitted = false;
prop.hasDefaultValue = false;
return prop;
}
function nullable() {
return (0, copyObj_1.default)(this);
}
function eq(notEq) {
return function (run) {
const prop = (0, copyObj_1.default)(this);
const eqOp = (0, Eq_1.default)(run, notEq);
prop.operations = prop.operations.concat(eqOp);
return prop;
};
}
function isNull(notIsNull) {
return function () {
const prop = (0, copyObj_1.default)(this);
const nullOp = (0, IsNull_1.default)(notIsNull);
prop.operations = prop.operations.concat(nullOp);
return prop;
};
}
function like(caseSensitive, notLike) {
return function (run) {
const prop = (0, copyObj_1.default)(this);
const likeOp = (0, Like_1.default)(run, caseSensitive, notLike);
prop.operations = prop.operations.concat(likeOp);
return prop;
};
}
function whereIn(notIn) {
return function (run) {
const prop = (0, copyObj_1.default)(this);
const inOp = (0, In_1.default)(run, notIn);
prop.operations = prop.operations.concat(inOp);
return prop;
};
}
function ord(operator) {
return function (run) {
const prop = (0, copyObj_1.default)(this);
const ordOp = (0, Ord_1.default)(run, operator);
prop.operations = prop.operations.concat(ordOp);
return prop;
};
}
function dir(descending) {
return function () {
const prop = (0, copyObj_1.default)(this);
const orderByOp = (0, OrderBy_1.default)(descending);
prop.operations = prop.operations.concat(orderByOp);
return prop;
};
}
function omit() {
let prop = (0, copyObj_1.default)(this);
prop.isOmitted = true;
return prop;
}
function logic(operator) {
return function (run) {
if (this.operations.length === 0) {
throw new Error(`"${operator}" called on Prop without operations`);
}
const prop = (0, copyObj_1.default)(this);
const logicOp = (0, Logic_1.default)(run, operator);
prop.operations = prop.operations.concat(logicOp);
return prop;
};
}
function hasDefault() {
let prop = (0, copyObj_1.default)(this);
prop.hasDefaultValue = true;
return prop;
}
function interpret() {
const { tableName, col, as } = this;
if (tableName) {
return (0, Raw_1.default)(`${tableName}.${col || as}`);
}
return (0, Raw_1.default)(col || as);
}
Prop.isProp = function (x) {
return x != null && x[consts_1.refqlType] === type;
};
exports.default = Prop;