Moved FetchMaxScoreForPlayers into a stored procedure.
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Sat, 11 Jun 2005 22:54:56 +0000 (22:54 +0000)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Sat, 11 Jun 2005 22:54:56 +0000 (22:54 +0000)
bigscreen/fetch_max_score_for_players.cpp
sql/ccbs.sql

index 3aa66b7837364ec9e12d6c5d441ffc5a6e9da3ee..0b41055cb0f51b064e7b1ed3969156e10fc063bb 100644 (file)
@@ -7,28 +7,9 @@ void FetchMaxScoreForPlayers::operator() (pqxx::transaction<> &t)
 {
        scores->erase(scores->begin(), scores->end());
        
-       pqxx::result res( t.exec(
-               "SELECT player,"
-               "  ("
-               "     SELECT feetrating"
-               "     FROM songratings"
-               "     WHERE machine=( SELECT machine FROM tournaments WHERE tournament=" + pqxx::to_string(tournament) + " ) " // only find songs on the machine we use
-               "     AND song NOT IN ("                      // not a song that has been in elimination or seeding
-               "       SELECT song FROM scores "
-               "         WHERE tournament=" + pqxx::to_string(tournament) +
-               "         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=" + pqxx::to_string(tournament) +
-               "          AND song IS NOT NULL" +
-               "          AND ( chosen='t' OR round=" + pqxx::to_string(round) + " )"
-               "       )"
-               "     AND playmode='single'"
-               "     ORDER BY feetrating DESC LIMIT 1"      
-               "  ) * 1000 AS max_score FROM tournamentparticipation") );
+       pqxx::result res( t.exec("SELECT * FROM get_max_score_for_players("
+               + pqxx::to_string(tournament) + ", " + pqxx::to_string(round) +
+               ", 'single')") );
        
        for (pqxx::result::const_iterator i = res.begin(); i != res.end(); ++i) {
                unsigned player, max_score;
index 4c42d56187a4c01f185ead62367b10f081503ff5..d48fbeb04c33385c27929a10defee15003bd842d 100644 (file)
@@ -224,3 +224,35 @@ $$
     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;
+