예제 #1
0
 /**
  * Stats of a problem
  *
  * @param Request $r
  * @return array
  * @throws InvalidDatabaseOperationException
  * @throws ForbiddenAccessException
  */
 public static function apiStats(Request $r)
 {
     // Get user
     self::authenticateRequest($r);
     self::validateStats($r);
     try {
         // Array of GUIDs of pending runs
         $pendingRunsGuids = RunsDAO::GetPendingRunsOfContest($r["contest"]->getContestId());
         // Count of pending runs (int)
         $totalRunsCount = RunsDAO::CountTotalRunsOfContest($r["contest"]->getContestId());
         // Wait time
         $waitTimeArray = RunsDAO::GetLargestWaitTimeOfContest($r["contest"]->getContestId());
         // List of verdicts
         $verdict_counts = array();
         foreach (self::$verdicts as $verdict) {
             $verdict_counts[$verdict] = RunsDAO::CountTotalRunsOfContestByVerdict($r["contest"]->getContestId(), $verdict);
         }
         // Get max points posible for contest
         $key = new ContestProblems(array("contest_id" => $r["contest"]->getContestId()));
         $contestProblems = ContestProblemsDAO::search($key);
         $totalPoints = 0;
         foreach ($contestProblems as $cP) {
             $totalPoints += $cP->getPoints();
         }
         // Get scoreboard to calculate distribution
         $distribution = array();
         for ($i = 0; $i < 101; $i++) {
             $distribution[$i] = 0;
         }
         $sizeOfBucket = $totalPoints / 100;
         $scoreboardResponse = self::apiScoreboard($r);
         foreach ($scoreboardResponse["ranking"] as $results) {
             $distribution[(int) ($results["total"]["points"] / $sizeOfBucket)]++;
         }
     } catch (Exception $e) {
         // Operation failed in the data layer
         throw new InvalidDatabaseOperationException($e);
     }
     // Para darle gusto al Alanboy, regresando array
     return array("total_runs" => $totalRunsCount, "pending_runs" => $pendingRunsGuids, "max_wait_time" => is_null($waitTimeArray) ? 0 : $waitTimeArray[1], "max_wait_time_guid" => is_null($waitTimeArray) ? 0 : $waitTimeArray[0]->getGuid(), "verdict_counts" => $verdict_counts, "distribution" => $distribution, "size_of_bucket" => $sizeOfBucket, "total_points" => $totalPoints, "status" => "ok");
 }