From e709e54435afcd2932c51248170e47e5c2961ffd Mon Sep 17 00:00:00 2001 From: David Monllao Date: Fri, 23 Jun 2017 09:55:18 +0200 Subject: [PATCH] MDL-57791 analytics: Add builtin models during upgrade --- analytics/classes/manager.php | 73 ++++++++++++++++++++++++++++++++++ analytics/classes/model.php | 34 ++++++++++++++++ analytics/tests/model_test.php | 20 ++++++++++ lib/db/install.php | 57 +------------------------- lib/db/upgrade.php | 2 + 5 files changed, 130 insertions(+), 56 deletions(-) diff --git a/analytics/classes/manager.php b/analytics/classes/manager.php index 3bc24bd1e30..2c1cfd2f829 100644 --- a/analytics/classes/manager.php +++ b/analytics/classes/manager.php @@ -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. * diff --git a/analytics/classes/model.php b/analytics/classes/model.php index 461daec27b3..11191ed7afa 100644 --- a/analytics/classes/model.php +++ b/analytics/classes/model.php @@ -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. * diff --git a/analytics/tests/model_test.php b/analytics/tests/model_test.php index 5a398ed9ee1..d4cf05ab038 100644 --- a/analytics/tests/model_test.php +++ b/analytics/tests/model_test.php @@ -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)); } } diff --git a/lib/db/install.php b/lib/db/install.php index 3861219a4ec..22816a158cf 100644 --- a/lib/db/install.php +++ b/lib/db/install.php @@ -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(); } diff --git a/lib/db/upgrade.php b/lib/db/upgrade.php index 30220900c95..7021d346ac8 100644 --- a/lib/db/upgrade.php +++ b/lib/db/upgrade.php @@ -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); }