MDL-57791 analytics: Add builtin models during upgrade
authorDavid Monllao <davidm@moodle.com>
Fri, 23 Jun 2017 07:55:18 +0000 (09:55 +0200)
committerDavid Monllao <davidm@moodle.com>
Mon, 24 Jul 2017 06:37:01 +0000 (08:37 +0200)
analytics/classes/manager.php
analytics/classes/model.php
analytics/tests/model_test.php
lib/db/install.php
lib/db/upgrade.php

index 3bc24bd..2c1cfd2 100644 (file)
@@ -383,6 +383,79 @@ class manager {
         return array($model, $prediction, $context);
     }
 
+    /**
+     * Adds the models included with moodle core to the system.
+     *
+     * @return void
+     */
+    public static function add_builtin_models() {
+
+        $target = \core_analytics\manager::get_target('\core\analytics\target\course_dropout');
+
+        // Community of inquiry indicators.
+        $coiindicators = array(
+            '\mod_assign\analytics\indicator\cognitive_depth',
+            '\mod_assign\analytics\indicator\social_breadth',
+            '\mod_book\analytics\indicator\cognitive_depth',
+            '\mod_book\analytics\indicator\social_breadth',
+            '\mod_chat\analytics\indicator\cognitive_depth',
+            '\mod_chat\analytics\indicator\social_breadth',
+            '\mod_choice\analytics\indicator\cognitive_depth',
+            '\mod_choice\analytics\indicator\social_breadth',
+            '\mod_data\analytics\indicator\cognitive_depth',
+            '\mod_data\analytics\indicator\social_breadth',
+            '\mod_feedback\analytics\indicator\cognitive_depth',
+            '\mod_feedback\analytics\indicator\social_breadth',
+            '\mod_folder\analytics\indicator\cognitive_depth',
+            '\mod_folder\analytics\indicator\social_breadth',
+            '\mod_forum\analytics\indicator\cognitive_depth',
+            '\mod_forum\analytics\indicator\social_breadth',
+            '\mod_glossary\analytics\indicator\cognitive_depth',
+            '\mod_glossary\analytics\indicator\social_breadth',
+            '\mod_imscp\analytics\indicator\cognitive_depth',
+            '\mod_imscp\analytics\indicator\social_breadth',
+            '\mod_label\analytics\indicator\cognitive_depth',
+            '\mod_label\analytics\indicator\social_breadth',
+            '\mod_lesson\analytics\indicator\cognitive_depth',
+            '\mod_lesson\analytics\indicator\social_breadth',
+            '\mod_lti\analytics\indicator\cognitive_depth',
+            '\mod_lti\analytics\indicator\social_breadth',
+            '\mod_page\analytics\indicator\cognitive_depth',
+            '\mod_page\analytics\indicator\social_breadth',
+            '\mod_quiz\analytics\indicator\cognitive_depth',
+            '\mod_quiz\analytics\indicator\social_breadth',
+            '\mod_resource\analytics\indicator\cognitive_depth',
+            '\mod_resource\analytics\indicator\social_breadth',
+            '\mod_scorm\analytics\indicator\cognitive_depth',
+            '\mod_scorm\analytics\indicator\social_breadth',
+            '\mod_survey\analytics\indicator\cognitive_depth',
+            '\mod_survey\analytics\indicator\social_breadth',
+            '\mod_url\analytics\indicator\cognitive_depth',
+            '\mod_url\analytics\indicator\social_breadth',
+            '\mod_wiki\analytics\indicator\cognitive_depth',
+            '\mod_wiki\analytics\indicator\social_breadth',
+            '\mod_workshop\analytics\indicator\cognitive_depth',
+            '\mod_workshop\analytics\indicator\social_breadth',
+        );
+        $indicators = array();
+        foreach ($coiindicators as $coiindicator) {
+            $indicator = \core_analytics\manager::get_indicator($coiindicator);
+            $indicators[$indicator->get_id()] = $indicator;
+        }
+        if (!\core_analytics\model::exists($target, $indicators)) {
+            $model = \core_analytics\model::create($target, $indicators);
+        }
+
+        // No teaching model.
+        $target = \core_analytics\manager::get_target('\core\analytics\target\no_teaching');
+        $timesplittingmethod = '\core\analytics\time_splitting\single_range';
+        $noteacher = \core_analytics\manager::get_indicator('\core_course\analytics\indicator\no_teacher');
+        $indicators = array($noteacher->get_id() => $noteacher);
+        if (!\core_analytics\model::exists($target, $indicators)) {
+            \core_analytics\model::create($target, $indicators, $timesplittingmethod);
+        }
+    }
+
     /**
      * Returns the provided element classes in the site.
      *
index 461daec..11191ed 100644 (file)
@@ -357,6 +357,40 @@ class model {
         return $model;
     }
 
+    /**
+     * Does this model exist?
+     *
+     * If no indicators are provided it considers any model with the provided
+     * target a match.
+     *
+     * @param \core_analytics\local\target\base $target
+     * @param \core_analytics\local\indicator\base[]|false $indicators
+     * @return bool
+     */
+    public static function exists(\core_analytics\local\target\base $target, $indicators = false) {
+        global $DB;
+
+        $existingmodels = $DB->get_records('analytics_models', array('target' => $target->get_id()));
+
+        if (!$indicators && $existingmodels) {
+            return true;
+        }
+
+        $indicatorids = array_keys($indicators);
+        sort($indicatorids);
+
+        foreach ($existingmodels as $modelobj) {
+            $model = new \core_analytics\model($modelobj);
+            $modelindicatorids = array_keys($model->get_indicators());
+            sort($modelindicatorids);
+
+            if ($indicatorids === $modelindicatorids) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     /**
      * Updates the model.
      *
index 5a398ed..d4cf05a 100644 (file)
@@ -138,7 +138,27 @@ class analytics_model_testcase extends advanced_testcase {
         sleep(1);
         $this->model->enable('\core\analytics\time_splitting\quarters');
         $this->assertNotEquals($originaluniqueid, $this->model->get_unique_id());
+    }
+
+    /**
+     * test_exists
+     *
+     * @return void
+     */
+    public function test_exists() {
+        $this->resetAfterTest(true);
+
+        global $DB;
+
+        // 2 built-in models + the testing one.
+        $this->assertCount(3, $DB->get_records('analytics_models'));
+
+        // No new models added if the builtin ones already exist.
+        \core_analytics\manager::add_builtin_models();
+        $this->assertCount(3, $DB->get_records('analytics_models'));
 
+        $target = \core_analytics\manager::get_target('\core\analytics\target\no_teaching');
+        $this->assertTrue(\core_analytics\model::exists($target));
     }
 }
 
index 3861219..22816a1 100644 (file)
@@ -321,60 +321,5 @@ function xmldb_main_install() {
     make_competence_scale();
 
     // Add built-in prediction models.
-    $target = \core_analytics\manager::get_target('\core\analytics\target\course_dropout');
-
-    // Community of inquiry indicators.
-    $indicators = array(
-        '\mod_assign\analytics\indicator\cognitive_depth',
-        '\mod_assign\analytics\indicator\social_breadth',
-        '\mod_book\analytics\indicator\cognitive_depth',
-        '\mod_book\analytics\indicator\social_breadth',
-        '\mod_chat\analytics\indicator\cognitive_depth',
-        '\mod_chat\analytics\indicator\social_breadth',
-        '\mod_choice\analytics\indicator\cognitive_depth',
-        '\mod_choice\analytics\indicator\social_breadth',
-        '\mod_data\analytics\indicator\cognitive_depth',
-        '\mod_data\analytics\indicator\social_breadth',
-        '\mod_feedback\analytics\indicator\cognitive_depth',
-        '\mod_feedback\analytics\indicator\social_breadth',
-        '\mod_folder\analytics\indicator\cognitive_depth',
-        '\mod_folder\analytics\indicator\social_breadth',
-        '\mod_forum\analytics\indicator\cognitive_depth',
-        '\mod_forum\analytics\indicator\social_breadth',
-        '\mod_glossary\analytics\indicator\cognitive_depth',
-        '\mod_glossary\analytics\indicator\social_breadth',
-        '\mod_imscp\analytics\indicator\cognitive_depth',
-        '\mod_imscp\analytics\indicator\social_breadth',
-        '\mod_label\analytics\indicator\cognitive_depth',
-        '\mod_label\analytics\indicator\social_breadth',
-        '\mod_lesson\analytics\indicator\cognitive_depth',
-        '\mod_lesson\analytics\indicator\social_breadth',
-        '\mod_lti\analytics\indicator\cognitive_depth',
-        '\mod_lti\analytics\indicator\social_breadth',
-        '\mod_page\analytics\indicator\cognitive_depth',
-        '\mod_page\analytics\indicator\social_breadth',
-        '\mod_quiz\analytics\indicator\cognitive_depth',
-        '\mod_quiz\analytics\indicator\social_breadth',
-        '\mod_resource\analytics\indicator\cognitive_depth',
-        '\mod_resource\analytics\indicator\social_breadth',
-        '\mod_scorm\analytics\indicator\cognitive_depth',
-        '\mod_scorm\analytics\indicator\social_breadth',
-        '\mod_survey\analytics\indicator\cognitive_depth',
-        '\mod_survey\analytics\indicator\social_breadth',
-        '\mod_url\analytics\indicator\cognitive_depth',
-        '\mod_url\analytics\indicator\social_breadth',
-        '\mod_wiki\analytics\indicator\cognitive_depth',
-        '\mod_wiki\analytics\indicator\social_breadth',
-        '\mod_workshop\analytics\indicator\cognitive_depth',
-        '\mod_workshop\analytics\indicator\social_breadth',
-    );
-    array_walk($indicators, function(&$indicator) {
-        $indicator = \core_analytics\manager::get_indicator($indicator);
-    });
-    $model = \core_analytics\model::create($target, array());
-
-    $target = \core_analytics\manager::get_target('\core\analytics\target\no_teaching');
-    $timesplittingmethod = '\core\analytics\time_splitting\single_range';
-    $noteacher = \core_analytics\manager::get_indicator('\core_course\analytics\indicator\no_teacher');
-    \core_analytics\model::create($target, array($noteacher->get_id() => $noteacher), $timesplittingmethod);
+    \core_analytics\manager::add_builtin_models();
 }
index 3022090..7021d34 100644 (file)
@@ -2136,6 +2136,8 @@ function xmldb_main_upgrade($oldversion) {
             $dbman->create_table($table);
         }
 
+        \core_analytics\manager::add_builtin_models();
+
         // Main savepoint reached.
         upgrade_main_savepoint(true, 2017072000.01);
     }