source: database/Advanced Database Developement/Triggers/Automatic calculation of store rating from order reviews.txt@ 06ebe74

finki-main main
Last change on this file since 06ebe74 was 62b2964, checked in by Klimentina Efremova <klimentina08642@…>, 2 weeks ago

Project Handcraft Marketplace

  • Property mode set to 100644
File size: 1.3 KB
Line 
1CREATE OR REPLACE FUNCTION update_store_rating()
2RETURNS TRIGGER
3LANGUAGE plpgsql
4AS $$
5DECLARE
6 v_order_num INT;
7 v_store_id INT;
8BEGIN
9 -- Determine which order was affected
10 IF TG_OP = 'DELETE' THEN
11 v_order_num := OLD.order_num;
12 ELSE
13 v_order_num := NEW.order_num;
14 END IF;
15
16 -- Find the store associated with the order
17 SELECT fs.store_id
18 INTO v_store_id
19 FROM for_store fs
20 JOIN "order" o
21 ON o.order_num = v_order_num
22 WHERE fs.request_num IS NOT NULL
23 LIMIT 1;
24
25 -- Update the store rating
26 IF v_store_id IS NOT NULL THEN
27 UPDATE store s
28 SET rating = (
29 SELECT COALESCE(AVG(r.rating), 0)
30 FROM review r
31 JOIN "order" o
32 ON o.order_num = r.order_num
33 -- The exact relationship between orders and stores
34 -- should be used here according to the final schema
35 WHERE o.order_num IN (
36 SELECT i.order_num
37 FROM includes i
38 JOIN sells sl
39 ON sl.code = i.code
40 WHERE sl.store_id = v_store_id
41 )
42 )
43 WHERE s.store_id = v_store_id;
44 END IF;
45
46 RETURN NULL;
47END;
48$$;
49
50
51CREATE TRIGGER trg_update_store_rating
52AFTER INSERT OR UPDATE OR DELETE
53ON review
54FOR EACH ROW
55EXECUTE FUNCTION update_store_rating();
Note: See TracBrowser for help on using the repository browser.