From 7cee7c56925371e83506832cf638209feca272c8 Mon Sep 17 00:00:00 2001 From: Santosh Nagargoje Date: Fri, 7 Nov 2025 17:40:12 +0530 Subject: [PATCH] MDL-87121 quiz: Fixed random question performance issue --- .../backup/moodle2/restore_quiz_stepslib.php | 14 ++++++++------ mod/quiz/classes/structure.php | 17 +++++++++++++---- mod/quiz/lib.php | 9 +++++++-- 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/mod/quiz/backup/moodle2/restore_quiz_stepslib.php b/mod/quiz/backup/moodle2/restore_quiz_stepslib.php index 9d8b5e663f3..4c0e3b4bcee 100644 --- a/mod/quiz/backup/moodle2/restore_quiz_stepslib.php +++ b/mod/quiz/backup/moodle2/restore_quiz_stepslib.php @@ -368,8 +368,7 @@ class restore_quiz_activity_structure_step extends restore_questions_activity_st if ($question->qtype === 'random') { // Set reference data. $questionsetreference = new stdClass(); - $questionsetreference->usingcontextid = context_module::instance(get_coursemodule_from_instance( - "quiz", $module->id, $module->course)->id)->id; + $questionsetreference->usingcontextid = $this->task->get_contextid(); $questionsetreference->component = 'mod_quiz'; $questionsetreference->questionarea = 'slot'; $questionsetreference->itemid = $data->id; @@ -388,8 +387,7 @@ class restore_quiz_activity_structure_step extends restore_questions_activity_st } else { // Reference data. $questionreference = new \stdClass(); - $questionreference->usingcontextid = context_module::instance(get_coursemodule_from_instance( - "quiz", $module->id, $module->course)->id)->id; + $questionreference->usingcontextid = $this->task->get_contextid(); $questionreference->component = 'mod_quiz'; $questionreference->questionarea = 'slot'; $questionreference->itemid = $data->id; @@ -481,8 +479,12 @@ class restore_quiz_activity_structure_step extends restore_questions_activity_st } $tagstring = "{$data->tagid},{$data->tagname}"; - $setreferencedata = $DB->get_record('question_set_references', - ['itemid' => $slotid, 'component' => 'mod_quiz', 'questionarea' => 'slot']); + $setreferencedata = $DB->get_record('question_set_references', [ + 'usingcontextid' => $this->task->get_contextid(), + 'component' => 'mod_quiz', + 'questionarea' => 'slot', + 'itemid' => $slotid, + ]); $filtercondition = json_decode($setreferencedata->filtercondition); $filtercondition->tags[] = $tagstring; $setreferencedata->filtercondition = json_encode($filtercondition); diff --git a/mod/quiz/classes/structure.php b/mod/quiz/classes/structure.php index 2d73a9c6f9b..cf8be2f5605 100644 --- a/mod/quiz/classes/structure.php +++ b/mod/quiz/classes/structure.php @@ -1065,17 +1065,26 @@ class structure { return; } $maxslot = $DB->get_field_sql('SELECT MAX(slot) FROM {quiz_slots} WHERE quizid = ?', [$this->get_quizid()]); + $contextid = $this->get_context()->id; $trans = $DB->start_delegated_transaction(); // Delete the reference if it is a question. - $questionreference = $DB->get_record('question_references', - ['component' => 'mod_quiz', 'questionarea' => 'slot', 'itemid' => $slot->id]); + $questionreference = $DB->get_record('question_references', [ + 'usingcontextid' => $contextid, + 'component' => 'mod_quiz', + 'questionarea' => 'slot', + 'itemid' => $slot->id, + ]); if ($questionreference) { $DB->delete_records('question_references', ['id' => $questionreference->id]); } // Delete the set reference if it is a random question. - $questionsetreference = $DB->get_record('question_set_references', - ['component' => 'mod_quiz', 'questionarea' => 'slot', 'itemid' => $slot->id]); + $questionsetreference = $DB->get_record('question_set_references', [ + 'usingcontextid' => $contextid, + 'component' => 'mod_quiz', + 'questionarea' => 'slot', + 'itemid' => $slot->id, + ]); if ($questionsetreference) { $DB->delete_records('question_set_references', ['id' => $questionsetreference->id, 'component' => 'mod_quiz', 'questionarea' => 'slot']); diff --git a/mod/quiz/lib.php b/mod/quiz/lib.php index 43c78fc7575..fc23ad51c63 100644 --- a/mod/quiz/lib.php +++ b/mod/quiz/lib.php @@ -2392,9 +2392,14 @@ function mod_quiz_output_fragment_add_random_question_form($args) { if (empty($slotid)) { $params = $args; } else { + $contextid = \core\context\module::instance(clean_param($args['quizcmid'], PARAM_INT))->id; // Load the stored filters for the current slot. - $setreference = $DB->get_record('question_set_references', - ['itemid' => $slotid, 'component' => 'mod_quiz', 'questionarea' => 'slot']); + $setreference = $DB->get_record('question_set_references', [ + 'usingcontextid' => $contextid, + 'component' => 'mod_quiz', + 'questionarea' => 'slot', + 'itemid' => $slotid, + ]); $filterconditions = json_decode($setreference->filtercondition, true); $filterconditions = \core_question\question_reference_manager::convert_legacy_set_reference_filter_condition( $filterconditions,