MDL-59630 analytics: Move get_analysables to abstract class
authorDavid Monllao <davidm@moodle.com>
Tue, 29 Aug 2017 15:45:15 +0000 (17:45 +0200)
committerDavid Monllao <davidm@moodle.com>
Tue, 3 Oct 2017 08:07:21 +0000 (10:07 +0200)
analytics/classes/local/analyser/base.php
analytics/classes/local/analyser/by_course.php
analytics/classes/local/analyser/sitewide.php
analytics/classes/model.php
lib/classes/analytics/analyser/student_enrolments.php

index ab2f52e..63c75b5 100644 (file)
@@ -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.
      *
index e531bba..8e5b266 100644 (file)
@@ -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;
-    }
 }
index 9c6fb47..2a21359 100644 (file)
@@ -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);
     }
 }
index dbee08a..fc7f43d 100644 (file)
@@ -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'])) {
index 5d9a0d0..e084440 100644 (file)
@@ -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';
     }