From ebd2e996aac0e1597a6055ba9568af0d606bdaaa Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Sun, 20 Apr 2025 10:12:58 -0500 Subject: [PATCH] Speed up deleting of global user achievements. Instead of listing user achievements and then deleting them one by one in a loop, just delete them with one query using a `where` statement. --- lib/WeBWorK/DB.pm | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/lib/WeBWorK/DB.pm b/lib/WeBWorK/DB.pm index c44e726896..50bc67a40a 100644 --- a/lib/WeBWorK/DB.pm +++ b/lib/WeBWorK/DB.pm @@ -1467,17 +1467,8 @@ sub deleteGlobalUserAchievement { # userAchievementID can be undefined if being called from this package my $U = caller eq __PACKAGE__ ? "!" : ""; my ($self, $userID) = shift->checkArgs(\@_, "user_id$U"); - - my @achievements = $self->listUserAchievements($userID); - foreach my $achievement (@achievements) { - $self->deleteUserAchievement($userID, $achievement); - } - - if ($self->{global_user_achievement}) { - return $self->{global_user_achievement}->delete($userID); - } else { - return 0; - } + $self->{achievement_user}->delete_where({ user_id => $userID }); + return $self->{global_user_achievement}->delete($userID); } ################################################################################