From 46b6785183addd56025a2f4fc47073a50e1ee461 Mon Sep 17 00:00:00 2001 From: Jaimos Skriletz Date: Sun, 15 Dec 2024 18:06:28 -0700 Subject: [PATCH] Apply improvement to limit database calls in leaderboard. Thanks to drgrice1. --- .../ContentGenerator/AchievementsLeaderboard.pm | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/WeBWorK/ContentGenerator/AchievementsLeaderboard.pm b/lib/WeBWorK/ContentGenerator/AchievementsLeaderboard.pm index 9b0a8fc7d1..2c2ba971d4 100644 --- a/lib/WeBWorK/ContentGenerator/AchievementsLeaderboard.pm +++ b/lib/WeBWorK/ContentGenerator/AchievementsLeaderboard.pm @@ -63,13 +63,20 @@ sub initialize ($c) { my $level = $globalData->level_achievement_id ? $achievementsById{ $globalData->level_achievement_id } : ''; + my %userAchievements = map { $_->achievement_id => $_ } $db->getUserAchievementsWhere({ + user_id => $user->user_id, + achievement_id => [ map { $_->achievement_id } grep { $_->category ne 'level' } @achievements ], + }); + my @badges; for my $achievement (@achievements) { # Skip level achievements and only show earned achievements. last if $achievement->category eq 'level'; - my $userBadge = $db->getUserAchievement($user->user_id, $achievement->achievement_id); - push(@badges, $achievement) if $userBadge && $achievement->enabled && $userBadge->earned; + push(@badges, $achievement) + if $userAchievements{ $achievement->achievement_id } + && $achievement->enabled + && $userAchievements{ $achievement->achievement_id }->earned; } push(@rows, [ $globalData->achievement_points || 0, $level, $user, \@badges ]);