]> git.sesse.net Git - ccbs/blobdiff - sql/ccbs.sql
Move FetchMaxScoreForSongs into a stored procedure.
[ccbs] / sql / ccbs.sql
index 3697f6e2544919bf1b0ad8b3af5b95b07b555787..4c42d56187a4c01f185ead62367b10f081503ff5 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 (
@@ -177,11 +191,36 @@ CREATE TABLE bigscreen.active_groups (
        round INTEGER NOT NULL,
        parallel INTEGER NOT NULL,
        num_machines INTEGER NOT NULL,
+       players_per_machine INTEGER NOT NULL CHECK ( players_per_machine IN (1, 2) ),
        last_updated TIMESTAMP NOT NULL,
 
        PRIMARY KEY ( tournament, round, parallel ),
        FOREIGN KEY ( tournament, round, parallel ) REFERENCES groups
 );
 CREATE TABLE bigscreen.active_screens (
-       id VARCHAR NOT NULL
-);
+       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;