diff --git a/analytics/classes/local/analyser/base.php b/analytics/classes/local/analyser/base.php index ab2f52ea796..63c75b5a788 100644 --- a/analytics/classes/local/analyser/base.php +++ b/analytics/classes/local/analyser/base.php @@ -112,6 +112,16 @@ abstract class base { $this->log = array(); } + /** + * Returns the list of analysable elements available on the site. + * + * \core_analytics\local\analyser\by_course and \core_analytics\local\analyser\sitewide are implementing + * this method returning site courses (by_course) and the whole system (sitewide) as analysables. + * + * @return \core_analytics\analysable[] + */ + abstract public function get_analysables(); + /** * This function returns this analysable list of samples. * @@ -141,7 +151,7 @@ abstract class base { * * @return string */ - abstract protected function get_samples_origin(); + abstract public function get_samples_origin(); /** * Returns the context of a sample. @@ -166,15 +176,29 @@ abstract class base { /** * Main analyser method which processes the site analysables. * - * \core_analytics\local\analyser\by_course and \core_analytics\local\analyser\sitewide are implementing - * this method returning site courses (by_course) and the whole system (sitewide) as analysables. - * In most of the cases you should have enough extending from one of these classes so you don't need - * to reimplement this method. - * * @param bool $includetarget * @return \stored_file[] */ - abstract public function get_analysable_data($includetarget); + public function get_analysable_data($includetarget) { + + $filesbytimesplitting = array(); + + $analysables = $this->get_analysables(); + foreach ($analysables as $analysable) { + + $files = $this->process_analysable($analysable, $includetarget); + + // Later we will need to aggregate data by time splitting method. + foreach ($files as $timesplittingid => $file) { + $filesbytimesplitting[$timesplittingid][$analysable->get_id()] = $file; + } + } + + // We join the datasets by time splitting method. + $timesplittingfiles = $this->merge_analysable_files($filesbytimesplitting, $includetarget); + + return $timesplittingfiles; + } /** * Samples data this analyser provides. @@ -220,6 +244,36 @@ abstract class base { } } + /** + * Merges analysable dataset files into 1. + * + * @param array $filesbytimesplitting + * @param bool $includetarget + * @return \stored_file[] + */ + protected function merge_analysable_files($filesbytimesplitting, $includetarget) { + + $timesplittingfiles = array(); + foreach ($filesbytimesplitting as $timesplittingid => $files) { + + if ($this->options['evaluation'] === true) { + // Delete the previous copy. Only when evaluating. + \core_analytics\dataset_manager::delete_previous_evaluation_file($this->modelid, $timesplittingid); + } + + // Merge all course files into one. + if ($includetarget) { + $filearea = \core_analytics\dataset_manager::LABELLED_FILEAREA; + } else { + $filearea = \core_analytics\dataset_manager::UNLABELLED_FILEAREA; + } + $timesplittingfiles[$timesplittingid] = \core_analytics\dataset_manager::merge_datasets($files, + $this->modelid, $timesplittingid, $filearea, $this->options['evaluation']); + } + + return $timesplittingfiles; + } + /** * Checks that this analyser satisfies the provided indicator requirements. * diff --git a/analytics/classes/local/analyser/by_course.php b/analytics/classes/local/analyser/by_course.php index e531bba4d93..8e5b266a1db 100644 --- a/analytics/classes/local/analyser/by_course.php +++ b/analytics/classes/local/analyser/by_course.php @@ -40,14 +40,14 @@ abstract class by_course extends base { * * @return \core_analytics\course[] */ - public function get_courses() { + public function get_analysables() { // Default to all system courses. if (!empty($this->options['filter'])) { $courses = $this->options['filter']; } else { // Iterate through all potentially valid courses. - $courses = get_courses(); + $courses = get_courses('all', 'c.sortorder ASC'); } unset($courses[SITEID]); @@ -55,7 +55,7 @@ abstract class by_course extends base { foreach ($courses as $course) { // Skip the frontpage course. $analysable = \core_analytics\course::instance($course); - $analysables[$analysable->get_id()] = $analysable; + $analysables[] = $analysable; } if (empty($analysables)) { @@ -64,62 +64,4 @@ abstract class by_course extends base { return $analysables; } - - /** - * Returns the analysed data - * - * @param bool $includetarget - * @return \stored_file[] - */ - public function get_analysable_data($includetarget) { - - $filesbytimesplitting = array(); - - // This class and all children will iterate through a list of courses (\core_analytics\course). - $analysables = $this->get_courses('all', 'c.sortorder ASC'); - foreach ($analysables as $analysableid => $analysable) { - - $files = $this->process_analysable($analysable, $includetarget); - - // Later we will need to aggregate data by time splitting method. - foreach ($files as $timesplittingid => $file) { - $filesbytimesplitting[$timesplittingid][$analysableid] = $file; - } - } - - // We join the datasets by time splitting method. - $timesplittingfiles = $this->merge_analysable_files($filesbytimesplitting, $includetarget); - - return $timesplittingfiles; - } - - /** - * Merges analysable dataset files into 1. - * - * @param array $filesbytimesplitting - * @param bool $includetarget - * @return \stored_file[] - */ - protected function merge_analysable_files($filesbytimesplitting, $includetarget) { - - $timesplittingfiles = array(); - foreach ($filesbytimesplitting as $timesplittingid => $files) { - - if ($this->options['evaluation'] === true) { - // Delete the previous copy. Only when evaluating. - \core_analytics\dataset_manager::delete_previous_evaluation_file($this->modelid, $timesplittingid); - } - - // Merge all course files into one. - if ($includetarget) { - $filearea = \core_analytics\dataset_manager::LABELLED_FILEAREA; - } else { - $filearea = \core_analytics\dataset_manager::UNLABELLED_FILEAREA; - } - $timesplittingfiles[$timesplittingid] = \core_analytics\dataset_manager::merge_datasets($files, - $this->modelid, $timesplittingid, $filearea, $this->options['evaluation']); - } - - return $timesplittingfiles; - } } diff --git a/analytics/classes/local/analyser/sitewide.php b/analytics/classes/local/analyser/sitewide.php index 9c6fb47eea0..2a21359141f 100644 --- a/analytics/classes/local/analyser/sitewide.php +++ b/analytics/classes/local/analyser/sitewide.php @@ -36,36 +36,12 @@ defined('MOODLE_INTERNAL') || die(); abstract class sitewide extends base { /** - * Returns the analysable data. + * Returns one single analysable element, the site. * - * @param bool $includetarget - * @return \stored_file[] One file for each time splitting method. + * @return \core_analytics\analysable[] */ - public function get_analysable_data($includetarget) { - - // Here there is a single analysable and it is the system. + public function get_analysables() { $analysable = new \core_analytics\site(); - - $files = $this->process_analysable($analysable, $includetarget); - - // Copy to range files as there is just one analysable. - foreach ($files as $timesplittingid => $file) { - - if ($this->options['evaluation'] === true) { - // Delete the previous copy. Only when evaluating. - \core_analytics\dataset_manager::delete_previous_evaluation_file($this->modelid, $timesplittingid); - } - - // We use merge but it is just a copy. - if ($includetarget) { - $filearea = \core_analytics\dataset_manager::LABELLED_FILEAREA; - } else { - $filearea = \core_analytics\dataset_manager::UNLABELLED_FILEAREA; - } - $files[$timesplittingid] = \core_analytics\dataset_manager::merge_datasets(array($file), $this->modelid, - $timesplittingid, $filearea, $this->options['evaluation']); - } - - return $files; + return array($analysable); } } diff --git a/analytics/classes/model.php b/analytics/classes/model.php index dbee08afb29..fc7f43d1af0 100644 --- a/analytics/classes/model.php +++ b/analytics/classes/model.php @@ -247,15 +247,15 @@ class model { /** * Returns the model analyser (defined by the model target). * + * @param array $options Default initialisation with no options. * @return \core_analytics\local\analyser\base */ - public function get_analyser() { + public function get_analyser($options = array()) { if ($this->analyser !== null) { return $this->analyser; } - // Default initialisation with no options. - $this->init_analyser(); + $this->init_analyser($options); return $this->analyser; } @@ -276,26 +276,29 @@ class model { throw new \moodle_exception('errornotarget', 'analytics'); } - if (!empty($options['evaluation'])) { - // The evaluation process will run using all available time splitting methods unless one is specified. - if (!empty($options['timesplitting'])) { - $timesplitting = \core_analytics\manager::get_time_splitting($options['timesplitting']); - $timesplittings = array($timesplitting->get_id() => $timesplitting); + $timesplittings = array(); + if (empty($options['notimesplitting'])) { + if (!empty($options['evaluation'])) { + // The evaluation process will run using all available time splitting methods unless one is specified. + if (!empty($options['timesplitting'])) { + $timesplitting = \core_analytics\manager::get_time_splitting($options['timesplitting']); + $timesplittings = array($timesplitting->get_id() => $timesplitting); + } else { + $timesplittings = \core_analytics\manager::get_enabled_time_splitting_methods(); + } } else { - $timesplittings = \core_analytics\manager::get_enabled_time_splitting_methods(); - } - } else { - if (empty($this->model->timesplitting)) { - throw new \moodle_exception('invalidtimesplitting', 'analytics', '', $this->model->id); + if (empty($this->model->timesplitting)) { + throw new \moodle_exception('invalidtimesplitting', 'analytics', '', $this->model->id); + } + + // Returned as an array as all actions (evaluation, training and prediction) go through the same process. + $timesplittings = array($this->model->timesplitting => $this->get_time_splitting()); } - // Returned as an array as all actions (evaluation, training and prediction) go through the same process. - $timesplittings = array($this->model->timesplitting => $this->get_time_splitting()); - } - - if (empty($timesplittings)) { - throw new \moodle_exception('errornotimesplittings', 'analytics'); + if (empty($timesplittings)) { + throw new \moodle_exception('errornotimesplittings', 'analytics'); + } } if (!empty($options['evaluation'])) { diff --git a/lib/classes/analytics/analyser/student_enrolments.php b/lib/classes/analytics/analyser/student_enrolments.php index 5d9a0d0cc2b..e084440e9e4 100644 --- a/lib/classes/analytics/analyser/student_enrolments.php +++ b/lib/classes/analytics/analyser/student_enrolments.php @@ -49,7 +49,7 @@ class student_enrolments extends \core_analytics\local\analyser\by_course { * * @return string */ - protected function get_samples_origin() { + public function get_samples_origin() { return 'user_enrolments'; }