MDL-81301 quiz: improve performance of deleting a quiz

This commit is contained in:
Tim Hunt 2024-03-20 14:13:28 +00:00
parent b621a7e4b3
commit 22e4cc9204
2 changed files with 23 additions and 21 deletions

View File

@ -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);
}
/**

View File

@ -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() {