Skip to content

Commit 3aef0da

Browse files
committed
Efficiency tweak (a significant improvement for large classes).
Don't query the database for permissions for each user record in a loop. Instead obtain all permission levels in one query. Timing shows a significant speed up for large classes with this.
1 parent 48726ac commit 3aef0da

File tree

1 file changed

+14
-4
lines changed

1 file changed

+14
-4
lines changed

lib/WeBWorK/Utils/FilterRecords.pm

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,14 +87,16 @@ sub getFiltersForClass {
8787
if (ref $records[0] eq 'WeBWorK::DB::Record::User') {
8888
my (%sections, %recitations, %permissions, %roles);
8989

90-
my %permissionName = reverse %{ $c->ce->{userRoles} };
9190
for my $user (@records) {
9291
++$sections{ $user->section };
9392
++$recitations{ $user->recitation };
9493
++$roles{ $user->status };
95-
++$permissions{ $permissionName{ $c->db->getPermissionLevel($user->user_id)->permission } };
9694
}
9795

96+
my %permissionName = reverse %{ $c->ce->{userRoles} };
97+
++$permissions{ $permissionName{$_} }
98+
for map { $_->permission } $c->db->getPermissionLevelsWhere({ user_id => { not_like => 'set_id:%' } });
99+
98100
if (keys %sections > 1) {
99101
for my $sec (sortByName(undef, keys %sections)) {
100102
push @filters, [ 'Section: ' . ($sec ne '' ? $sec : "\x{27E8}blank\x{27E9}") => "section:$sec" ];
@@ -167,14 +169,22 @@ sub filterRecords {
167169
return @records;
168170
}
169171

172+
my %permissionName = reverse %{ $c->ce->{userRoles} };
173+
174+
# Only query the database for permission levels if a permission level filter is in use.
175+
my %permissionLevels =
176+
(grep {/^permission:/} @filtersToUse)
177+
? (map { $_->user_id => $_->permission }
178+
$c->db->getPermissionLevelsWhere({ user_id => { not_like => 'set_id:%' } }))
179+
: ();
180+
170181
my @filteredRecords;
171182
for my $record (@records) {
172183
for my $filter (@filtersToUse) {
173184
my ($name, $value) = split(/:/, $filter);
174185
# permission level is handled differently
175186
if ($name eq 'permission') {
176-
my %permissionName = reverse %{ $c->ce->{userRoles} };
177-
if ($permissionName{ $c->db->getPermissionLevel($record->user_id)->permission } eq $value) {
187+
if ($permissionName{ $permissionLevels{ $record->user_id } } eq $value) {
178188
push @filteredRecords, $record;
179189
last; # Only add a record once.
180190
}

0 commit comments

Comments
 (0)