DatabaseCreation: ticket_generator.sql

File ticket_generator.sql, 1.7 KB (added by 231091, 5 hours ago)
Line 
1BEGIN;
2CREATE INDEX IF NOT EXISTS idx_seat_stadium ON Seat (stadium_id);
3CREATE INDEX IF NOT EXISTS idx_ticket_match ON Ticket (match_id);
4CREATE UNIQUE INDEX IF NOT EXISTS uq_ticket_seat_match ON Ticket (seat_id, match_id);
5COMMIT;
6
7DROP TABLE IF EXISTS tmp_stadium_seats;
8CREATE TEMP TABLE tmp_stadium_seats AS
9SELECT stadium_id, COUNT(*) AS seat_count
10FROM Seat
11GROUP BY stadium_id;
12
13DO $$
14DECLARE
15 m RECORD;
16 seats INT;
17 fill_rate NUMERIC;
18 scan_rate NUMERIC;
19 n_to_insert INT;
20 sample_pct NUMERIC;
21 total BIGINT;
22BEGIN
23 FOR m IN SELECT match_id, stadium_id FROM "match" LOOP
24 SELECT COUNT(*) INTO total FROM Ticket;
25 EXIT WHEN total >= 15000000;
26
27 SELECT seat_count INTO seats
28 FROM tmp_stadium_seats
29 WHERE stadium_id = m.stadium_id;
30
31 IF seats IS NULL THEN CONTINUE; END IF;
32
33 -- Pick a fill rate that targets ~10-15M total. Adjust the range based on
34 -- (target_rows / total_matches / avg_seats_per_stadium).
35 fill_rate := 0.40 + random() * 0.20;
36 scan_rate := 0.30 + random() * 0.50;
37 n_to_insert := GREATEST(1, (seats * fill_rate)::int);
38
39 sample_pct := LEAST(100, fill_rate * 100 * 1.5);
40
41 INSERT INTO Ticket (seat_id, match_id, is_scanned, price)
42 SELECT picked.seat_id,
43 m.match_id,
44 (random() < scan_rate),
45 CEIL(10 + random() * 190)
46 FROM (
47 SELECT se.seat_id
48 FROM Seat se TABLESAMPLE BERNOULLI (sample_pct)
49 WHERE se.stadium_id = m.stadium_id
50 LIMIT n_to_insert
51 ) picked
52 ON CONFLICT (seat_id, match_id) DO NOTHING;
53 END LOOP;
54END $$;
55
56SELECT COUNT(*) FROM Ticket;