Make system for making groups after the very first round.
authorSteinar H. Gunderson <sesse@samfundet.no>
Wed, 16 Feb 2005 15:15:59 +0000 (15:15 +0000)
committerSteinar H. Gunderson <sesse@samfundet.no>
Wed, 16 Feb 2005 15:15:59 +0000 (15:15 +0000)
html/do-start-round.pl

index 2637076..ea6894e 100755 (executable)
@@ -30,7 +30,35 @@ if ($round == 1) {
        $people = ccbs::db_fetch_all($dbh, 'SELECT * FROM players WHERE player IN ( SELECT player FROM tournamentparticipation WHERE tournament=? ) ORDER BY lower(nick)',
                $tournament);
 } else {
-       die "Fix qualifying later";
+       # First of all, check that there are no null values!
+       my $ref = $dbh->selectrow_hashref('SELECT COUNT(*) AS num_incomplete FROM scores WHERE tournament=? AND round=? AND (song IS NULL OR playmode IS NULL OR difficulty IS NULL OR chosen IS NULL or score IS NULL)', undef, $tournament, $round-1);
+       if ($ref->{'num_incomplete'} != 0) {
+               ccbs::user_error("Det er fortsatt $ref->{'num_incomplete'} sanger igjen i denne runden som ikke har alle data registrert.");
+       }
+
+       # Find out how many people will go on from the _current_ group (ie. the one
+       # before the one we just inserted)
+       my $ref = $dbh->selectrow_hashref('SELECT numqualifying FROM rounds WHERE tournament=? AND round=?',
+               undef, $tournament, $round - 1);
+       my $num_qual_prev = $ref->{'numqualifying'};
+
+       # Get the total list of scores for each player in this round, and pick
+       # out the best N
+       $people = [];
+       my $q = $dbh->prepare('SELECT parallel,player,SUM(score) AS score FROM scores WHERE tournament=? AND round=? GROUP BY parallel,player ORDER BY parallel, SUM(score) DESC');
+       $q->execute($tournament, $round - 1);
+       
+       my ($parallel,$num_from_this_parallel);
+
+       while (my $ref = $q->fetchrow_hashref()) {
+               if (!defined($parallel) || $parallel != $ref->{'parallel'}) {
+                       $parallel = $ref->{'parallel'};
+                       $num_from_this_parallel = 0;
+               }
+               if ($num_from_this_parallel++ < $num_qual_prev) {
+                       push @$people, {%$ref};
+               }
+       }
 }
 
 # Zigzag people to get the most fair groups possible