From 898f4bd2863bc1c72be56d1d3d533b72f9452c78 Mon Sep 17 00:00:00 2001 From: Mark Johnson Date: Tue, 3 Jun 2025 16:34:12 +0100 Subject: [PATCH] MDL-85200 mod_quiz: Improve efficience of populate_question_sources This uses the contexts from the categories of questions in the quiz to narrow down the list of course modules we are querying to just those we will need. --- mod/quiz/classes/structure.php | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/mod/quiz/classes/structure.php b/mod/quiz/classes/structure.php index 40a90490f4a..2d73a9c6f9b 100644 --- a/mod/quiz/classes/structure.php +++ b/mod/quiz/classes/structure.php @@ -1865,12 +1865,18 @@ class structure { private function populate_question_sources(): void { global $DB; - $sql = 'SELECT c.id AS contextid, cm.id, cm.course - FROM {question_categories} qc - JOIN {context} c ON c.id = qc.contextid - JOIN {course_modules} cm ON cm.id = c.instanceid AND c.contextlevel = ' . CONTEXT_MODULE . ' - GROUP BY c.id, cm.id, cm.course'; - $this->questionsources = $DB->get_records_sql($sql); + $contextids = array_map(fn($question) => $question->contextid, $this->questions); + [$insql, $inparams] = $DB->get_in_or_equal(array_unique($contextids)); + + $sql = " + SELECT c.id as contextid, cm.id, cm.course + FROM {context} c + JOIN {course_modules} cm ON cm.id = c.instanceid AND c.contextlevel = ? + WHERE c.id {$insql} + "; + $params = array_merge([context_module::LEVEL], $inparams); + + $this->questionsources = $DB->get_records_sql($sql, $params); } /**