From 46220dbd2a781a6df0b7e96d9dc38a0268caea11 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Thu, 22 Oct 2020 15:14:11 +0200 Subject: [statistics_reporting] Add exam statistics --- .../statistics_reporting/inc/queries.inc.php | 35 +++++++++++++++++++--- .../statistics_reporting/inc/remotereport.inc.php | 3 +- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/modules-available/statistics_reporting/inc/queries.inc.php b/modules-available/statistics_reporting/inc/queries.inc.php index c77f0ed8..f389cfb1 100644 --- a/modules-available/statistics_reporting/inc/queries.inc.php +++ b/modules-available/statistics_reporting/inc/queries.inc.php @@ -345,12 +345,12 @@ class Queries return $res; } - public static function getDozmodStats($from, $to) + public static function getDozmodStats(int $from, int $to) { - if (!Module::isAvailable('dozmod')) - return array('disabled' => true); + if (Module::get('dozmod') === false) + return ['disabled' => true]; - $return = array(); + $return = []; $return['vms'] = Database::queryFirst("SELECT Count(*) AS `total`, Sum(If(createtime >= $from, 1, 0)) AS `new`, Sum(If(updatetime >= $from, 1, 0)) AS `updated`, Sum(If(latestversionid IS NOT NULL, 1, 0)) AS `valid` FROM sat.imagebase @@ -366,6 +366,33 @@ class Queries return $return; } + public static function getExamStats(int $from, int $to) + { + if (Module::get('exams') === false) + return ['disabled' => true]; + $return = []; + $eres = Database::simpleQuery("SELECT starttime, endtime, GROUP_CONCAT(exl.locationid) AS `locs` FROM exams + LEFT JOIN exams_x_location exl USING (examid) + WHERE starttime < $to AND endtime > $from"); + while ($row = $eres->fetch(PDO::FETCH_ASSOC)) { + // Get all boot events + $data = ['from' => $row['starttime'], 'to' => $row['endtime']]; + if (empty($row['locs'])) { + $exam = Database::queryFirst("SELECT Count(*) AS `event`, Avg(s.data) AS length FROM statistic s + WHERE typeid = '~session-length' + AND dateline BETWEEN :from AND :to", $data); + } else { + $data['locs'] = explode(',', $row['locs']); + $exam = Database::queryFirst("SELECT Count(*) AS `event`, Avg(s.data) AS length FROM statistic s + INNER JOIN machine m USING (machineuuid) + WHERE typeid = '~session-length' AND m.locationid IN (:locs) + AND dateline BETWEEN :from AND :to", $data); + } + $return[] = $exam; + } + return $return; + } + public static function getAggregatedMachineStats($from) { $return = array(); diff --git a/modules-available/statistics_reporting/inc/remotereport.inc.php b/modules-available/statistics_reporting/inc/remotereport.inc.php index f8f54a86..2de49d04 100644 --- a/modules-available/statistics_reporting/inc/remotereport.inc.php +++ b/modules-available/statistics_reporting/inc/remotereport.inc.php @@ -68,7 +68,7 @@ class RemoteReport * @param int[] $days list of days to generate aggregated stats for * @return array wrapped up statistics, ready for reporting */ - public static function generateReport($to, $days = false) { + public static function generateReport(int $to, $days = false) { if ($days === false) { $days = [7, 30, 90]; } @@ -89,6 +89,7 @@ class RemoteReport $data['tsTo'] = $to; $data['dozmod'] = Queries::getDozmodStats($from, $to); $data['machines'] = Queries::getAggregatedMachineStats($from); + $data['exams'] = Queries::getExamStats($from, $to); $result['days' . $day] = $data; } $result['server'] = self::getLocalHardware(); -- cgit v1.2.3-55-g7522