Improve user_list performance
authorMarius Gavrilescu <marius@ieval.ro>
Tue, 16 Dec 2014 17:44:16 +0000 (19:44 +0200)
committerMarius Gavrilescu <marius@ieval.ro>
Tue, 16 Dec 2014 17:44:16 +0000 (19:44 +0200)
lib/Gruntmaster/Data.pm
lib/Gruntmaster/Data/Result/ContestStatus.pm
lib/Gruntmaster/Data/Result/ProblemStatus.pm

index 59cd64b3cb1536a751d5bed74a106ba6678b7afd..4935e024d2920a8718de26d0d0092a1bee922e16 100644 (file)
@@ -42,12 +42,22 @@ BEGIN {
 }
 
 sub user_list {
-       my $rs = $_[0]->users->search(undef, {columns => USER_PUBLIC_COLUMNS, prefetch => [qw/problem_statuses contest_statuses/]} );
+       my ($self) = @_;
+       my $rs = $self->users->search(undef, {columns => USER_PUBLIC_COLUMNS} );
+       my (%solved, %attempted, %contests);
+
+       for my $row ($self->problem_statuses->all) {
+               $solved   {$row->rawowner}++ if     $row->solved;
+               $attempted{$row->rawowner}++ unless $row->solved;
+       }
+       $contests{$_->rawowner}++ for $self->contest_statuses->all;
+
        [ sort { $b->{solved} <=> $a->{solved} or $b->{attempted} <=> $a->{attempted} } map { ## no critic (ProhibitReverseSort)
-               my $solved    = $_->problem_statuses->count({solved => 1});
-               my $attempted = $_->problem_statuses->count({solved => 0});
-               my $contests  = $_->contest_statuses->count;
-               +{ $_->get_columns, solved => $solved, attempted => $attempted, contests => $contests }
+               my $id = $_->id;
+               +{ $_->get_columns,
+                  solved => ($solved{$id} // 0),
+                  attempted => ($attempted{$id} // 0),
+                  contests => ($contests{$id} // 0) }
        } $rs->all ]
 }
 
index dae7cbe523530fa5ae3f585e6568a8b8c0a21b21..2e52e6553877c1883967772b5a127f3ed7d18638 100644 (file)
@@ -108,6 +108,6 @@ __PACKAGE__->belongs_to(
 # Created by DBIx::Class::Schema::Loader v0.07042 @ 2014-12-11 23:51:27
 # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:vfOfZeATPRODifpgHO4L0A
 
+sub rawowner { shift->get_column('owner') }
 
-# You can replace this text with custom code or comments, and it will be preserved on regeneration
 1;
index 09920a704eb591b69c2970727380c3521652ea3f..69be02fbdbf039e0f5aa69ff0ec10720cb87e630 100644 (file)
@@ -133,6 +133,6 @@ __PACKAGE__->belongs_to(
 # Created by DBIx::Class::Schema::Loader v0.07042 @ 2014-12-11 23:51:27
 # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:SUAwYQhgBtoCjtFSOMc4FQ
 
+sub rawowner { shift->get_column('owner') }
 
-# You can replace this text with custom code or comments, and it will be preserved on regeneration
 1;
This page took 0.013261 seconds and 4 git commands to generate.