Skip to content
Snippets Groups Projects

Reforma orgovského rozhraní ke kolům a soutěžím

Merged Martin Mareš requested to merge mj/contest-reform into devel

Files

+ 39
0
@@ -355,3 +355,42 @@ CREATE TABLE reg_requests (
@@ -355,3 +355,42 @@ CREATE TABLE reg_requests (
user_id int DEFAULT NULL REFERENCES users(user_id) ON DELETE CASCADE,
user_id int DEFAULT NULL REFERENCES users(user_id) ON DELETE CASCADE,
client varchar(255) NOT NULL -- kdo si registraci vyžádal
client varchar(255) NOT NULL -- kdo si registraci vyžádal
);
);
 
 
-- Statistiky
 
 
-- Pro každý region spočítáme všechna podřízená místa
 
CREATE VIEW region_descendants AS
 
WITH RECURSIVE descendant_regions(place_id, descendant) AS (
 
SELECT place_id, place_id FROM places
 
UNION SELECT r.place_id, p.place_id
 
FROM descendant_regions r, places p
 
WHERE p.parent = r.descendant
 
) SELECT place_id AS region, descendant FROM descendant_regions;
 
 
-- Pro každou trojici (kolo, region, stav soutěže) spočítáme soutěže.
 
CREATE VIEW region_contest_stats AS
 
SELECT c.round_id, rd.region, c.state, count(*) AS count
 
FROM contests c
 
JOIN region_descendants rd ON rd.descendant = c.place_id
 
WHERE rd.region <> c.place_id
 
GROUP BY c.round_id, rd.region, c.state;
 
 
-- Pro každou trojici (kolo, region, stav účasti) spočítáme účastníky.
 
-- Pokud se to ukáže být příliš pomalé, přejdeme na materializovaná views.
 
CREATE VIEW region_participant_stats AS
 
SELECT c.round_id, rd.region, p.state, count(*) AS count
 
FROM participations p
 
JOIN contests c USING(contest_id)
 
JOIN region_descendants rd ON rd.descendant = c.place_id
 
GROUP BY c.round_id, rd.region, p.state;
 
 
-- Pro každou trojici (kolo, region, úloha) spočítáme řešení.
 
CREATE VIEW region_task_stats AS
 
SELECT r.round_id, rd.region, t.task_id, count(*) AS count
 
FROM rounds r
 
JOIN contests c USING(round_id)
 
JOIN participations p USING(contest_id)
 
JOIN tasks t USING(round_id)
 
JOIN solutions s USING(user_id, task_id)
 
JOIN region_descendants rd ON rd.descendant = c.place_id
 
GROUP BY r.round_id, rd.region, t.task_id;
Loading