Changes between Version 12 and Version 13 of AdvancedApplicationDevelopment


Ignore:
Timestamp:
09/30/25 08:36:43 (2 weeks ago)
Author:
223270
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AdvancedApplicationDevelopment

    v12 v13  
    3131
    32321. Деактивирање дестинација со негативни рецензии
    33 Деактивира дестинација само ако просечната оцена падне под еден праг, а не на првата ниска оцена. Всушност дестинацијата ќе се деактивира само ако навистина падне просечната оцена.
     33Дестинација се означува како is_flagged само ако има најмалку 5 рецензии и просечната оцена е под 3.0. Користејќи функција recalc_destination_flag и тригери што реагираат на INSERT, UPDATE и DELETE во табелата review. Предност: не се брише/сокрива содржината од корисникот, но се дава сигнал (за филтрирање или admin action) со стабилен праг.
    3434{{{
    3535ALTER TABLE destination
    36 ADD COLUMN IF NOT EXISTS aktivna BOOLEAN NOT NULL DEFAULT TRUE;
    37 }}}
    38 
    39 {{{
    40 CREATE OR REPLACE FUNCTION check_avg_rating()
    41 RETURNS TRIGGER AS $$
     36ADD COLUMN IF NOT EXISTS is_flagged BOOLEAN NOT NULL DEFAULT FALSE;
     37
     38CREATE OR REPLACE FUNCTION recalc_destination_flag(p_dest INT)
     39RETURNS VOID LANGUAGE plpgsql AS $$
    4240DECLARE
    4341    avg_rating FLOAT;
    44 BEGIN
    45     SELECT AVG(quality) INTO avg_rating
     42    total_reviews INT;
     43BEGIN
     44    SELECT AVG(quality), COUNT(*) INTO avg_rating, total_reviews
    4645    FROM review
    47     WHERE id_destination = NEW.id_destination;
    48 
    49     IF avg_rating < 4 THEN
    50         UPDATE destination
    51         SET aktivna = FALSE
    52         WHERE id_destination = NEW.id_destination;
     46    WHERE id_destination = p_dest;
     47
     48    IF total_reviews >= 5 AND COALESCE(avg_rating,0) < 3 THEN
     49        UPDATE destination SET is_flagged = TRUE WHERE id_destination = p_dest;
     50    ELSE
     51        UPDATE destination SET is_flagged = FALSE WHERE id_destination = p_dest;
    5352    END IF;
    54 
    55     RETURN NEW;
    56 END;
    57 $$ LANGUAGE plpgsql;
    58 
    59 CREATE TRIGGER trg_avg_rating
     53END;
     54$$;
     55
     56CREATE OR REPLACE FUNCTION trg_recalc_dest_flag_trigger()
     57RETURNS TRIGGER LANGUAGE plpgsql AS $$
     58BEGIN
     59    PERFORM recalc_destination_flag(NEW.id_destination) WHEN (TG_OP = 'INSERT' OR TG_OP = 'UPDATE');
     60    IF TG_OP = 'DELETE' THEN
     61        PERFORM recalc_destination_flag(OLD.id_destination);
     62    END IF;
     63    RETURN COALESCE(NEW, OLD);
     64END;
     65$$;
     66
     67DROP TRIGGER IF EXISTS trg_review_after_insert ON review;
     68CREATE TRIGGER trg_review_after_insert
    6069AFTER INSERT ON review
    61 FOR EACH ROW
    62 EXECUTE FUNCTION check_avg_rating();
     70FOR EACH ROW EXECUTE FUNCTION trg_recalc_dest_flag_trigger();
     71
     72DROP TRIGGER IF EXISTS trg_review_after_update ON review;
     73CREATE TRIGGER trg_review_after_update
     74AFTER UPDATE ON review
     75FOR EACH ROW EXECUTE FUNCTION trg_recalc_dest_flag_trigger();
     76
     77DROP TRIGGER IF EXISTS trg_review_after_delete ON review;
     78CREATE TRIGGER trg_review_after_delete
     79AFTER DELETE ON review
     80FOR EACH ROW EXECUTE FUNCTION trg_recalc_dest_flag_trigger();
    6381}}}
    6482