From 23a9b9ce42cd6a8c5752b217bccb581425267fdb Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Sat, 11 Jun 2005 22:54:56 +0000 Subject: [PATCH] Moved FetchMaxScoreForPlayers into a stored procedure. --- bigscreen/fetch_max_score_for_players.cpp | 25 +++--------------- sql/ccbs.sql | 32 +++++++++++++++++++++++ 2 files changed, 35 insertions(+), 22 deletions(-) diff --git a/bigscreen/fetch_max_score_for_players.cpp b/bigscreen/fetch_max_score_for_players.cpp index 3aa66b7..0b41055 100644 --- a/bigscreen/fetch_max_score_for_players.cpp +++ b/bigscreen/fetch_max_score_for_players.cpp @@ -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; diff --git a/sql/ccbs.sql b/sql/ccbs.sql index 4c42d56..d48fbeb 100644 --- a/sql/ccbs.sql +++ b/sql/ccbs.sql @@ -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; + -- 2.39.2