-- Optimizaciones reversibles para busqueda textual INVIMA.
-- Ejecutar con: npm run benchmark:optimize
-- No modifica datos regulatorios; solo agrega extension/indices y estadisticas.
-- CREATE INDEX CONCURRENTLY no puede ejecutarse dentro de una transaccion explicita.

CREATE EXTENSION IF NOT EXISTS pg_trgm;

-- Corrige una posible ejecucion anterior interrumpida: IF NOT EXISTS no repara indices invalidos.
-- Se revierte eliminando los indices en optimization_down.sql.
DROP INDEX CONCURRENTLY IF EXISTS idx_bench_catalog_order;
DROP INDEX CONCURRENTLY IF EXISTS idx_bench_catalog_order_prefix;

-- No se crea indice B-tree de orden por producto completo:
-- 1) producto completo excede el limite de tupla B-tree en filas largas.
-- 2) LEFT(producto, 512) encontro valores con codificacion invalida en esta base local.
-- La optimizacion segura de esta iteracion se limita a predicados textuales indexables.

-- Beneficia query_06/query_07: coincide exactamente con COALESCE(registro_sanitario, '') ILIKE '%marcapasos%'.
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_bench_catalog_registro_coalesce_trgm
  ON invima_api_catalog USING GIN ((COALESCE(registro_sanitario, '')) gin_trgm_ops);

-- Beneficia query_06/query_07: coincide exactamente con COALESCE(expediente, '') ILIKE '%marcapasos%'.
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_bench_catalog_expediente_coalesce_trgm
  ON invima_api_catalog USING GIN ((COALESCE(expediente, '')) gin_trgm_ops);

-- Beneficia query_06/query_07: coincide exactamente con COALESCE(producto, '') ILIKE '%marcapasos%'.
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_bench_catalog_producto_coalesce_trgm
  ON invima_api_catalog USING GIN ((COALESCE(producto, '')) gin_trgm_ops);

-- Beneficia query_06/query_07: coincide exactamente con COALESCE(categoria_canonica, '') ILIKE '%marcapasos%'.
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_bench_catalog_categoria_canonica_coalesce_trgm
  ON invima_api_catalog USING GIN ((COALESCE(categoria_canonica, '')) gin_trgm_ops);

-- Beneficia query_06/query_07: coincide exactamente con COALESCE(categoria_linea, '') ILIKE '%marcapasos%'.
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_bench_catalog_categoria_linea_coalesce_trgm
  ON invima_api_catalog USING GIN ((COALESCE(categoria_linea, '')) gin_trgm_ops);

-- Mejora estimaciones de cardinalidad y ordenamiento de query_06/query_07.
ALTER TABLE invima_api_catalog ALTER COLUMN fecha_vencimiento SET STATISTICS 1000;
ALTER TABLE invima_api_catalog ALTER COLUMN producto SET STATISTICS 1000;
ALTER TABLE invima_api_catalog ALTER COLUMN registro_sanitario SET STATISTICS 1000;
ALTER TABLE invima_api_catalog ALTER COLUMN expediente SET STATISTICS 1000;
ALTER TABLE invima_api_catalog ALTER COLUMN categoria_canonica SET STATISTICS 1000;
ALTER TABLE invima_api_catalog ALTER COLUMN categoria_linea SET STATISTICS 1000;
ALTER TABLE invima_api_catalog ALTER COLUMN search_text SET STATISTICS 1000;

-- ANALYZE invima_api_catalog se deja como paso manual opcional.
-- En la base local inspeccionada falla por datos textuales con codificacion invalida (0xc3).
-- No se corrigen datos regulatorios desde esta migracion.
