/** * 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"); }