]> git.sesse.net Git - ccbs/blobdiff - sql/ccbs.sql
Moved FetchMaxScoreForPlayers into a stored procedure.
[ccbs] / sql / ccbs.sql
index 839dd86879d6c9a2ff352caf2ea65d3b12a32879..d48fbeb04c33385c27929a10defee15003bd842d 100644 (file)
@@ -10,8 +10,19 @@ CREATE TABLE machines (
 CREATE TABLE countries (
        country SERIAL PRIMARY KEY,
        countryname VARCHAR NOT NULL,
+       countrycode CHAR(3) NOT NULL,   -- IOC country code
 
-       UNIQUE ( countryname )
+       UNIQUE ( countryname ),
+       UNIQUE ( countrycode )
+);
+
+CREATE TABLE clubs (
+       club SERIAL PRIMARY KEY,
+       clubname VARCHAR NOT NULL,
+       clubcode CHAR(3) NOT NULL,
+
+       UNIQUE ( clubname ),
+       UNIQUE ( clubcode )
 );
 
 CREATE TABLE songs (
@@ -57,9 +68,13 @@ CREATE TABLE songratings (
 );
 CREATE INDEX songratings_feetrating ON songratings ( feetrating );
 
+CREATE VIEW max_single_feetrating AS SELECT machine,song,MAX(feetrating) AS feetrating FROM songratings WHERE playmode='single' GROUP BY machine,song;
+
 CREATE TABLE players (
        player SERIAL PRIMARY KEY,
        nick VARCHAR NOT NULL,
+       country INTEGER NOT NULL REFERENCES countries,
+       club INTEGER REFERENCES clubs,
 
        UNIQUE ( nick )
 );
@@ -98,8 +113,7 @@ CREATE TABLE tournamentrankings (
        player INTEGER NOT NULL REFERENCES players,
        points INTEGER,
 
-       UNIQUE (tournament, player),
-       PRIMARY KEY (tournament, ranking)
+       PRIMARY KEY (tournament, player)
 );
 
 CREATE TABLE rounds (
@@ -186,3 +200,59 @@ CREATE TABLE bigscreen.active_groups (
 CREATE TABLE bigscreen.active_screens (
        id VARCHAR NOT NULL PRIMARY KEY
 );
+
+-- get_max_score_for_songs(tournament, playmode)
+CREATE TYPE max_score AS (
+       song INTEGER,
+       max_score INTEGER
+);
+
+CREATE FUNCTION get_max_score_for_songs(integer, varchar) RETURNS SETOF max_score
+    AS $$
+       SELECT
+           song,
+           MAX(feetrating)*1000 AS max_score
+       FROM songratings
+       WHERE
+           machine=(
+               SELECT machine FROM tournaments WHERE tournament=$1
+            )
+           AND playmode=$2
+       GROUP BY song
+       ;
+$$
+    LANGUAGE SQL
+    STABLE
+    RETURNS NULL ON NULL INPUT;
+
+-- get_max_score_for_players(tournament, round, playmode)
+CREATE FUNCTION get_max_score_for_players(integer, integer, varchar) RETURNS SETOF max_score
+    AS $$
+       SELECT player,
+         (
+            SELECT feetrating
+            FROM songratings
+            WHERE machine=(         -- only find songs on the machine we use
+              SELECT machine FROM tournaments WHERE tournament=$1
+            )
+            AND song NOT IN (       -- not a song that has been in elimination or seeding
+              SELECT song FROM scores 
+              WHERE tournament=$1
+                AND song IS NOT NULL
+                 AND parallel=0
+                 AND chosen='f'
+             )
+             AND (player,song) NOT IN (  -- not a song the player has chosen before, or is a random song in this round
+              SELECT player,song FROM scores
+              WHERE tournament=$1
+                 AND song IS NOT NULL
+                 AND ( chosen='t' OR round=$2 )
+             )
+             AND playmode=$3
+             ORDER BY feetrating DESC LIMIT 1
+         ) * 1000 AS max_score FROM tournamentparticipation;
+$$
+    LANGUAGE SQL
+    STABLE
+    RETURNS NULL ON NULL INPUT;
+