}
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 ]
}
sub user_entry {
my ($self, $id) = @_;
my $user = $self->users->find($id, {columns => USER_PUBLIC_COLUMNS, prefetch => [qw/problem_statuses contest_statuses/]});
- my @problems = map { {problem => $_->get_column('problem'), solved => $_->solved} } $user->problem_statuses;
- my @contests = map { {contest => $_->contest->id, contest_name => $_->contest->name, rank => $_->rank, score => $_->score} } $user->contest_statuses->search(undef, {prefetch => 'contest'});
+ my @problems = map { {problem => $_->get_column('problem'), solved => $_->solved} } $user->problem_statuses->search(undef, {order_by => 'problem'});
+ my @contests = map { {contest => $_->contest->id, contest_name => $_->contest->name, rank => $_->rank, score => $_->score} } $user->contest_statuses->search(undef, {prefetch => 'contest', order_by => 'contest.start DESC'});
+{ $user->get_columns, problems => \@problems, contests => \@contests }
}