UNPKG

@stormzx/sqlbuilder

Version:

A simple sql builder.

132 lines (102 loc) 3.24 kB
"use strict"; 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;