Skip to content

Commit 004b647

Browse files
committed
Remove a bit of trashy code in assignment repositories and polish it so @krulis-martin likes it
1 parent a64ea26 commit 004b647

File tree

3 files changed

+31
-45
lines changed

3 files changed

+31
-45
lines changed

app/model/repository/AssignmentSolutions.php

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use Kdyby\Doctrine\EntityManager;
88
use App\Model\Entity\AssignmentSolution;
99
use App\Model\Entity\Assignment;
10+
use Nette\Utils\Arrays;
1011

1112

1213
/**
@@ -49,7 +50,8 @@ public function findValidSolutions(Assignment $assignment, User $user) {
4950
* @return AssignmentSolution|null
5051
*/
5152
public function findBestSolution(Assignment $assignment, User $user): ?AssignmentSolution {
52-
return $this->findBestSolutionsForAssignments([$assignment], $user)[$assignment->getId()]->value;
53+
$solutions = $this->findBestSolutionsForAssignments([$assignment], $user);
54+
return Arrays::get($solutions, $assignment->getId(), null);
5355
}
5456

5557
/**
@@ -87,36 +89,33 @@ private function findValidSolutionsForAssignments(array $assignments, User $user
8789
* Find best solutions of given assignments for user.
8890
* @param Assignment[] $assignments
8991
* @param User $user
90-
* @return Pair[] An associative array (indexed by assignment id) of pairs where the first item is
91-
* an assignment entity and the second is a solution entity (the best one for the assignment)
92+
* @return AssignmentSolution[] An associative array indexed by assignment id
93+
* with values of a solution entity (the best one for the assignment)
9294
*/
9395
public function findBestSolutionsForAssignments(array $assignments, User $user): array {
9496
$result = [];
95-
foreach ($assignments as $assignment) {
96-
$result[$assignment->getId()] = new Pair($assignment, null);
97-
}
98-
9997
$solutions = $this->findValidSolutionsForAssignments($assignments, $user);
10098
foreach ($solutions as $solution) {
10199
$assignment = $solution->getAssignment();
102-
$best = $result[$assignment->getId()]->value;
100+
$best = Arrays::get($result, $assignment->getId(), null);
103101

104102
if ($best === null) {
105-
$result[$assignment->getId()]->value = $solution;
103+
$result[$assignment->getId()] = $solution;
106104
continue;
107105
}
108106

107+
109108
if ($best->isAccepted()) {
110109
continue;
111110
}
112111

113112
if ($solution->isAccepted()) {
114-
$result[$assignment->getId()]->value = $solution;
113+
$result[$assignment->getId()] = $solution;
115114
continue;
116115
}
117116

118117
if ($best->getTotalPoints() < $solution->getTotalPoints()) {
119-
$result[$assignment->getId()]->value = $solution;
118+
$result[$assignment->getId()] = $solution;
120119
}
121120
}
122121

app/model/repository/ShadowAssignmentPointsRepository.php

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,24 +21,19 @@ public function __construct(EntityManager $em) {
2121
* Find points for given user of given assignments.
2222
* @param ShadowAssignment[] $shadowAssignments
2323
* @param User $awardee
24-
* @return Pair[] indexed by the shadow assignment identification, value is
25-
* pair which key is assignment and value is points. Points can be null if
26-
* there are no points for the assignment and user
24+
* @return ShadowAssignmentPoints[] indexed by the shadow assignment
25+
* identification, value is shadow assignment points for the assignment
2726
*/
2827
public function findPointsForAssignments(array $shadowAssignments, User $awardee): array {
29-
$result = [];
30-
foreach ($shadowAssignments as $assignment) {
31-
$result[$assignment->getId()] = new Pair($assignment, null);
32-
}
33-
3428
$pointsList = $this->findBy([
3529
"awardee" => $awardee,
3630
"shadowAssignment" => $shadowAssignments, // doctrine will handle given array with IN operator
3731
]);
3832

3933
/** @var ShadowAssignmentPoints $points */
34+
$result = [];
4035
foreach ($pointsList as $points) {
41-
$result[$points->getShadowAssignment()->getId()]->value = $points;
36+
$result[$points->getShadowAssignment()->getId()] = $points;
4237
}
4338
return $result;
4439
}

app/model/view/GroupViewFactory.php

Lines changed: 17 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
use App\Security\ACL\IShadowAssignmentPermissions;
2121
use App\Security\ACL\IGroupPermissions;
2222
use Doctrine\Common\Collections\Collection;
23+
use Nette\Utils\Arrays;
2324

2425

2526
/**
@@ -63,19 +64,14 @@ public function __construct(AssignmentSolutions $assignmentSolutions,
6364

6465
/**
6566
* Get total sum of points which given user gained in given solutions.
66-
* @param Pair[] $solutions list of pairs, second item is solution, can be null
67+
* @param AssignmentSolution[] $solutions list of assignment solutions
6768
* @return int
6869
*/
6970
private function getPointsGainedByStudentForSolutions(array $solutions) {
7071
return array_reduce(
7172
$solutions,
72-
function ($carry, Pair $solutionPair) {
73-
$best = $solutionPair->value;
74-
if ($best !== null) {
75-
$carry += $best->getTotalPoints();
76-
}
77-
78-
return $carry;
73+
function ($carry, AssignmentSolution $solution) {
74+
return $carry + $solution->getTotalPoints();
7975
},
8076
0
8177
);
@@ -88,12 +84,8 @@ function ($carry, Pair $solutionPair) {
8884
*/
8985
private function getPointsForShadowAssignments(array $shadowPointsList): int {
9086
return array_reduce($shadowPointsList,
91-
function ($carry, Pair $pointsPair) {
92-
$points = $pointsPair->value;
93-
if ($points !== null) {
94-
$carry += $points->getPoints();
95-
}
96-
return $carry;
87+
function ($carry, ShadowAssignmentPoints $points) {
88+
return $carry + $points->getPoints();
9789
},
9890
0);
9991
}
@@ -107,18 +99,16 @@ function ($carry, Pair $pointsPair) {
10799
public function getStudentsStats(Group $group, User $student) {
108100
$maxPoints = $group->getMaxPoints();
109101
$assignmentSolutions = $this->assignmentSolutions->findBestSolutionsForAssignments($group->getAssignments()->getValues(), $student);
110-
$shadowPointsList = $this->shadowAssignmentPointsRepository->findPointsForAssignments($group->getShadowAssignments()->getValues(), $student);
102+
$shadowPointsMap = $this->shadowAssignmentPointsRepository->findPointsForAssignments($group->getShadowAssignments()->getValues(), $student);
111103
$gainedPoints = $this->getPointsGainedByStudentForSolutions($assignmentSolutions);
112-
$gainedPoints += $this->getPointsForShadowAssignments($shadowPointsList);
104+
$gainedPoints += $this->getPointsForShadowAssignments($shadowPointsMap);
113105

114106
$assignments = [];
115-
foreach ($assignmentSolutions as $solutionPair) {
107+
foreach ($group->getAssignments()->getValues() as $assignment) {
116108
/**
117109
* @var Assignment $assignment
118-
* @var AssignmentSolution $best
119110
*/
120-
$assignment = $solutionPair->key;
121-
$best = $solutionPair->value;
111+
$best = Arrays::get($assignmentSolutions, $assignment->getId(), null);
122112
$submission = $best ? $best->getLastSubmission() : null;
123113

124114
$assignments[] = [
@@ -133,14 +123,16 @@ public function getStudentsStats(Group $group, User $student) {
133123
}
134124

135125
$shadowAssignments = [];
136-
foreach ($shadowPointsList as $pointsPair) {
137-
$assignment = $pointsPair->key;
138-
$shadowPoints = $pointsPair->value;
126+
foreach ($group->getShadowAssignments()->getValues() as $shadowAssignment) {
127+
/**
128+
* @var ShadowAssignment $shadowAssignment
129+
*/
130+
$shadowPoints = Arrays::get($shadowPointsMap, $shadowAssignment->getId(), null);
139131

140132
$shadowAssignments[] = [
141-
"id" => $assignment->getId(),
133+
"id" => $shadowAssignment->getId(),
142134
"points" => [
143-
"total" => $assignment->getMaxPoints(),
135+
"total" => $shadowAssignment->getMaxPoints(),
144136
"gained" => $shadowPoints ? $shadowPoints->getPoints() : null
145137
]
146138
];

0 commit comments

Comments
 (0)