| 119 | }}} |
| 120 | |
| 121 | 3. Наместо автоматско деактивирање, тригерот само бележи дали е под прагот за просечна оцена >=3 со минимум 5 рецензии. |
| 122 | {{{ |
| 123 | ALTER TABLE destination |
| 124 | ADD COLUMN IF NOT EXISTS flagged_low_rating BOOLEAN NOT NULL DEFAULT FALSE; |
| 125 | |
| 126 | CREATE OR REPLACE FUNCTION recalc_destination_flag(p_dest INT) |
| 127 | RETURNS VOID LANGUAGE plpgsql AS $$ |
| 128 | DECLARE |
| 129 | avg_rating FLOAT; |
| 130 | total_reviews INT; |
| 131 | BEGIN |
| 132 | SELECT COUNT(*), COALESCE(AVG(quality),0) INTO total_reviews, avg_rating |
| 133 | FROM review |
| 134 | WHERE id_destination = p_dest; |
| 135 | |
| 136 | IF total_reviews >= 5 AND avg_rating < 3 THEN |
| 137 | UPDATE destination SET flagged_low_rating = TRUE WHERE id_destination = p_dest; |
| 138 | ELSE |
| 139 | UPDATE destination SET flagged_low_rating = FALSE WHERE id_destination = p_dest; |
| 140 | END IF; |
| 141 | END; |
| 142 | $$; |
| 143 | |
| 144 | CREATE OR REPLACE FUNCTION trg_review_flag_trigger() |
| 145 | RETURNS TRIGGER LANGUAGE plpgsql AS $$ |
| 146 | BEGIN |
| 147 | IF TG_OP = 'INSERT' OR TG_OP = 'UPDATE' THEN |
| 148 | PERFORM recalc_destination_flag(NEW.id_destination); |
| 149 | ELSIF TG_OP = 'DELETE' THEN |
| 150 | PERFORM recalc_destination_flag(OLD.id_destination); |
| 151 | END IF; |
| 152 | RETURN COALESCE(NEW, OLD); |
| 153 | END; |
| 154 | $$; |
| 155 | |
| 156 | DROP TRIGGER IF EXISTS trg_review_after ON review; |
| 157 | CREATE TRIGGER trg_review_after |
| 158 | AFTER INSERT OR UPDATE OR DELETE ON review |
| 159 | FOR EACH ROW EXECUTE FUNCTION trg_review_flag_trigger(); |