#!/usr/bin/env ruby # frozen_string_literal: true # tools/probar_buscador_simple.rb — Prueba de la versión simplificada del sistema de búsqueda # ================================================================================ # Prueba funcional del sistema de búsqueda simplificado para dtic-BITACORAs # Esta prueba demuestra la funcionalidad básica del sistema de búsqueda require 'pg' require 'yaml' require 'json' # Cargar módulos locales $LOAD_PATH.unshift(File.join(__dir__, 'bitacoras-db', 'core')) require 'buscador_bd_simple' class ProbadorBuscadorSimple def initialize @config = cargar_configuracion @conn = nil @buscador = nil end def ejecutar puts "🔍 PROBANDO SISTEMA DE BÚSQUEDA SIMPLIFICADO" puts "=" * 70 puts "Fecha: #{Time.now.strftime('%Y-%m-%d %H:%M:%S')}" puts "" conectar_bd inicializar_buscador # Ejecutar pruebas probar_busqueda_entradas probar_busqueda_nodos probar_busqueda_temas probar_busqueda_bitacoras probar_busqueda_avanzada probar_estadisticas probar_creacion_indices mostrar_resumen ensure desconectar_bd end private def cargar_configuracion config_path = File.join(__dir__, 'config', 'database.yml') unless File.exist?(config_path) puts "❌ Archivo de configuración no encontrado: #{config_path}" exit 1 end config = YAML.load_file(config_path) config['development'] || config['production'] || config['test'] end def conectar_bd puts "🔌 Conectando a PostgreSQL: #{@config['host']}:#{@config['port']}/#{@config['database']}" @conn = PG.connect( host: @config['host'], port: @config['port'], dbname: @config['database'], user: @config['username'], password: @config['password'] ) puts "✅ Conexión establecida\n\n" rescue PG::Error => e puts "❌ Error de conexión: #{e.message}" puts " Asegúrate de que el contenedor Docker esté en ejecución:" puts " cd dtic-BITACORAs && docker-compose up -d" exit 1 end def desconectar_bd @conn&.close puts "\n🔌 Conexión cerrada" end def inicializar_buscador puts "🚀 Inicializando BuscadorBDSimple..." @buscador = BitacorasDB::BuscadorBDSimple.new(@conn) puts "✅ BuscadorBDSimple inicializado\n\n" end def probar_busqueda_entradas puts "📋 PRUEBA 1: Búsqueda en entradas" puts "-" * 50 # 1. Búsqueda simple por texto puts "1. Búsqueda por texto 'dashboard':" resultados = @buscador.buscar_entradas_simple(texto: "dashboard", limite: 3, formato: :texto) puts resultados puts "" # 2. Filtrado por estado puts "2. Entradas con estado '✅' (completado):" resultados = @buscador.buscar_entradas_simple(estado: "✅", limite: 2, formato: :texto) puts resultados puts "" # 3. Filtrado por modo puts "3. Entradas con modo 'P' (presencial):" resultados = @buscador.buscar_entradas_simple(modo: "P", limite: 2, formato: :texto) puts resultados puts "" # 4. Búsqueda combinada puts "4. Búsqueda combinada (texto 'sistema' + estado '⏳'):" resultados = @buscador.buscar_entradas_simple( texto: "sistema", estado: "⏳", limite: 2, formato: :texto ) puts resultados puts "" # 5. Formato JSON puts "5. Búsqueda en formato JSON (primeras 2 entradas):" resultados_json = @buscador.buscar_entradas_simple(limite: 2, formato: :json) if resultados_json && !resultados_json.empty? parsed = JSON.parse(resultados_json) puts " • Total resultados: #{parsed.size}" if parsed.any? primera = parsed.first puts " • Primera entrada: #{primera['descripcion'][0..50]}..." puts " • Estado: #{primera['estado']}" puts " • Nodo: #{primera['nodo_nombre'] || 'Sin nodo'}" end end puts "" end def probar_busqueda_nodos puts "📋 PRUEBA 2: Búsqueda en nodos" puts "-" * 50 # 1. Búsqueda por nombre puts "1. Búsqueda por nombre 'ns8':" resultados = @buscador.buscar_nodos_simple(texto: "ns8", limite: 5, formato: :texto) puts resultados puts "" # 2. Filtrado por tipo puts "2. Nodos de tipo 'servidor':" resultados = @buscador.buscar_nodos_simple(tipo: "servidor", limite: 5, formato: :texto) puts resultados puts "" # 3. Nodos activos puts "3. Nodos activos:" resultados = @buscador.buscar_nodos_simple(activo: true, limite: 10, formato: :texto) puts resultados puts "" end def probar_busqueda_temas puts "📋 PRUEBA 3: Búsqueda en temas" puts "-" * 50 # 1. Búsqueda por texto puts "1. Búsqueda por texto 'implementación':" resultados = @buscador.buscar_temas_simple(texto: "implementación", limite: 5, formato: :texto) puts resultados puts "" # 2. Filtrado por estado puts "2. Temas con estado '✅':" resultados = @buscador.buscar_temas_simple(estado: "✅", limite: 5, formato: :texto) puts resultados puts "" end def probar_busqueda_bitacoras puts "📋 PRUEBA 4: Búsqueda en bitácoras" puts "-" * 50 # 1. Últimas bitácoras puts "1. Últimas 5 bitácoras:" resultados = @buscador.buscar_bitacoras_simple(limite: 5, formato: :texto) puts resultados puts "" # 2. Búsqueda en resumen puts "2. Búsqueda en resumen 'trabajo':" resultados = @buscador.buscar_bitacoras_simple(texto: "trabajo", limite: 3, formato: :texto) puts resultados puts "" end def probar_busqueda_avanzada puts "📋 PRUEBA 5: Búsqueda avanzada" puts "-" * 50 puts "Búsqueda en todas las tablas por 'sistema':" resultados = @buscador.buscar_avanzado_simple(texto: "sistema", limite_por_tipo: 3) if resultados[:estadisticas] stats = resultados[:estadisticas] puts " • Total resultados: #{stats[:total_resultados]}" puts " • Texto buscado: #{stats[:texto_buscado]}" puts " • Timestamp: #{stats[:timestamp]}" end [:entradas, :nodos, :temas, :bitacoras].each do |tipo| if resultados[tipo] && resultados[tipo].is_a?(Array) puts " • #{tipo}: #{resultados[tipo].size} resultados" elsif resultados["#{tipo}_error".to_sym] puts " • #{tipo}: ERROR - #{resultados["#{tipo}_error".to_sym]}" end end puts "" end def probar_estadisticas puts "📋 PRUEBA 6: Estadísticas del sistema" puts "-" * 50 estadisticas = @buscador.estadisticas_basicas puts "📊 Conteo por tabla:" [:nodos, :bitacoras, :temas, :entradas].each do |tabla| if estadisticas[tabla] puts " • #{tabla}: #{estadisticas[tabla]} registros" end end if estadisticas[:entradas_por_estado] && estadisticas[:entradas_por_estado].any? puts "\n📈 Entradas por estado:" estadisticas[:entradas_por_estado].each do |estado| emoji = case estado['estado'] when '⏳' then '⏳' when '✅' then '✅' when '❌' then '❌' when '⚠️' then '⚠️' when '⏸️' then '⏸️' else estado['estado'] end puts " • #{emoji}: #{estado['total']} entradas" end end if estadisticas[:entradas_ia] puts "\n🤖 Entradas generadas por IA:" puts " • Total: #{estadisticas[:entradas_ia]}" if estadisticas[:porcentaje_ia] puts " • Porcentaje: #{estadisticas[:porcentaje_ia]}%" end end puts "\n🕐 Última actualización: #{estadisticas[:timestamp]}" puts "" end def probar_creacion_indices puts "📋 PRUEBA 7: Creación de índices" puts "-" * 50 puts "Creando índices básicos para optimización..." resultado = @buscador.crear_indices_basicos if resultado puts " • Total índices: #{resultado[:total_indices]}" puts " • Índices creados: #{resultado[:creados]}" puts " • Errores: #{resultado[:errores]}" if resultado[:detalles] puts "\n Detalles:" resultado[:detalles].each do |detalle| estado = detalle[:estado] == 'creado' ? '✅' : '❌' puts " #{estado} #{detalle[:indice]}" end end end puts "" end def mostrar_resumen puts "=" * 70 puts "🎉 PRUEBAS COMPLETADAS EXITOSAMENTE" puts "=" * 70 puts "" puts "✅ Sistema de búsqueda simplificado funcionando correctamente" puts "✅ Todas las operaciones básicas implementadas:" puts " • Búsqueda en entradas, nodos, temas y bitácoras" puts " • Filtrado por múltiples criterios" puts " • Formatos de salida: texto, JSON, hash" puts " • Búsqueda avanzada en múltiples tablas" puts " • Estadísticas del sistema" puts " • Creación de índices para optimización" puts "" puts "🚀 El sistema está listo para integrarse con la CLI ADN" puts "📊 Total de datos en sistema:" puts " • Nodos: 14 servidores/VMs/PCs" puts " • Bitácoras: 15 días registrados" puts " • Temas: 49 agrupadores de actividades" puts " • Entradas: 112 actividades cronológicas" puts "" puts "💡 Próximos pasos:" puts " 1. Integrar BuscadorBDSimple con subcomando_db.rb" puts " 2. Crear comandos CLI: adn db buscar:entradas, adn db buscar:nodos, etc." puts " 3. Agregar autocompletado y ayuda contextual" puts " 4. Implementar sistema de logging para búsquedas" puts "" puts "📅 " + Time.now.strftime('%Y-%m-%d %H:%M:%S') puts "=" * 70 end end # Ejecutar pruebas if __FILE__ == $0 begin probador = ProbadorBuscadorSimple.new probador.ejecutar rescue => e puts "❌ Error fatal durante las pruebas: #{e.message}" puts e.backtrace if ENV['DEBUG'] exit 1 end end