mirrored from git://git.moodle.org/moodle.git
-
Notifications
You must be signed in to change notification settings - Fork 6.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
MDL-65588 analytics: New models for student accesses
- Loading branch information
David Monllaó
committed
Sep 20, 2019
1 parent
7d8ed90
commit 2d9280e
Showing
21 changed files
with
1,079 additions
and
89 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,111 @@ | ||
<?php | ||
// This file is part of Moodle - http://moodle.org/ | ||
// | ||
// Moodle is free software: you can redistribute it and/or modify | ||
// it under the terms of the GNU General Public License as published by | ||
// the Free Software Foundation, either version 3 of the License, or | ||
// (at your option) any later version. | ||
// | ||
// Moodle is distributed in the hope that it will be useful, | ||
// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
// GNU General Public License for more details. | ||
// | ||
// You should have received a copy of the GNU General Public License | ||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>. | ||
|
||
/** | ||
* Time splitting method that generates predictions X days/weeks/months after the analysable start. | ||
* | ||
* @package core_analytics | ||
* @copyright 2019 David Monllao {@link http://www.davidmonllao.com} | ||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later | ||
*/ | ||
|
||
namespace core_analytics\local\time_splitting; | ||
|
||
defined('MOODLE_INTERNAL') || die(); | ||
|
||
/** | ||
* Time splitting method that generates predictions X days/weeks/months after the analysable start. | ||
* | ||
* @package core_analytics | ||
* @copyright 2019 David Monllao {@link http://www.davidmonllao.com} | ||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later | ||
*/ | ||
abstract class after_start extends \core_analytics\local\time_splitting\base implements before_now { | ||
|
||
/** | ||
* The period we should wait until we generate predictions for this. | ||
* | ||
* @param \core_analytics\analysable $analysable | ||
* @return \DateInterval | ||
*/ | ||
abstract protected function wait_period(\core_analytics\analysable $analysable); | ||
|
||
/** | ||
* Returns whether the course can be processed by this time splitting method or not. | ||
* | ||
* @param \core_analytics\analysable $analysable | ||
* @return bool | ||
*/ | ||
public function is_valid_analysable(\core_analytics\analysable $analysable) { | ||
|
||
if (!$analysable->get_start()) { | ||
return false; | ||
} | ||
|
||
$predictionstart = $this->get_prediction_interval_start($analysable); | ||
if ($analysable->get_start() > $predictionstart) { | ||
// We still need to wait. | ||
return false; | ||
} | ||
|
||
return true; | ||
} | ||
|
||
/** | ||
* This time-splitting method returns one single range, the start to two days before the end. | ||
* | ||
* @return array The list of ranges, each of them including 'start', 'end' and 'time' | ||
*/ | ||
protected function define_ranges() { | ||
|
||
$now = time(); | ||
$ranges = [ | ||
[ | ||
'start' => $this->analysable->get_start(), | ||
'end' => $now, | ||
'time' => $now, | ||
] | ||
]; | ||
|
||
return $ranges; | ||
} | ||
|
||
/** | ||
* Whether to cache or not the indicator calculations. | ||
* | ||
* @return bool | ||
*/ | ||
public function cache_indicator_calculations(): bool { | ||
return false; | ||
} | ||
|
||
/** | ||
* Calculates the interval start time backwards, from now. | ||
* | ||
* @param \core_analytics\analysable $analysable | ||
* @return int | ||
*/ | ||
protected function get_prediction_interval_start(\core_analytics\analysable $analysable) { | ||
|
||
// The prediction time is always time(). We don't want to reuse the firstanalysis time | ||
// because otherwise samples (e.g. students) which start after the analysable (e.g. course) | ||
// start would use an incorrect analysis interval. | ||
$predictionstart = new \DateTime('now'); | ||
$predictionstart->sub($this->wait_period($analysable)); | ||
|
||
return $predictionstart->getTimestamp(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,97 @@ | ||
<?php | ||
// This file is part of Moodle - http://moodle.org/ | ||
// | ||
// Moodle is free software: you can redistribute it and/or modify | ||
// it under the terms of the GNU General Public License as published by | ||
// the Free Software Foundation, either version 3 of the License, or | ||
// (at your option) any later version. | ||
// | ||
// Moodle is distributed in the hope that it will be useful, | ||
// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
// GNU General Public License for more details. | ||
// | ||
// You should have received a copy of the GNU General Public License | ||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>. | ||
|
||
/** | ||
* Time splitting method that generates predictions regularly. | ||
* | ||
* @package core_analytics | ||
* @copyright 2019 David Monllao {@link http://www.davidmonllao.com} | ||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later | ||
*/ | ||
|
||
namespace core_analytics\local\time_splitting; | ||
|
||
defined('MOODLE_INTERNAL') || die(); | ||
|
||
/** | ||
* Time splitting method that generates predictions periodically. | ||
* | ||
* @package core_analytics | ||
* @copyright 2019 David Monllao {@link http://www.davidmonllao.com} | ||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later | ||
*/ | ||
abstract class past_periodic extends periodic implements before_now { | ||
|
||
/** | ||
* Gets the next range with start on the provided time. | ||
* | ||
* The next range is based on the past period so we substract this | ||
* range's periodicity from $time. | ||
* | ||
* @param \DateTimeImmutable $time | ||
* @return array | ||
*/ | ||
protected function get_next_range(\DateTimeImmutable $time) { | ||
|
||
$end = $time->getTimestamp(); | ||
$start = $time->sub($this->periodicity())->getTimestamp(); | ||
|
||
if ($start < $this->analysable->get_start()) { | ||
// We skip the first range generated as its start is prior to the analysable start. | ||
return false; | ||
} | ||
|
||
return [ | ||
'start' => $start, | ||
'end' => $end, | ||
'time' => $end | ||
]; | ||
} | ||
|
||
/** | ||
* Get the start of the first time range. | ||
* | ||
* @return int A timestamp. | ||
*/ | ||
protected function get_first_start() { | ||
return $this->analysable->get_start(); | ||
} | ||
|
||
/** | ||
* Guarantees that the last range dates end right now. | ||
* | ||
* @param array $ranges | ||
* @return array | ||
*/ | ||
protected function update_last_range(array $ranges) { | ||
$lastrange = end($ranges); | ||
|
||
if ($lastrange['time'] > time()) { | ||
// We just need to wait in this case. | ||
return $lastrange; | ||
} | ||
|
||
$timetoenddiff = time() - $lastrange['time']; | ||
|
||
$ranges[count($ranges) - 1] = [ | ||
'start' => $lastrange['start'] + $timetoenddiff, | ||
'end' => $lastrange['end'] + $timetoenddiff, | ||
'time' => $lastrange['time'] + $timetoenddiff, | ||
]; | ||
|
||
return $ranges; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.