| | 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(); |