-- Inicialización de la base de datos para CLARA -- Servicio inmutable de log de entrada -- Tabla principal: clara_log CREATE TABLE IF NOT EXISTS clara_log ( id BIGSERIAL PRIMARY KEY, h_instancia VARCHAR(64) NOT NULL, h_entrada VARCHAR(64) NOT NULL, contenedor JSONB NOT NULL, r2_paths JSONB, created_at TIMESTAMP DEFAULT NOW() ); -- Índices para búsqueda eficiente CREATE INDEX IF NOT EXISTS idx_clara_instancia ON clara_log(h_instancia); CREATE INDEX IF NOT EXISTS idx_clara_entrada ON clara_log(h_entrada); CREATE INDEX IF NOT EXISTS idx_clara_created ON clara_log(created_at DESC); -- Índice para buscar por estado del contenedor CREATE INDEX IF NOT EXISTS idx_clara_estado ON clara_log((contenedor->'estado'->>'actual')); -- Índice para buscar por timestamp de captura CREATE INDEX IF NOT EXISTS idx_clara_timestamp ON clara_log((contenedor->'origen'->>'timestamp_captura')); -- Índice compuesto para búsquedas frecuentes CREATE INDEX IF NOT EXISTS idx_clara_inst_entrada ON clara_log(h_instancia, h_entrada); -- Vista para consultas comunes CREATE OR REPLACE VIEW clara_summary AS SELECT id, h_instancia, h_entrada, contenedor->>'id' as contenedor_id, contenedor->'origen'->>'timestamp_captura' as timestamp_captura, contenedor->'archivo'->>'tipo' as tipo_archivo, contenedor->'archivo'->>'categoria' as categoria, contenedor->'estado'->>'actual' as estado_actual, jsonb_array_length(COALESCE(contenedor->'tags', '[]'::jsonb)) as num_tags, created_at FROM clara_log ORDER BY id DESC; -- Comentarios para documentación COMMENT ON TABLE clara_log IS 'Log inmutable de contenedores recibidos de PACKET'; COMMENT ON COLUMN clara_log.h_instancia IS 'Hash de identificación de la instancia DECK'; COMMENT ON COLUMN clara_log.h_entrada IS 'Hash del archivo (sha256)'; COMMENT ON COLUMN clara_log.contenedor IS 'Contenedor completo según esquema de contratos-comunes'; COMMENT ON COLUMN clara_log.r2_paths IS 'Rutas de los archivos en Cloudflare R2'; COMMENT ON COLUMN clara_log.created_at IS 'Timestamp de recepción (inmutable)';