Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit f8e5b6d

Browse files
committedFeb 2, 2025·
Use a hash vs an array to store user problems when using achievement items.
1 parent d68c51c commit f8e5b6d

File tree

7 files changed

+59
-48
lines changed

7 files changed

+59
-48
lines changed
 

‎lib/WeBWorK/AchievementItems/DoubleSet.pm

+9-7
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,15 @@ sub use_item ($self, $set, $records, $c) {
4747
my $old_value = 0;
4848
my $new_value = 0;
4949

50-
my @userProblems = $db->getUserProblemsWhere({ user_id => $set->user_id, set_id => $set->set_id }, 'problem_id');
51-
for my $n (0 .. $#userProblems) {
52-
$old_value += $records->[$n]->value;
53-
$records->[$n]->value($records->[$n]->value * 2);
54-
$userProblems[$n]->value($records->[$n]->value);
55-
$new_value += $userProblems[$n]->value;
56-
$db->putUserProblem($userProblems[$n]);
50+
my %userProblems =
51+
map { $_->problem_id => $_ } $db->getUserProblemsWhere({ user_id => $set->user_id, set_id => $set->set_id });
52+
for my $problem (@$records) {
53+
my $userProblem = $userProblems{$problem->problem_id};
54+
$old_value += $problem->value;
55+
$problem->value(2 * $problem->value);
56+
$userProblem->value($problem->value);
57+
$new_value += $userProblem->value;
58+
$db->putUserProblem($userProblem);
5759
}
5860

5961
return $c->maketext(q(Assignment's total point value increased from [_1] points to [_2] points),

‎lib/WeBWorK/AchievementItems/ExtendDueDate.pm

+8-6
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,14 @@ sub use_item ($self, $set, $records, $c) {
5656

5757
# Change the seed for all of the problems if the set is currently closed.
5858
if (after($set->due_date)) {
59-
my @userProblems =
60-
$db->getUserProblemsWhere({ user_id => $set->user_id, set_id => $set->set_id }, 'problem_id');
61-
for my $n (0 .. $#userProblems) {
62-
$userProblems[$n]->problem_seed($userProblems[$n]->problem_seed % 2**31 + 1);
63-
$records->[$n]->problem_seed($userProblems[$n]->problem_seed);
64-
$db->putUserProblem($userProblems[$n]);
59+
my %userProblems =
60+
map { $_->problem_id => $_ }
61+
$db->getUserProblemsWhere({ user_id => $set->user_id, set_id => $set->set_id });
62+
for my $problem (@$records) {
63+
my $userProblem = $userProblems{ $problem->problem_id };
64+
$userProblem->problem_seed($userProblem->problem_seed % 2**31 + 1);
65+
$problem->problem_seed($userProblem->problem_seed);
66+
$db->putUserProblem($userProblem);
6567
}
6668
}
6769

‎lib/WeBWorK/AchievementItems/FullCreditSet.pm

+9-7
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,15 @@ sub print_form ($self, $set, $records, $c) {
5151
sub use_item ($self, $set, $records, $c) {
5252
my $db = $c->db;
5353

54-
my @userProblems = $db->getUserProblemsWhere({ user_id => $set->user_id, set_id => $set->set_id }, 'problem_id');
55-
for my $n (0 .. $#userProblems) {
56-
$records->[$n]->status(1);
57-
$records->[$n]->sub_status(1);
58-
$userProblems[$n]->status(1);
59-
$userProblems[$n]->sub_status(1);
60-
$db->putUserProblem($userProblems[$n]);
54+
my %userProblems =
55+
map { $_->problem_id => $_ } $db->getUserProblemsWhere({ user_id => $set->user_id, set_id => $set->set_id });
56+
for my $problem (@$records) {
57+
my $userProblem = $userProblems{$problem->problem_id};
58+
$problem->status(1);
59+
$problem->sub_status(1);
60+
$userProblem->status(1);
61+
$userProblem->sub_status(1);
62+
$db->putUserProblem($userProblem);
6163
}
6264

6365
return $c->maketext(q(Assignment's grade increased from [_1]% to 100%.), $self->{old_grade});

‎lib/WeBWorK/AchievementItems/HalfCreditSet.pm

+9-7
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,15 @@ sub print_form ($self, $set, $records, $c) {
6060
sub use_item ($self, $set, $records, $c) {
6161
my $db = $c->db;
6262

63-
my @userProblems = $db->getUserProblemsWhere({ user_id => $set->user_id, set_id => $set->set_id }, 'problem_id');
64-
for my $n (0 .. $#userProblems) {
65-
$records->[$n]->status($records->[$n]->status > 0.5 ? 1 : $records->[$n]->status + 0.5);
66-
$records->[$n]->sub_status($records->[$n]->status);
67-
$userProblems[$n]->status($records->[$n]->status);
68-
$userProblems[$n]->sub_status($records->[$n]->status);
69-
$db->putUserProblem($userProblems[$n]);
63+
my %userProblems =
64+
map { $_->problem_id => $_ } $db->getUserProblemsWhere({ user_id => $set->user_id, set_id => $set->set_id });
65+
for my $problem (@$records) {
66+
my $userProblem = $userProblems{$problem->problem_id};
67+
$problem->status($problem->status > 0.5 ? 1 : $problem->status + 0.5);
68+
$problem->sub_status($problem->status);
69+
$userProblem->status($problem->status);
70+
$userProblem->sub_status($problem->status);
71+
$db->putUserProblem($userProblem);
7072
}
7173

7274
return $c->maketext(q(Assignment's grade increased from [_1] to [_2].), $self->{old_grade}, $self->{new_grade});

‎lib/WeBWorK/AchievementItems/ReducedCred.pm

+8-6
Original file line numberDiff line numberDiff line change
@@ -75,12 +75,14 @@ sub use_item ($self, $set, $records, $c) {
7575

7676
# Change the seed for all of the problems if the set is currently closed.
7777
if (after($set->due_date)) {
78-
my @userProblems =
79-
$db->getUserProblemsWhere({ user_id => $set->user_id, set_id => $set->set_id }, 'problem_id');
80-
for my $n (0 .. $#userProblems) {
81-
$userProblems[$n]->problem_seed($userProblems[$n]->problem_seed % 2**31 + 1);
82-
$records->[$n]->problem_seed($userProblems[$n]->problem_seed);
83-
$db->putUserProblem($userProblems[$n]);
78+
my %userProblems =
79+
map { $_->problem_id => $_ }
80+
$db->getUserProblemsWhere({ user_id => $set->user_id, set_id => $set->set_id });
81+
for my $problem (@$records) {
82+
my $userProblem = $userProblems{ $problem->problem_id };
83+
$userProblem->problem_seed($userProblem->problem_seed % 2**31 + 1);
84+
$problem->problem_seed($userProblem->problem_seed);
85+
$db->putUserProblem($userProblem);
8486
}
8587
}
8688

‎lib/WeBWorK/AchievementItems/ResurrectHW.pm

+8-9
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,14 @@ sub use_item ($self, $set, $records, $c) {
4444
my $db = $c->db;
4545
my $userSet = $db->getUserSet($set->user_id, $set->set_id);
4646

47-
# Change the seed for all of the problems if the set is currently closed.
48-
if (after($set->due_date)) {
49-
my @userProblems =
50-
$db->getUserProblemsWhere({ user_id => $set->user_id, set_id => $set->set_id }, 'problem_id');
51-
for my $n (0 .. $#userProblems) {
52-
$userProblems[$n]->problem_seed($userProblems[$n]->problem_seed % 2**31 + 1);
53-
$records->[$n]->problem_seed($userProblems[$n]->problem_seed);
54-
$db->putUserProblem($userProblems[$n]);
55-
}
47+
# Change the seed for all of the problems since the set is currently closed.
48+
my %userProblems =
49+
map { $_->problem_id => $_ } $db->getUserProblemsWhere({ user_id => $set->user_id, set_id => $set->set_id });
50+
for my $problem (@$records) {
51+
my $userProblem = $userProblems{ $problem->problem_id };
52+
$userProblem->problem_seed($userProblem->problem_seed % 2**31 + 1);
53+
$problem->problem_seed($userProblem->problem_seed);
54+
$db->putUserProblem($userProblem);
5655
}
5756

5857
# Add time to the reduced scoring date if it was defined in the first place

‎lib/WeBWorK/AchievementItems/SuperExtendDueDate.pm

+8-6
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,14 @@ sub use_item ($self, $set, $records, $c) {
5656

5757
# Change the seed for all of the problems if the set is currently closed.
5858
if (after($set->due_date)) {
59-
my @userProblems =
60-
$db->getUserProblemsWhere({ user_id => $set->user_id, set_id => $set->set_id }, 'problem_id');
61-
for my $n (0 .. $#userProblems) {
62-
$userProblems[$n]->problem_seed($userProblems[$n]->problem_seed % 2**31 + 1);
63-
$records->[$n]->problem_seed($userProblems[$n]->problem_seed);
64-
$db->putUserProblem($userProblems[$n]);
59+
my %userProblems =
60+
map { $_->problem_id => $_ }
61+
$db->getUserProblemsWhere({ user_id => $set->user_id, set_id => $set->set_id });
62+
for my $problem (@$records) {
63+
my $userProblem = $userProblems{ $problem->problem_id };
64+
$userProblem->problem_seed($userProblem->problem_seed % 2**31 + 1);
65+
$problem->problem_seed($userProblem->problem_seed);
66+
$db->putUserProblem($userProblem);
6567
}
6668
}
6769

0 commit comments

Comments
 (0)
Please sign in to comment.