-- ============================================
-- rioCata - Índices para Optimización
-- ============================================

-- ============================================
-- ÍNDICES EN CLAVES FORÁNEAS
-- ============================================

CREATE INDEX idx_sesion_participante_sesion_id ON sesion_participante(sesion_id);
CREATE INDEX idx_sesion_participante_catador_id ON sesion_participante(catador_id);

CREATE INDEX idx_muestra_sesion ON muestra(sesion_id);

CREATE INDEX idx_eval_muestra ON evaluacion(muestra_id);
CREATE INDEX idx_eval_participante ON evaluacion(sesion_participante_id);

-- ============================================
-- ÍNDICES EN CAMPOS ESPECÍFICOS
-- ============================================

-- Índice para búsquedas por tipo de defecto
CREATE INDEX idx_eval_defecto ON evaluacion(defecto);

-- Índice para búsquedas por puntaje final
CREATE INDEX idx_eval_puntaje_final ON evaluacion(puntaje_final DESC);

-- ============================================
-- ÍNDICES GIN PARA JSONB Y ARRAYS
-- ============================================

-- Índices GIN para consultas de contención en JSONB
CREATE INDEX idx_eval_json_intensidades ON evaluacion USING GIN (intensidades jsonb_path_ops);
CREATE INDEX idx_eval_aroma_notas ON evaluacion USING GIN (fragancia_aroma_notas);
CREATE INDEX idx_eval_sabor_notas ON evaluacion USING GIN (sabor_notas);

-- Índices GIN para arrays (permite consultas con @>, &&, etc.)
CREATE INDEX idx_eval_tazas_defectuosas ON evaluacion USING GIN (tazas_defectuosas);
CREATE INDEX idx_eval_tazas_no_uniformes ON evaluacion USING GIN (tazas_no_uniformes);
CREATE INDEX idx_eval_sensacion_boca ON evaluacion USING GIN (sensacion_en_boca);
CREATE INDEX idx_eval_gustos_predominantes ON evaluacion USING GIN (gustos_predominantes);

-- ============================================
-- ÍNDICES FUNCIONALES (OPCIONALES)
-- ============================================

-- Índices funcionales para consultas frecuentes sobre valores específicos en intensidades
-- Estos son opcionales pero mejoran el rendimiento de queries que filtran por valores afectivos específicos

-- Ejemplo: filtrar por acidez afectiva >= 8
CREATE INDEX idx_eval_int_acidez_afectiva
ON evaluacion ( ((intensidades->'acidez'->>'afectiva')::int) );

-- Ejemplo: filtrar por dulzor afectivo >= 8
CREATE INDEX idx_eval_int_dulzor_afectivo
ON evaluacion ( ((intensidades->'dulzor'->>'afectiva')::int) );

-- Ejemplo: filtrar por sabor afectivo >= 8
CREATE INDEX idx_eval_int_sabor_afectivo
ON evaluacion ( ((intensidades->'sabor'->>'afectiva')::int) );

-- ============================================
-- ÍNDICES DE TEXTO (PARA BÚSQUEDA)
-- ============================================

-- Índice para búsqueda de texto en otras_notas
CREATE INDEX idx_eval_otras_notas_gin ON evaluacion USING GIN (to_tsvector('spanish', COALESCE(otras_notas, '')));

-- Índice para búsqueda en nombres de sesión
CREATE INDEX idx_sesion_nombre_gin ON sesion USING GIN (to_tsvector('spanish', COALESCE(nombre, '')));

-- ============================================
-- COMENTARIOS
-- ============================================

COMMENT ON INDEX idx_eval_json_intensidades IS 'Índice GIN para consultas de contención en intensidades (jsonb_path_ops)';
COMMENT ON INDEX idx_eval_tazas_defectuosas IS 'Índice GIN para búsquedas de tazas defectuosas específicas';
COMMENT ON INDEX idx_eval_int_acidez_afectiva IS 'Índice funcional para filtros por valor afectivo de acidez';
