MDL-77018 qbank_statistics: only load stats for contexts that exist

Also, pre-load the contexts for efficiency.
This commit is contained in:
Tim Hunt 2023-01-24 21:25:54 +00:00
parent 67bbf6c416
commit db861ee6d3
2 changed files with 11 additions and 6 deletions

View File

@ -6211,13 +6211,14 @@ class context_helper extends context {
}
/**
* Preloads context information from db record and strips the cached info.
* Preloads context cache with information from db record and strips the cached info.
*
* The db request has to contain all columns from context_helper::get_preload_record_columns().
*
* @static
* @param stdClass $rec
* @return void (modifies $rec)
* @return void This is intentional. See MDL-37115. You will need to get the context
* in the normal way, but it is now cached, so that will be fast.
*/
public static function preload_from_record(stdClass $rec) {
context::preload_from_record($rec);

View File

@ -51,11 +51,14 @@ class helper {
[$questionidcondition, $params] = $DB->get_in_or_equal($questionids);
// The MIN(qu.id) is just to ensure that the rows have a unique key.
$places = $DB->get_records_sql("
SELECT MIN(qu.id) AS somethingunique, qu.component, qu.contextid
SELECT MIN(qu.id) AS somethingunique, qu.component, qu.contextid, " .
\context_helper::get_preload_record_columns_sql('ctx') . "
FROM {question_usages} qu
JOIN {question_attempts} qatt ON qatt.questionusageid = qu.id
WHERE qatt.questionid $questionidcondition
GROUP BY qu.component, qu.contextid
JOIN {question_attempts} qa ON qa.questionusageid = qu.id
JOIN {context} ctx ON ctx.id = qu.contextid
WHERE qa.questionid $questionidcondition
GROUP BY qu.component, qu.contextid, " .
implode(', ', array_keys(\context_helper::get_preload_record_columns('ctx'))) . "
ORDER BY qu.contextid ASC
", $params);
@ -63,6 +66,7 @@ class helper {
$places = array_values($places);
foreach ($places as $place) {
unset($place->somethingunique);
\context_helper::preload_from_record($place);
}
return $places;