diff --git a/www/games/results.php b/www/games/results.php index 5d81e87..23cb15c 100644 --- a/www/games/results.php +++ b/www/games/results.php @@ -9,6 +9,87 @@ $stmt->execute([ $title = "Results: " . $stmt->fetch(PDO::FETCH_COLUMN); $description = "View the results of particular issue's voting."; +// use new weights for Winter 2024 and later +// i want to normalise the old and new ranking formulas, but for now +// this will have to do +if (intval($_GET['game']) >= 381): +/** === START new display query === */ +$temp = ""; +$view = + 'CREATE TEMPORARY VIEW round_%2$d AS SELECT + submissions.id AS submission_id, + SUM(score) AS total_score, + COUNT(completed) AS num_scores, + AVG(score) AS average_score + FROM submissions + LEFT JOIN assignments ON submissions.id = assignments.submission_id + WHERE submissions.game_id = %1$d AND round_number = %2$d + GROUP BY submission_id;' . PHP_EOL; + +$temp .= sprintf($view, $_GET["game"], 1); +$temp .= sprintf($view, $_GET["game"], 2); +$temp .= sprintf($view, $_GET["game"], 3); + +$temp .= sprintf( + 'CREATE TEMPORARY VIEW participants AS SELECT + member_id, + COUNT(completed) != COUNT(id) AS disqualified + FROM assignments + WHERE game_id = %d + GROUP BY member_id;', + $_GET["game"] +); + +$db["data"]->exec($temp); + +$stmt = $db["data"]->query( + 'SELECT submissions.id AS id, submissions.hash, members.name, members.handle, + CASE WHEN name_is_public = 1 AND name IS NOT NULL + THEN name + ELSE CONCAT("Member ", submissions.member_id) + END AS author, + CASE WHEN doc_is_public = 1 + THEN title + ELSE CONCAT("Entry ", submissions.id) + END AS title + , + doc_is_public, + name_is_public, + participants.disqualified, + + row_number() OVER(ORDER BY + round_1.average_score DESC, round_1.num_scores DESC) AS rank_round_1, + iif(round_1.average_score, format("%.2f", round_1.average_score), NULL) AS score_round_1, + round_1.num_scores AS round_1_num_scores, + + row_number() OVER(ORDER BY + round_2.average_score DESC, round_2.num_scores DESC, + round_1.average_score DESC, round_1.num_scores DESC) AS rank_round_2, + iif(round_2.average_score, format("%.2f", round_2.average_score), NULL) AS score_round_2, + round_2.num_scores AS round_2_num_scores, + + row_number() OVER(ORDER BY + round_3.average_score DESC, round_3.num_scores DESC, + round_2.average_score DESC, round_2.num_scores DESC, + round_1.average_score DESC, round_1.num_scores DESC) AS rank_round_3, + iif(round_3.average_score, format("%.2f", round_3.average_score), NULL) AS score_round_3, + round_3.num_scores AS round_3_num_scores + FROM submissions + LEFT JOIN members ON submissions.member_id = members.id + JOIN round_1 ON submissions.id = round_1.submission_id + LEFT JOIN round_2 ON submissions.id = round_2.submission_id + LEFT JOIN round_3 ON submissions.id = round_3.submission_id + LEFT JOIN participants ON participants.member_id = submissions.member_id + GROUP BY submissions.id, submissions.member_id + ORDER BY rank_round_3;', + PDO::FETCH_OBJ +); + +/** === END new display query === */ + +else: + +/** === START old display query === */ $stmt = $db["data"] ->prepare('SELECT submissions.id AS id, submissions.hash, members.name, members.handle, CASE WHEN name_is_public = 1 AND name IS NOT NULL @@ -18,15 +99,32 @@ $stmt = $db["data"] CASE WHEN doc_is_public = 1 THEN title ELSE CONCAT("Entry ", submissions.id) - END AS title - , doc_is_public, name_is_public, score_round_1, rank_round_1, score_round_2, rank_round_2, score_round_3, rank_round_3, rank_final, votes_round_1, votes_round_2, votes_round_3, num_assignments_round_1, num_assignments_round_2, num_assignments_round_3 + END AS title, + doc_is_public, + name_is_public, + score_round_1, + rank_round_1, + score_round_2, + rank_round_2, + score_round_3, + rank_round_3, + rank_final, + votes_round_1, + votes_round_2, + votes_round_3, + num_assignments_round_1, + num_assignments_round_2, + num_assignments_round_3 FROM submissions JOIN members ON submissions.member_id = members.id WHERE submissions.game_id = :id AND rank_final IS NOT NULL AND submissions.transaction_id IS NOT NULL ORDER BY rank_final ASC'); -$results = $stmt->execute([ +$stmt->execute([ "id" => $_GET["game"], ]); +/** === END old display query === */ +endif; + $row = $stmt->fetch(); if (!$row) { @@ -38,103 +136,95 @@ include "partials/head.php"; ?> -
-
-

-
- - -
- - - - - - - - - - - - - - - - - - - - - > - - - - - - - - +
+
+

+
+ + +
+
Results for Game
TitleAuthorScoreRank
Round OneRound TwoRound ThreeRound OneRound TwoRound Three
- $doc_title" - : $doc_title ?> - (disqualified) - $author" - : $author ?>>>>
+ + + + + + + - fetch()); ?> - - - -
Results for Game
TitleAuthorScoreRank
-
- -

- -
+ + Round One + Round Two + Round Three + Round One + Round Two + Round Three + + + + doc_is_public || IS_ADMIN; + $doc_title = htmlspecialchars( + $row->title, + ENT_QUOTES + ); + $doc_url = sprintf("/docs/%s", $row->hash); + $author = htmlspecialchars($row->author, ENT_QUOTES); + $profile_url = "/members/" . $row->handle; + + $is_disqualified = $row->disqualified ?? + ($row->rank_round_1 && + $row->num_assignments_round_1 && + !$row->votes_round_1) || + ($row->rank_round_2 && + $row->num_assignments_round_2 && + !$row->votes_round_2) || + ($row->rank_round_3 && + $row->num_assignments_round_3 && + !$row->votes_round_3) + ? true + : false; + ?> + > + + $doc_title" + : $doc_title ?> + (disqualified) + + name_is_public + ? "$author" + : $author ?> + score_round_1) + ? 'class="empty"' + : "" ?>>score_round_1) + ? 0 + : $row->score_round_1 ?> + score_round_2) + ? 'class="empty"' + : "" ?>>score_round_2) + ? 0 + : $row->score_round_2 ?> + score_round_3) + ? 'class="empty"' + : "" ?>>score_round_3) + ? 0 + : $row->score_round_3 ?> + rank_round_1 ?> + rank_round_2 ?> + rank_round_3 ?> + + fetch(PDO::FETCH_OBJ)); ?> + + + + + + +

+ +