trading-platform-database-v2/ddl/schemas/education/functions/05-update_course_stats.sql
rckrdmrd 45e77e9a9c feat: Initial commit - Database schemas and scripts
DDL schemas for Trading Platform:
- User management
- Authentication
- Payments
- Education
- ML predictions
- Trading data

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-18 04:30:23 -06:00

60 lines
1.9 KiB
PL/PgSQL

-- =====================================================
-- FUNCTION: education.update_course_stats()
-- =====================================================
-- Proyecto: OrbiQuant IA (Trading Platform)
-- Módulo: OQI-002 - Education
-- Especificación: ET-EDU-001-database.md
-- Descripción: Actualiza estadísticas denormalizadas del curso
-- =====================================================
-- Función para actualizar estadísticas de reviews
CREATE OR REPLACE FUNCTION education.update_course_rating_stats()
RETURNS TRIGGER AS $$
DECLARE
v_course_id UUID;
v_avg_rating DECIMAL(3,2);
v_total_reviews INTEGER;
BEGIN
-- Obtener course_id del NEW o OLD record
v_course_id := COALESCE(NEW.course_id, OLD.course_id);
-- Calcular promedio solo de reviews aprobadas
SELECT
COALESCE(AVG(rating), 0),
COUNT(*)
INTO v_avg_rating, v_total_reviews
FROM education.course_reviews
WHERE course_id = v_course_id
AND is_approved = true;
-- Actualizar estadísticas en el curso
UPDATE education.courses
SET
avg_rating = v_avg_rating,
total_reviews = v_total_reviews,
updated_at = NOW()
WHERE id = v_course_id;
RETURN COALESCE(NEW, OLD);
END;
$$ LANGUAGE plpgsql;
COMMENT ON FUNCTION education.update_course_rating_stats() IS 'Actualiza avg_rating y total_reviews del curso';
-- Triggers para actualizar estadísticas
CREATE TRIGGER update_course_rating_on_review_insert
AFTER INSERT ON education.course_reviews
FOR EACH ROW
EXECUTE FUNCTION education.update_course_rating_stats();
CREATE TRIGGER update_course_rating_on_review_update
AFTER UPDATE ON education.course_reviews
FOR EACH ROW
WHEN (OLD.rating IS DISTINCT FROM NEW.rating OR OLD.is_approved IS DISTINCT FROM NEW.is_approved)
EXECUTE FUNCTION education.update_course_rating_stats();
CREATE TRIGGER update_course_rating_on_review_delete
AFTER DELETE ON education.course_reviews
FOR EACH ROW
EXECUTE FUNCTION education.update_course_rating_stats();