UNPKG

@stormzx/sqlbuilder

Version:

A simple sql builder.

146 lines (111 loc) 4.68 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _lodash = _interopRequireWildcard(require("lodash")); var _fragment = _interopRequireDefault(require("./fragment")); var _utils = require("../utils"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } // 条件查询 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.isTable)(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); } // .and('a', {'/=', 1, between: [1, 2]}) if (_lodash.default.isPlainObject(value)) { Object.entries(value).forEach(([operator, value]) => { this.#resolve(action, column, operator, value); }); return this; } 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) ? column.split('.').map(_lodash.snakeCase).join('.') : 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.isRaw)(column) ? column : (0, _utils.escapeId)(column); // console.log(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;