MDL-87121 quiz: Fixed random question performance issue

This commit is contained in:
Santosh Nagargoje
2025-12-04 17:24:30 +05:30
parent 52c6473e16
commit c8c6a29f20
3 changed files with 28 additions and 12 deletions
@@ -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);
+13 -4
View File
@@ -1060,17 +1060,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']);
+7 -2
View File
@@ -2520,9 +2520,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,