]> git.sesse.net Git - ccbs/blobdiff - html/do-finish-tournament.pl
Pull in changes from --baby.
[ccbs] / html / do-finish-tournament.pl
index 012ccb95b7470596c210a61ffe82cb1d68deef2b..bea25b424f544cb13436759832f6c94e1a86da26 100755 (executable)
@@ -16,82 +16,18 @@ my %already_ordered = ();
 my $ranking = 1;
 my $points = 100;
 
-# Find all last rounds with only one group per round
-my $srounds = ccbs::db_fetch_all($dbh, 'SELECT round FROM groups WHERE tournament=? GROUP BY round HAVING COUNT(*) = 1 ORDER BY round DESC', $tournament);
-
-my $last_sround;
-for my $sr (@$srounds) {
-       # only accept strict ordering
-       last if (defined($last_sround) && $sr->{'round'} != $last_sround - 1);
-       $last_sround = $sr->{'round'};
-
-       # Grab the highscore list from this round
-       my $scores = ccbs::db_fetch_all($dbh, 'SELECT player,SUM(score) AS score FROM scores WHERE tournament=? AND round=? GROUP BY parallel,player ORDER BY SUM(score) DESC',
-               $tournament, $sr->{'round'});
-       for my $s (@$scores) {
-               next if ($already_ordered{$s->{'player'}});
-               $dbh->do('INSERT INTO tournamentrankings (tournament, ranking, player, points) VALUES (?,?,?,?)',
-                       undef, $tournament, $ranking, $s->{'player'}, points_for_place($ranking));
-               $ranking++;
-               $already_ordered{$s->{'player'}} = 1;
-       }
-}
-
-# This should never happen
-if (!defined($last_sround)) {
-       ccbs::user_error("Forsøk på å avslutte en turnering med flere grupper aktive.");
-}
-
-# Grab all the remaining groups; we order by the simple criteria:
+# Grab all the groups; we order by the simple criteria:
 # 1. If player A has gone to group X and player B hasn't, player A is higher.
-# 2. If player A has a higher ranking in his/her group than player B, player A is higher.
-# 3. If player A has higher max score than player B, player A is higher.
-
-# Basically, #2 makes this impossible to achieve in pure SQL. We just have
-# to fetch one and one group and make the best out of it. Fetch out all the
-# parallels (in sorted order) and grab all players in turn.
-
-my $qscores = $dbh->prepare('SELECT parallel,player,SUM(score) AS sum_score,MAX(score) AS max_score FROM scores WHERE tournament=? AND round=? GROUP BY parallel,player ORDER BY SUM(score) DESC');
-for my $r (reverse (1..($last_sround-1))) {
-       my @parallels = ();
-       my $num_players = 0;
-       
-       $qscores->execute($tournament, $r);
-
-       while (my $ref = $qscores->fetchrow_hashref()) {
-               my $p = $ref->{'parallel'};
-               if (!defined($parallels[$p])) {
-                       $parallels[$p] = [];
-               }
-
-               push @{$parallels[$p]}, {%$ref};
-               $num_players++;
-       }
-
-       my $place = 0;
-
-       # Grab players from the top until nobody's left
-       while ($num_players > 0) {
-               my @players_this_place = ();
-               for my $p (@parallels) {
-                       next if (!defined($p->[$place]));
-                       $num_players--;
-                       next if ($already_ordered{$p->[$place]->{'player'}});
-
-                       push @players_this_place, $p->[$place];
-               }
-
-               @players_this_place = sort { $b->{'max_score'} <=> $a->{'max_score'} } @players_this_place;
-
-               for my $s (@players_this_place) {
-                       $dbh->do('INSERT INTO tournamentrankings (tournament, ranking, player, points) VALUES (?,?,?,?)',
-                               undef, $tournament, $ranking, $s->{'player'}, points_for_place($ranking));
-                       $ranking++;
-                       $already_ordered{$s->{'player'}} = 1;
-               }
-
-               $place++;
-       }
+# 2. If player A has a higher (max sum of songs)/(max feet of songs) (where
+#    any chosen song counts for 10) than B, player A is higher.
+my $scores = ccbs::db_fetch_all($dbh, 'SELECT player FROM scores NATURAL JOIN tournaments NATURAL JOIN max_single_feetrating WHERE tournament=? GROUP BY round,player ORDER BY round DESC,SUM(score)/SUM(CASE WHEN chosen THEN 10 ELSE feetrating END) DESC',
+       $tournament);
+for my $s (@$scores) {
+       next if ($already_ordered{$s->{'player'}});
+       $dbh->do('INSERT INTO tournamentrankings (tournament, ranking, player, points) VALUES (?,?,?,?)',
+                       undef, $tournament, $ranking, $s->{'player'}, points_for_place($ranking));
+       $ranking++;
+       $already_ordered{$s->{'player'}} = 1;
 }
 
 $dbh->commit;