@forzalabs/remora
Version:
A powerful CLI tool for seamless data translation.
97 lines (96 loc) • 4.64 kB
JavaScript
;
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;