From d8eec7ee389cf252a0899b5bfce68afa9d4771ff Mon Sep 17 00:00:00 2001 From: Adrian Greeve Date: Thu, 10 May 2018 14:41:29 +0800 Subject: [PATCH] MDL-62384 core_completion: Update to sql to improve performance. --- completion/classes/privacy/provider.php | 6 ++++-- completion/tests/fixtures/completion_creation.php | 9 ++++++--- completion/tests/privacy_test.php | 2 +- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/completion/classes/privacy/provider.php b/completion/classes/privacy/provider.php index e8d2f9e1fa702..0be20a2d89339 100644 --- a/completion/classes/privacy/provider.php +++ b/completion/classes/privacy/provider.php @@ -89,8 +89,10 @@ public static function get_course_completion_join_sql(int $userid, string $prefi $join = "JOIN {course_completion_criteria} {$cccalias} ON {$joinfield} = {$cccalias}.course LEFT JOIN {course_modules_completion} {$cmcalias} ON {$cccalias}.moduleinstance = {$cmcalias}.coursemoduleid - LEFT JOIN {course_completion_crit_compl} {$ccccalias} ON {$ccccalias}.criteriaid = {$cccalias}.id"; - $where = "{$cmcalias}.userid = :{$prefix}_moduleuserid OR {$ccccalias}.userid = :{$prefix}_courseuserid"; + AND {$cmcalias}.userid = :{$prefix}_moduleuserid + LEFT JOIN {course_completion_crit_compl} {$ccccalias} ON {$ccccalias}.criteriaid = {$cccalias}.id + AND {$ccccalias}.userid = :{$prefix}_courseuserid"; + $where = "{$cmcalias}.id IS NOT NULL OR {$ccccalias}.id IS NOT NULL"; $params = ["{$prefix}_moduleuserid" => $userid, "{$prefix}_courseuserid" => $userid]; return [$join, $where, $params]; diff --git a/completion/tests/fixtures/completion_creation.php b/completion/tests/fixtures/completion_creation.php index b064d5a451500..30ff3918ffbf0 100644 --- a/completion/tests/fixtures/completion_creation.php +++ b/completion/tests/fixtures/completion_creation.php @@ -103,8 +103,9 @@ public function create_course_completion() { * Complete some of the course completion criteria. * * @param stdClass $user The user object + * @param bool $modulecompletion If true will complete the activity module completion thing. */ - public function complete_course($user) { + public function complete_course($user, $modulecompletion = true) { $this->getDataGenerator()->enrol_user($user->id, $this->course->id, 'student'); $completion = new \completion_info($this->course); $criteriacompletions = $completion->get_completions($user->id, COMPLETION_CRITERIA_TYPE_ROLE); @@ -112,7 +113,9 @@ public function complete_course($user) { foreach ($criteriacompletions as $ccompletion) { $criteria->complete($ccompletion); } - // Set activity as complete. - $completion->update_state($this->cm, COMPLETION_COMPLETE, $user->id); + if ($modulecompletion) { + // Set activity as complete. + $completion->update_state($this->cm, COMPLETION_COMPLETE, $user->id); + } } } diff --git a/completion/tests/privacy_test.php b/completion/tests/privacy_test.php index 7e1939ad7b4b2..d41863abe6e14 100644 --- a/completion/tests/privacy_test.php +++ b/completion/tests/privacy_test.php @@ -47,7 +47,7 @@ public function test_get_course_completion_join_sql() { $this->resetAfterTest(); $user = $this->getDataGenerator()->create_user(); $this->create_course_completion(); - $this->complete_course($user); + $this->complete_course($user, false); list($join, $where, $params) = \core_completion\privacy\provider::get_course_completion_join_sql($user->id, 'comp', 'c.id'); $sql = "SELECT DISTINCT c.id