MDL-85764 mod_quiz: Improve performance of quiz notifications task

This commit is contained in:
Benjamin Walker
2025-11-14 20:04:19 +10:00
parent 66c419f029
commit 5d09824f5e
@@ -105,7 +105,7 @@ class notification_helper {
// Update this user with any applicable override dates.
if (!empty($overrides)) {
self::update_user_with_date_overrides($overrides, $user);
self::update_user_with_date_overrides($overrides, $quiz->course, $user);
}
// If the 'timeopen' date has no value, even after overriding, unset this user.
@@ -229,10 +229,11 @@ class notification_helper {
* Update user's recorded date based on the overrides.
*
* @param array $overrides The overrides to check.
* @param int $courseid The course id of the overrides.
* @param stdClass $user The user records we will be updating.
*/
protected static function update_user_with_date_overrides(array $overrides, stdClass $user): void {
protected static function update_user_with_date_overrides(array $overrides, int $courseid, stdClass $user): void {
$usergroupids = null;
foreach ($overrides as $override) {
// User override.
if ($override->userid === $user->id) {
@@ -243,7 +244,13 @@ class notification_helper {
return;
}
// Group override.
if (!empty($override->groupid) && groups_is_member($override->groupid, $user->id)) {
if (!isset($usergroupids)) {
// Only load user groups if there is at least one group override.
// We only need to check the group ids and not grouping ids or visibility.
$usergroups = groups_get_user_groups($courseid, $user->id);
$usergroupids = array_merge(...array_values($usergroups));
}
if (!empty($override->groupid) && in_array($override->groupid, $usergroupids)) {
// If user is a member of multiple groups, and we have set this already, use the earliest date.
if ($user->overridetype === 'group' && $user->timeopen < $override->timeopen) {
continue;