@stormzx/sqlbuilder
Version:
A simple sql builder.
132 lines (102 loc) • 3.24 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _lodash = require("lodash");
var _fragment = _interopRequireDefault(require("./fragment"));
var _utils = require("../utils");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
class ConditionFragment extends _fragment.default {
#conditions = [];
and() {
return this.#resolve('and', ...arguments);
}
or() {
return this.#resolve('or', ...arguments);
}
#resolve(action, ...args) {
let [column, operator, value] = args; // .and({a: 1, b: 2})
if ((0, _lodash.isObject)(column) && !(0, _utils.isRaw)(column) && !(0, _utils.isAlias)(column)) {
for (let key in column) {
this.#resolve(action, key, 'unset', column[key]);
}
return this;
} // .and('a', 1) => .and('a', undefined, 1)
if (args.length == 2) {
return this.#resolve(action, column, 'unset', operator);
}
this.#conditions.push({
action,
column,
operator,
value
});
return this;
}
get sql() {
let result = [];
for (let {
action,
column,
operator,
value
} of this.#conditions) {
column = (0, _lodash.isString)(column) ? (0, _lodash.snakeCase)(column) : column;
/**
* resolve:
*
* 1. .and('<column>')
* 2. .and('<column>', undefined)
* 5. .and('<column>', '<operator>', undefined)
*
*/
if (value === undefined) {
// only raw column provided
if (operator === undefined && (0, _utils.isRaw)(column)) {
result.push(`${action} ${column}`);
}
continue;
}
/**
* if operator not provided, resolve it.
*/
if (operator === 'unset') {
operator = (0, _lodash.isArray)(value) ? 'in' : '=';
}
/**
* replace operator if value is an array
*/
if ((0, _lodash.isArray)(value)) {
if (operator === '=') {
operator = 'in';
} else if (operator === '!=') {
operator = 'not in';
}
}
if (value === null) {
if (operator === '=') {
operator = 'is';
} else if (operator === '!=') {
operator = 'is not';
}
}
;
[operator, value] = this.#resolveStringOperator(operator, value);
value = (0, _lodash.isArray)(value) ? `(${value.map(v => (0, _utils.escape)(v)).join(', ')})` : (0, _utils.escape)(value);
column = (0, _utils.isAlias)(column) ? column.sql : (0, _utils.escapeId)(column);
result.push(`${action} ${column} ${operator} ${value}`);
}
return result.join(' ').replace(/^(and|or) /, '');
} // 处理字符串表达式
#resolveStringOperator(operator, value) {
if (/^(not )?(like|contains|startsWith|endsWith)$/.test(operator)) {
let leftPad = !/start/.test(operator);
let rightPad = !/end/.test(operator);
value = (0, _utils.escape)(`${leftPad ? '%' : ''}${value}${rightPad ? '%' : ''}`);
operator = `${/not/.test(operator) ? 'not ' : ''}like`;
}
return [operator, value];
}
}
exports.default = ConditionFragment;