}
BEGIN {
- for my $rs (qw/contest contest_problem job open problem user/) {
+ for my $rs (qw/contest contest_problem job open problem user problem_status contest_status/) {
my $rsname = ucfirst $rs;
$rsname =~ s/_([a-z])/\u$1/gs;
dynsub PL_N($rs) => sub { $_[0]->resultset($rsname) };
sub user_entry {
my ($self, $id) = @_;
- +{ $self->users->find($id, {columns => USER_PUBLIC_COLUMNS})->get_columns }
+ 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 => $_->get_column('contest'), rank => $_->rank, score => $_->score} } $user->contest_statuses;
+ +{ $user->get_columns, problems => \@problems, contests => \@contests }
}
sub problem_list {
\%params
}
+sub update_status {
+ my ($self) = @_;
+ my @jobs = $self->jobs->search(undef, {cache => 1})->all;
+ my %hash;
+ $hash{$_->get_column('problem'), $_->get_column('owner')} = [$_, $_->result ? 1 : 0] for @jobs;
+ my @problem_statuses = map { [split ($;), @{$hash{$_}} ] } keys %hash;
+
+ my @contest_statuses = map {
+ my $contest = $_->id;
+ my @standings = $self->standings($contest);
+ map { [$contest, $_->{user}, $_->{score}, $_->{rank}] } @standings;
+ } $self->contests->all;
+
+ my $txn = sub {
+ $self->problem_statuses->delete;
+ $self->problem_statuses->populate([[qw/problem owner job solved/], @problem_statuses]);
+ $self->contest_statuses->delete;
+ $self->contest_statuses->populate([[qw/contest owner score rank/], @contest_statuses]);
+ };
+
+ $self->txn_do($txn);
+}
+
1;
__END__