diff --git a/analytics/classes/local/time_splitting/accumulative_parts.php b/analytics/classes/local/time_splitting/accumulative_parts.php new file mode 100644 index 00000000000..f1b06b37cd6 --- /dev/null +++ b/analytics/classes/local/time_splitting/accumulative_parts.php @@ -0,0 +1,72 @@ +. + +/** + * Range processor splitting the course in parts and accumulating data from the start. + * + * @package core_analytics + * @copyright 2017 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(); + +/** + * Range processor splitting the course in parts and accumulating data from the start. + * + * @package core_analytics + * @copyright 2017 David Monllao {@link http://www.davidmonllao.com} + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +abstract class accumulative_parts extends base { + + /** + * The number of parts to split the analysable duration in. + * + * @return int + */ + abstract protected function get_number_parts(); + + /** + * define_ranges + * + * @return array + */ + protected function define_ranges() { + + $nparts = $this->get_number_parts(); + + $rangeduration = intval(floor(($this->analysable->get_end() - $this->analysable->get_start()) / $nparts)); + + $ranges = array(); + for ($i = 0; $i < $nparts; $i++) { + $end = $this->analysable->get_start() + ($rangeduration * ($i + 1)); + if ($i === ($nparts - 1)) { + // Better to use the end for the last one as we are using floor above. + $end = $this->analysable->get_end(); + } + $ranges[$i] = array( + 'start' => $this->analysable->get_start(), + 'end' => $end, + 'time' => $end + ); + } + + return $ranges; + } +} diff --git a/analytics/classes/local/time_splitting/deciles.php b/analytics/classes/local/time_splitting/deciles.php index dbfca557c29..2bbd3300834 100644 --- a/analytics/classes/local/time_splitting/deciles.php +++ b/analytics/classes/local/time_splitting/deciles.php @@ -33,7 +33,7 @@ defined('MOODLE_INTERNAL') || die(); * @copyright 2017 David Monllao {@link http://www.davidmonllao.com} * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ -class deciles extends base { +class deciles extends equal_parts { /** * get_name @@ -45,27 +45,11 @@ class deciles extends base { } /** - * define_ranges + * 10 parts. * - * @return array + * @return int */ - protected function define_ranges() { - $rangeduration = floor(($this->analysable->get_end() - $this->analysable->get_start()) / 10); - - $ranges = array(); - for ($i = 0; $i < 10; $i++) { - $start = $this->analysable->get_start() + ($rangeduration * $i); - $end = $this->analysable->get_start() + ($rangeduration * ($i + 1)); - if ($i === 9) { - $end = $this->analysable->get_end(); - } - $ranges[] = array( - 'start' => $start, - 'end' => $end, - 'time' => $end - ); - } - - return $ranges; + protected function get_number_parts() { + return 10; } } diff --git a/analytics/classes/local/time_splitting/deciles_accum.php b/analytics/classes/local/time_splitting/deciles_accum.php index 486be855334..0f7e706743a 100644 --- a/analytics/classes/local/time_splitting/deciles_accum.php +++ b/analytics/classes/local/time_splitting/deciles_accum.php @@ -33,7 +33,7 @@ defined('MOODLE_INTERNAL') || die(); * @copyright 2017 David Monllao {@link http://www.davidmonllao.com} * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ -class deciles_accum extends base { +class deciles_accum extends accumulative_parts { /** * get_name @@ -45,26 +45,11 @@ class deciles_accum extends base { } /** - * define_ranges + * 10 parts. * - * @return array + * @return int */ - protected function define_ranges() { - $rangeduration = floor(($this->analysable->get_end() - $this->analysable->get_start()) / 10); - - $ranges = array(); - for ($i = 0; $i < 10; $i++) { - $end = $this->analysable->get_start() + ($rangeduration * ($i + 1)); - if ($i === 9) { - $end = $this->analysable->get_end(); - } - $ranges[] = array( - 'start' => $this->analysable->get_start(), - 'end' => $end, - 'time' => $end - ); - } - - return $ranges; + protected function get_number_parts() { + return 10; } } diff --git a/analytics/classes/local/time_splitting/equal_parts.php b/analytics/classes/local/time_splitting/equal_parts.php new file mode 100644 index 00000000000..090e693fe35 --- /dev/null +++ b/analytics/classes/local/time_splitting/equal_parts.php @@ -0,0 +1,80 @@ +. + +/** + * X parts time splitting method. + * + * @package core_analytics + * @copyright 2017 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(); + +/** + * X parts time splitting method. + * + * @package core_analytics + * @copyright 2017 David Monllao {@link http://www.davidmonllao.com} + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +abstract class equal_parts extends base { + + /** + * Returns the number of parts the analyser duration should be split in. + * + * @return int + */ + abstract protected function get_number_parts(); + + /** + * Splits the analysable duration in X equal parts from the start to the end. + * + * @return array + */ + protected function define_ranges() { + + $nparts = $this->get_number_parts(); + + $rangeduration = intval(floor(($this->analysable->get_end() - $this->analysable->get_start()) / $nparts)); + + $ranges = array(); + for ($i = 0; $i < $nparts; $i++) { + $start = $this->analysable->get_start() + ($rangeduration * $i); + $end = $this->analysable->get_start() + ($rangeduration * ($i + 1)); + + // Check the end of the previous time range. + if ($i > 0 && $start === $ranges[$i - 1]['end']) { + // We deduct 1 second from the previous end so each timestamp only belongs to 1 range. + $ranges[$i - 1]['end'] = $ranges[$i - 1]['end'] - 1; + } + + if ($i === ($nparts - 1)) { + // Better to use the end for the last one as we are using floor above. + $end = $this->analysable->get_end(); + } + $ranges[$i] = array( + 'start' => $start, + 'end' => $end, + 'time' => $end + ); + } + + return $ranges; + } +} diff --git a/analytics/classes/local/time_splitting/quarters.php b/analytics/classes/local/time_splitting/quarters.php index 4ad1b5f3681..3a8340bebdd 100644 --- a/analytics/classes/local/time_splitting/quarters.php +++ b/analytics/classes/local/time_splitting/quarters.php @@ -15,7 +15,7 @@ // along with Moodle. If not, see . /** - * 4 quarters time splitting method. + * Quarters time splitting method. * * @package core_analytics * @copyright 2016 David Monllao {@link http://www.davidmonllao.com} @@ -27,13 +27,13 @@ namespace core_analytics\local\time_splitting; defined('MOODLE_INTERNAL') || die(); /** - * 4 quarters time splitting method. + * Quarters time splitting method. * * @package core_analytics * @copyright 2016 David Monllao {@link http://www.davidmonllao.com} * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ -class quarters extends base { +class quarters extends equal_parts { /** * get_name @@ -45,30 +45,11 @@ class quarters extends base { } /** - * define_ranges + * 4 parts * - * @return array + * @return int */ - protected function define_ranges() { - $duration = floor(($this->analysable->get_end() - $this->analysable->get_start()) / 4); - return [ - [ - 'start' => $this->analysable->get_start(), - 'end' => $this->analysable->get_start() + $duration, - 'time' => $this->analysable->get_start() + $duration - ], [ - 'start' => $this->analysable->get_start() + $duration, - 'end' => $this->analysable->get_start() + ($duration * 2), - 'time' => $this->analysable->get_start() + ($duration * 2) - ], [ - 'start' => $this->analysable->get_start() + ($duration * 2), - 'end' => $this->analysable->get_start() + ($duration * 3), - 'time' => $this->analysable->get_start() + ($duration * 3) - ], [ - 'start' => $this->analysable->get_start() + ($duration * 3), - 'end' => $this->analysable->get_end(), - 'time' => $this->analysable->get_end() - ] - ]; + protected function get_number_parts() { + return 4; } } diff --git a/analytics/classes/local/time_splitting/quarters_accum.php b/analytics/classes/local/time_splitting/quarters_accum.php index 6b7e0fc692b..d8fb0d9c405 100644 --- a/analytics/classes/local/time_splitting/quarters_accum.php +++ b/analytics/classes/local/time_splitting/quarters_accum.php @@ -33,7 +33,7 @@ defined('MOODLE_INTERNAL') || die(); * @copyright 2016 David Monllao {@link http://www.davidmonllao.com} * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ -class quarters_accum extends base { +class quarters_accum extends accumulative_parts { /** * get_name @@ -45,30 +45,11 @@ class quarters_accum extends base { } /** - * define_ranges + * 4 parts. * - * @return array + * @return int */ - protected function define_ranges() { - $duration = floor(($this->analysable->get_end() - $this->analysable->get_start()) / 4); - return [ - [ - 'start' => $this->analysable->get_start(), - 'end' => $this->analysable->get_start() + $duration, - 'time' => $this->analysable->get_start() + $duration - ], [ - 'start' => $this->analysable->get_start(), - 'end' => $this->analysable->get_start() + ($duration * 2), - 'time' => $this->analysable->get_start() + ($duration * 2) - ], [ - 'start' => $this->analysable->get_start(), - 'end' => $this->analysable->get_start() + ($duration * 3), - 'time' => $this->analysable->get_start() + ($duration * 3) - ], [ - 'start' => $this->analysable->get_start(), - 'end' => $this->analysable->get_end(), - 'time' => $this->analysable->get_end() - ] - ]; + protected function get_number_parts() { + return 4; } }