UNPKG

@forzalabs/remora

Version:

A powerful CLI tool for seamless data translation.

97 lines (96 loc) 4.64 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const Affirm_1 = __importDefault(require("../../core/Affirm")); class SQLBuilderClass { constructor() { this.getSQLOperator = (operator) => { switch (operator) { case 'equals': return '='; case 'notEquals': return '!='; case 'contains': return 'LIKE'; case 'notContains': return 'NOT LIKE'; case 'startsWith': return 'LIKE'; case 'endsWith': return 'LIKE'; case 'greaterThan': return '>'; case 'greaterThanOrEquals': return '>='; case 'lessThan': return '<'; case 'lessThanOrEquals': return '<='; case 'in': return 'IN'; case 'notIn': return 'NOT IN'; case 'between': return 'BETWEEN'; case 'notBetween': return 'NOT BETWEEN'; case 'isNull': return 'IS NULL'; case 'isNotNull': return 'IS NOT NULL'; case 'true': return '= TRUE'; case 'false': return '= FALSE'; case 'matches': return '~'; case 'notMatches': return '!~'; case 'sql': return ''; // Custom SQL should be handled separately default: throw new Error(`Unsupported operator: ${operator}`); } }; this.buildFilterClause = (filter) => { var _a, _b; const operator = this.getSQLOperator(filter.operator); let baseClause; if (filter.operator === 'in' || filter.operator === 'notIn') { baseClause = `${filter.member} ${operator} (${filter.values.map(value => `'${value}'`).join(', ')})`; } else if (filter.operator === 'between' || filter.operator === 'notBetween') { baseClause = `${filter.member} ${operator} '${filter.values[0]}' AND '${filter.values[1]}'`; } else if (filter.operator === 'isNull' || filter.operator === 'isNotNull' || filter.operator === 'true' || filter.operator === 'false') { baseClause = `${filter.member} ${operator}`; } else if (filter.operator === 'contains' || filter.operator === 'notContains') { baseClause = `${filter.member} ${operator} '%${filter.values[0]}%'`; } else if (filter.operator === 'startsWith') { baseClause = `${filter.member} ${operator} '${filter.values[0]}%'`; } else if (filter.operator === 'endsWith') { baseClause = `${filter.member} ${operator} '%${filter.values[0]}'`; } else if (filter.operator === 'sql') { baseClause = `(${filter.values[0]})`; } else { baseClause = `${filter.member} ${operator} '${filter.values[0]}'`; } const orClauses = (_a = filter.or) === null || _a === void 0 ? void 0 : _a.map(this.buildFilterClause).join(' OR '); const andClauses = (_b = filter.and) === null || _b === void 0 ? void 0 : _b.map(this.buildFilterClause).join(' AND '); let combinedClause = baseClause; if (orClauses) { combinedClause = `(${combinedClause} OR ${orClauses})`; } if (andClauses) { combinedClause = `(${combinedClause} AND ${andClauses})`; } return combinedClause; }; this.buildConsumerQuery = (request) => { (0, Affirm_1.default)(request, `Invalid build consumer request`); let query = ``; if (request.filters && request.filters.length > 0) { const filterClauses = request.filters.map(this.buildFilterClause); query += ` WHERE ${filterClauses.join(' AND ')}`; } if (request.order && request.order.length > 0) { const orderClauses = request.order.map(([field, direction]) => `${field} ${direction}`); query += ` ORDER BY ${orderClauses.join(', ')}`; } if (request.limit) { query += ` LIMIT ${request.limit}`; } if (request.offset) { query += ` OFFSET ${request.offset}`; } return query; }; } } const SQLBuilder = new SQLBuilderClass(); exports.default = SQLBuilder;