From 14574fdb567b6fe4fa5e9200a0a1fe68bb614a43 Mon Sep 17 00:00:00 2001 From: Tim Hunt Date: Wed, 20 Mar 2024 14:13:28 +0000 Subject: [PATCH] MDL-81301 quiz: improve performance of deleting a quiz --- mod/quiz/lib.php | 26 +++++++++++++------------- mod/quiz/tests/lib_test.php | 18 ++++++++++-------- 2 files changed, 23 insertions(+), 21 deletions(-) diff --git a/mod/quiz/lib.php b/mod/quiz/lib.php index 36a613b7aa4..db6b8294e5d 100644 --- a/mod/quiz/lib.php +++ b/mod/quiz/lib.php @@ -2434,24 +2434,24 @@ function mod_quiz_core_calendar_get_event_action_string(string $eventtype): stri } /** - * Delete question reference data. + * Delete all question references for a quiz. * * @param int $quizid The id of quiz. */ function quiz_delete_references($quizid): void { global $DB; - $slots = $DB->get_records('quiz_slots', ['quizid' => $quizid]); - foreach ($slots as $slot) { - $params = [ - 'itemid' => $slot->id, - 'component' => 'mod_quiz', - 'questionarea' => 'slot' - ]; - // Delete any set references. - $DB->delete_records('question_set_references', $params); - // Delete any references. - $DB->delete_records('question_references', $params); - } + + $cm = get_coursemodule_from_instance('quiz', $quizid); + $context = context_module::instance($cm->id); + + $conditions = [ + 'usingcontextid' => $context->id, + 'component' => 'mod_quiz', + 'questionarea' => 'slot', + ]; + + $DB->delete_records('question_references', $conditions); + $DB->delete_records('question_set_references', $conditions); } /** diff --git a/mod/quiz/tests/lib_test.php b/mod/quiz/tests/lib_test.php index 7a8bf421408..4b0536b4a48 100644 --- a/mod/quiz/tests/lib_test.php +++ b/mod/quiz/tests/lib_test.php @@ -24,6 +24,7 @@ */ namespace mod_quiz; +use context_module; use core_external\external_api; use mod_quiz\quiz_settings; @@ -106,6 +107,7 @@ class lib_test extends \advanced_testcase { // Setup a quiz with 1 standard and 1 random question. $quizgenerator = $this->getDataGenerator()->get_plugin_generator('mod_quiz'); $quiz = $quizgenerator->create_instance(['course' => $SITE->id, 'questionsperpage' => 3, 'grade' => 100.0]); + $context = context_module::instance($quiz->cmid); $questiongenerator = $this->getDataGenerator()->get_plugin_generator('core_question'); $cat = $questiongenerator->create_question_category(); @@ -121,20 +123,20 @@ class lib_test extends \advanced_testcase { // Check that the random question was deleted. if ($randomq) { - $count = $DB->count_records('question', ['id' => $randomq->id]); - $this->assertEquals(0, $count); + $this->assertEquals(0, $DB->count_records('question', ['id' => $randomq->id])); } // Check that the standard question was not deleted. - $count = $DB->count_records('question', ['id' => $standardq->id]); - $this->assertEquals(1, $count); + $this->assertEquals(1, $DB->count_records('question', ['id' => $standardq->id])); // Check that all the slots were removed. - $count = $DB->count_records('quiz_slots', ['quizid' => $quiz->id]); - $this->assertEquals(0, $count); + $this->assertEquals(0, $DB->count_records('quiz_slots', ['quizid' => $quiz->id])); // Check that the quiz was removed. - $count = $DB->count_records('quiz', ['id' => $quiz->id]); - $this->assertEquals(0, $count); + $this->assertEquals(0, $DB->count_records('quiz', ['id' => $quiz->id])); + + // Check that any question references linked to this quiz are gone. + $this->assertEquals(0, $DB->count_records('question_references', ['usingcontextid' => $context->id])); + $this->assertEquals(0, $DB->count_records('question_set_references', ['usingcontextid' => $context->id])); } public function test_quiz_get_user_attempts() {