UNPKG

cyber-mysql-openai

Version:

Intelligent natural language to SQL translator with self-correction capabilities using OpenAI and MySQL

98 lines 4.56 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.cleanSqlResponse = cleanSqlResponse; // src/utils/sqlCleaner.ts const path_1 = __importDefault(require("path")); const fs_1 = __importDefault(require("fs")); /** * Limpia una cadena SQL eliminando delimitadores de código markdown, * comentarios y otros elementos que podrían causar problemas en la ejecución * @param sqlString - Cadena SQL a limpiar * @param operation - Operación relacionada (generate/reflect) * @param logger - Instancia de Logger para registrar diagnósticos * @returns Cadena SQL limpia */ function cleanSqlResponse(sqlString, operation = 'unknown', logger) { if (!sqlString) return ''; let cleanedSql = sqlString; // Eliminar bloques de código markdown (```sql ... ```) con varios formatos cleanedSql = cleanedSql.replace(/```\s*sql\s*/gi, ''); // ```sql cleanedSql = cleanedSql.replace(/```\s*mysql\s*/gi, ''); // ```mysql cleanedSql = cleanedSql.replace(/```\s*mariadb\s*/gi, ''); // ```mariadb cleanedSql = cleanedSql.replace(/```\s*$|```$/gmi, ''); // ``` al final cleanedSql = cleanedSql.replace(/```/gi, ''); // cualquier otro ``` // Eliminar otros formatos de bloque de código cleanedSql = cleanedSql.replace(/`/g, ''); // Eliminar comentarios SQL de una línea cleanedSql = cleanedSql.replace(/--.*$/gm, ''); // Eliminar comentarios SQL multilinea cleanedSql = cleanedSql.replace(/\/\*[\s\S]*?\*\//g, ''); // Eliminar texto explicativo que a veces incluye el modelo const explanatoryPhrases = [ "Esta consulta", "Este query", "La consulta", "El query", "A continuación", "Aquí está", "Consulta SQL", "La siguiente consulta", "Query SQL", "El siguiente SQL", "Código SQL" ]; const regexPattern = new RegExp(`^(${explanatoryPhrases.join('|')}).*\\n`, 'gim'); cleanedSql = cleanedSql.replace(regexPattern, ''); // Eliminar líneas que empiezan con explicaciones cleanedSql = cleanedSql.replace(/^(Explicación|Explanation|Nota|Note):.*$/gim, ''); // Eliminar líneas que parecen ser comentarios explicativos cleanedSql = cleanedSql.replace(/^(# |\/\/ ).*$/gm, ''); // Eliminar líneas vacías y espacios en blanco excesivos cleanedSql = cleanedSql.split('\n') .filter(line => line.trim() !== '') .join('\n') .trim(); // Si después de limpiar todo, la consulta empieza con algún // carácter extraño o puntuación, eliminarlo cleanedSql = cleanedSql.replace(/^[^\w\s]/, '').trim(); // Si después de la limpieza, la consulta está vacía o es demasiado corta if (cleanedSql.length < 5) { return sqlString.trim(); // Devolver la consulta original en este caso } // Registrar los cambios para diagnóstico if (cleanedSql !== sqlString && logger) { logSqlCleaning(sqlString, cleanedSql, operation, logger); } return cleanedSql; } /** * Registra los cambios realizados en la limpieza de SQL para diagnóstico */ function logSqlCleaning(originalSql, cleanedSql, operation, logger) { try { const logDir = path_1.default.join(logger['logDir'], 'sql_cleaning'); // Asegurar que existe el directorio if (!fs_1.default.existsSync(logDir)) { fs_1.default.mkdirSync(logDir, { recursive: true }); } const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); const logFile = path_1.default.join(logDir, `${timestamp}_${operation}.log`); const logContent = [ `[${timestamp}] Limpieza de SQL en operación: ${operation}`, '\n=== SQL ORIGINAL ===', originalSql, '\n=== SQL LIMPIO ===', cleanedSql, '\n=== DIFERENCIAS ===', `Caracteres originales: ${originalSql.length}`, `Caracteres limpios: ${cleanedSql.length}`, `Diferencia: ${originalSql.length - cleanedSql.length} caracteres eliminados` ].join('\n'); fs_1.default.writeFileSync(logFile, logContent); logger.debug(`SQL cleaning logged: ${operation}`, { originalLength: originalSql.length, cleanedLength: cleanedSql.length }); } catch (error) { logger.error('Error logging SQL cleaning:', error); } } exports.default = { cleanSqlResponse }; //# sourceMappingURL=sqlCleaner.js.map