From 828f4551862bb5d72f9b678bd4978d2a3dc12c70 Mon Sep 17 00:00:00 2001 From: Jaimos Skriletz Date: Sun, 2 Feb 2025 13:35:18 -0700 Subject: [PATCH] Use a hash vs an array to store user problems when using achievement items. --- lib/WeBWorK/AchievementItems/DoubleSet.pm | 16 +++++++++------- lib/WeBWorK/AchievementItems/ExtendDueDate.pm | 14 ++++++++------ lib/WeBWorK/AchievementItems/FullCreditSet.pm | 16 +++++++++------- lib/WeBWorK/AchievementItems/HalfCreditSet.pm | 16 +++++++++------- lib/WeBWorK/AchievementItems/ReducedCred.pm | 14 ++++++++------ lib/WeBWorK/AchievementItems/ResurrectHW.pm | 17 ++++++++--------- .../AchievementItems/SuperExtendDueDate.pm | 14 ++++++++------ 7 files changed, 59 insertions(+), 48 deletions(-) diff --git a/lib/WeBWorK/AchievementItems/DoubleSet.pm b/lib/WeBWorK/AchievementItems/DoubleSet.pm index f6c3213982..13b681cf6a 100644 --- a/lib/WeBWorK/AchievementItems/DoubleSet.pm +++ b/lib/WeBWorK/AchievementItems/DoubleSet.pm @@ -47,13 +47,15 @@ sub use_item ($self, $set, $records, $c) { my $old_value = 0; my $new_value = 0; - my @userProblems = $db->getUserProblemsWhere({ user_id => $set->user_id, set_id => $set->set_id }, 'problem_id'); - for my $n (0 .. $#userProblems) { - $old_value += $records->[$n]->value; - $records->[$n]->value($records->[$n]->value * 2); - $userProblems[$n]->value($records->[$n]->value); - $new_value += $userProblems[$n]->value; - $db->putUserProblem($userProblems[$n]); + my %userProblems = + map { $_->problem_id => $_ } $db->getUserProblemsWhere({ user_id => $set->user_id, set_id => $set->set_id }); + for my $problem (@$records) { + my $userProblem = $userProblems{ $problem->problem_id }; + $old_value += $problem->value; + $problem->value(2 * $problem->value); + $userProblem->value($problem->value); + $new_value += $userProblem->value; + $db->putUserProblem($userProblem); } return $c->maketext(q(Assignment's total point value increased from [_1] points to [_2] points), diff --git a/lib/WeBWorK/AchievementItems/ExtendDueDate.pm b/lib/WeBWorK/AchievementItems/ExtendDueDate.pm index 6ff82ea546..7d1f77cb8d 100644 --- a/lib/WeBWorK/AchievementItems/ExtendDueDate.pm +++ b/lib/WeBWorK/AchievementItems/ExtendDueDate.pm @@ -56,12 +56,14 @@ sub use_item ($self, $set, $records, $c) { # Change the seed for all of the problems if the set is currently closed. if (after($set->due_date)) { - my @userProblems = - $db->getUserProblemsWhere({ user_id => $set->user_id, set_id => $set->set_id }, 'problem_id'); - for my $n (0 .. $#userProblems) { - $userProblems[$n]->problem_seed($userProblems[$n]->problem_seed % 2**31 + 1); - $records->[$n]->problem_seed($userProblems[$n]->problem_seed); - $db->putUserProblem($userProblems[$n]); + my %userProblems = + map { $_->problem_id => $_ } + $db->getUserProblemsWhere({ user_id => $set->user_id, set_id => $set->set_id }); + for my $problem (@$records) { + my $userProblem = $userProblems{ $problem->problem_id }; + $userProblem->problem_seed($userProblem->problem_seed % 2**31 + 1); + $problem->problem_seed($userProblem->problem_seed); + $db->putUserProblem($userProblem); } } diff --git a/lib/WeBWorK/AchievementItems/FullCreditSet.pm b/lib/WeBWorK/AchievementItems/FullCreditSet.pm index 0437357cdd..e157d5a18c 100644 --- a/lib/WeBWorK/AchievementItems/FullCreditSet.pm +++ b/lib/WeBWorK/AchievementItems/FullCreditSet.pm @@ -51,13 +51,15 @@ sub print_form ($self, $set, $records, $c) { sub use_item ($self, $set, $records, $c) { my $db = $c->db; - my @userProblems = $db->getUserProblemsWhere({ user_id => $set->user_id, set_id => $set->set_id }, 'problem_id'); - for my $n (0 .. $#userProblems) { - $records->[$n]->status(1); - $records->[$n]->sub_status(1); - $userProblems[$n]->status(1); - $userProblems[$n]->sub_status(1); - $db->putUserProblem($userProblems[$n]); + my %userProblems = + map { $_->problem_id => $_ } $db->getUserProblemsWhere({ user_id => $set->user_id, set_id => $set->set_id }); + for my $problem (@$records) { + my $userProblem = $userProblems{ $problem->problem_id }; + $problem->status(1); + $problem->sub_status(1); + $userProblem->status(1); + $userProblem->sub_status(1); + $db->putUserProblem($userProblem); } return $c->maketext(q(Assignment's grade increased from [_1]% to 100%.), $self->{old_grade}); diff --git a/lib/WeBWorK/AchievementItems/HalfCreditSet.pm b/lib/WeBWorK/AchievementItems/HalfCreditSet.pm index a93ef346e0..d5df5f6f8b 100644 --- a/lib/WeBWorK/AchievementItems/HalfCreditSet.pm +++ b/lib/WeBWorK/AchievementItems/HalfCreditSet.pm @@ -60,13 +60,15 @@ sub print_form ($self, $set, $records, $c) { sub use_item ($self, $set, $records, $c) { my $db = $c->db; - my @userProblems = $db->getUserProblemsWhere({ user_id => $set->user_id, set_id => $set->set_id }, 'problem_id'); - for my $n (0 .. $#userProblems) { - $records->[$n]->status($records->[$n]->status > 0.5 ? 1 : $records->[$n]->status + 0.5); - $records->[$n]->sub_status($records->[$n]->status); - $userProblems[$n]->status($records->[$n]->status); - $userProblems[$n]->sub_status($records->[$n]->status); - $db->putUserProblem($userProblems[$n]); + my %userProblems = + map { $_->problem_id => $_ } $db->getUserProblemsWhere({ user_id => $set->user_id, set_id => $set->set_id }); + for my $problem (@$records) { + my $userProblem = $userProblems{ $problem->problem_id }; + $problem->status($problem->status > 0.5 ? 1 : $problem->status + 0.5); + $problem->sub_status($problem->status); + $userProblem->status($problem->status); + $userProblem->sub_status($problem->status); + $db->putUserProblem($userProblem); } return $c->maketext(q(Assignment's grade increased from [_1] to [_2].), $self->{old_grade}, $self->{new_grade}); diff --git a/lib/WeBWorK/AchievementItems/ReducedCred.pm b/lib/WeBWorK/AchievementItems/ReducedCred.pm index 6d70a6f687..667319401e 100644 --- a/lib/WeBWorK/AchievementItems/ReducedCred.pm +++ b/lib/WeBWorK/AchievementItems/ReducedCred.pm @@ -75,12 +75,14 @@ sub use_item ($self, $set, $records, $c) { # Change the seed for all of the problems if the set is currently closed. if (after($set->due_date)) { - my @userProblems = - $db->getUserProblemsWhere({ user_id => $set->user_id, set_id => $set->set_id }, 'problem_id'); - for my $n (0 .. $#userProblems) { - $userProblems[$n]->problem_seed($userProblems[$n]->problem_seed % 2**31 + 1); - $records->[$n]->problem_seed($userProblems[$n]->problem_seed); - $db->putUserProblem($userProblems[$n]); + my %userProblems = + map { $_->problem_id => $_ } + $db->getUserProblemsWhere({ user_id => $set->user_id, set_id => $set->set_id }); + for my $problem (@$records) { + my $userProblem = $userProblems{ $problem->problem_id }; + $userProblem->problem_seed($userProblem->problem_seed % 2**31 + 1); + $problem->problem_seed($userProblem->problem_seed); + $db->putUserProblem($userProblem); } } diff --git a/lib/WeBWorK/AchievementItems/ResurrectHW.pm b/lib/WeBWorK/AchievementItems/ResurrectHW.pm index 63a0f76f6b..a281974ae0 100644 --- a/lib/WeBWorK/AchievementItems/ResurrectHW.pm +++ b/lib/WeBWorK/AchievementItems/ResurrectHW.pm @@ -44,15 +44,14 @@ sub use_item ($self, $set, $records, $c) { my $db = $c->db; my $userSet = $db->getUserSet($set->user_id, $set->set_id); - # Change the seed for all of the problems if the set is currently closed. - if (after($set->due_date)) { - my @userProblems = - $db->getUserProblemsWhere({ user_id => $set->user_id, set_id => $set->set_id }, 'problem_id'); - for my $n (0 .. $#userProblems) { - $userProblems[$n]->problem_seed($userProblems[$n]->problem_seed % 2**31 + 1); - $records->[$n]->problem_seed($userProblems[$n]->problem_seed); - $db->putUserProblem($userProblems[$n]); - } + # Change the seed for all of the problems since the set is currently closed. + my %userProblems = + map { $_->problem_id => $_ } $db->getUserProblemsWhere({ user_id => $set->user_id, set_id => $set->set_id }); + for my $problem (@$records) { + my $userProblem = $userProblems{ $problem->problem_id }; + $userProblem->problem_seed($userProblem->problem_seed % 2**31 + 1); + $problem->problem_seed($userProblem->problem_seed); + $db->putUserProblem($userProblem); } # Add time to the reduced scoring date if it was defined in the first place diff --git a/lib/WeBWorK/AchievementItems/SuperExtendDueDate.pm b/lib/WeBWorK/AchievementItems/SuperExtendDueDate.pm index 9e299445b8..50bb9080c5 100644 --- a/lib/WeBWorK/AchievementItems/SuperExtendDueDate.pm +++ b/lib/WeBWorK/AchievementItems/SuperExtendDueDate.pm @@ -56,12 +56,14 @@ sub use_item ($self, $set, $records, $c) { # Change the seed for all of the problems if the set is currently closed. if (after($set->due_date)) { - my @userProblems = - $db->getUserProblemsWhere({ user_id => $set->user_id, set_id => $set->set_id }, 'problem_id'); - for my $n (0 .. $#userProblems) { - $userProblems[$n]->problem_seed($userProblems[$n]->problem_seed % 2**31 + 1); - $records->[$n]->problem_seed($userProblems[$n]->problem_seed); - $db->putUserProblem($userProblems[$n]); + my %userProblems = + map { $_->problem_id => $_ } + $db->getUserProblemsWhere({ user_id => $set->user_id, set_id => $set->set_id }); + for my $problem (@$records) { + my $userProblem = $userProblems{ $problem->problem_id }; + $userProblem->problem_seed($userProblem->problem_seed % 2**31 + 1); + $problem->problem_seed($userProblem->problem_seed); + $db->putUserProblem($userProblem); } }