|
10 | 10 | use MuBench\ReviewSite\Models\Misuse; |
11 | 11 | use MuBench\ReviewSite\Models\Review; |
12 | 12 | use MuBench\ReviewSite\Models\Reviewer; |
13 | | -use MuBench\ReviewSite\Models\ReviewState; |
14 | 13 | use MuBench\ReviewSite\Models\Run; |
15 | 14 | use MuBench\ReviewSite\Models\Tag; |
16 | 15 | use MuBench\ReviewSite\Models\Violation; |
@@ -39,26 +38,10 @@ public function getReview(Request $request, Response $response, array $args) |
39 | 38 | $resolution_reviewer = Reviewer::where(['name' => 'resolution'])->first(); |
40 | 39 | $is_reviewer = ($this->user && $reviewer && $this->user->id == $reviewer->id) || ($reviewer && $reviewer->id == $resolution_reviewer->id); |
41 | 40 |
|
42 | | - $runs = RunsController::getRuns($detector, $experiment, $ex2_review_size); |
43 | | - |
44 | | - $limited_all_misuses = $this->collectAllMisuses($runs); |
| 41 | + $runs = Run::of($detector)->in($experiment)->orderBy('project_muid')->orderBy('version_muid')->get(); |
45 | 42 |
|
46 | 43 | list($previous_misuse, $next_misuse, $next_reviewable_misuse, $misuse) = |
47 | | - $this->determineNavigationTargets($limited_all_misuses, $project_muid, $version_muid, $misuse_muid, $reviewer); |
48 | | - |
49 | | - if(!$misuse){ |
50 | | - $runs = Run::of($detector)->in($experiment)->orderBy('project_muid')->orderBy('version_muid')->get(); |
51 | | - |
52 | | - $all_misuses = $this->collectAllMisuses($runs); |
53 | | - |
54 | | - list($previous_misuse, $next_misuse, $next_reviewable_misuse, $misuse) = |
55 | | - $this->determineNavigationTargets($all_misuses, $project_muid, $version_muid, $misuse_muid, $reviewer); |
56 | | - |
57 | | - $next_misuse = $all_misuses->first(); |
58 | | - if($limited_all_misuses->where('id', $next_reviewable_misuse->id)->isEmpty()){ |
59 | | - $next_reviewable_misuse = null; |
60 | | - } |
61 | | - } |
| 44 | + $this->determineNavigationTargets($runs, $experiment, $project_muid, $version_muid, $misuse_muid, $reviewer, $ex2_review_size); |
62 | 45 |
|
63 | 46 | $all_violations = Violation::all(); |
64 | 47 | $all_tags = Tag::all()->sortBy('name'); |
@@ -165,52 +148,115 @@ public function updateOrCreateReview($misuse_id, $reviewer_id, $comment, $findin |
165 | 148 | } |
166 | 149 | } |
167 | 150 |
|
168 | | - private function collectAllMisuses($runs) |
169 | | - { |
170 | | - $all_misuses = new Collection; |
171 | | - foreach ($runs as $run) { |
172 | | - $all_misuses = $all_misuses->merge($run->misuses); |
173 | | - } |
174 | | - return $all_misuses; |
175 | | - } |
176 | | - |
177 | | - function determineNavigationTargets(Collection $all_misuses, $project_muid, $version_muid, $misuse_muid, $reviewer) |
| 151 | + function determineNavigationTargets(Collection $runs, $experiment, $project_muid, $version_muid, $misuse_muid, $reviewer, $ex2_review_size) |
178 | 152 | { |
179 | | - $previous_misuse = $all_misuses->last(); |
| 153 | + $previous_misuse = NULL; |
180 | 154 | $misuse = NULL; |
181 | 155 | $next_misuse = NULL; |
182 | 156 | $next_reviewable_misuse = NULL; |
| 157 | + $last_run = $runs->last(); |
183 | 158 |
|
184 | | - foreach ($all_misuses as $current_misuse) { /** @var Misuse $current_misuse */ |
185 | | - if (!$misuse && $current_misuse->getProject() === $project_muid |
186 | | - && $current_misuse->getVersion() === $version_muid |
187 | | - && $current_misuse->misuse_muid === $misuse_muid) { |
188 | | - $misuse = $current_misuse; |
189 | | - } else { |
190 | | - if ($misuse && !$next_misuse) { |
191 | | - $next_misuse = $current_misuse; |
| 159 | + foreach ($runs as $run) { |
| 160 | + if ($misuse && !$next_misuse) { |
| 161 | + $next_misuse = $run->getMisuses($experiment, $ex2_review_size)->first(); |
| 162 | + } |
| 163 | + if (!$misuse && $run->project_muid == $project_muid && $run->version_muid == $version_muid) { |
| 164 | + $this->findMisuse($run->getMisuses($experiment, $ex2_review_size), $misuse_muid, $reviewer, $previous_misuse, $misuse, $next_misuse, $next_reviewable_misuse); |
| 165 | + if($misuse && !$previous_misuse){ |
| 166 | + $previous_misuse = $last_run->getMisuses($experiment, $ex2_review_size)->last(); |
192 | 167 | } |
193 | | - $is_current_misuse_reviewable = $current_misuse->getReviewState() === ReviewState::NEEDS_REVIEW |
194 | | - && !$current_misuse->hasReviewed($reviewer); |
195 | | - $first_reviewable_misuse = !$next_reviewable_misuse && $is_current_misuse_reviewable; |
196 | | - $first_reviewable_misuse_after = $misuse && $is_current_misuse_reviewable; |
197 | | - if ($first_reviewable_misuse || $first_reviewable_misuse_after) { |
198 | | - $next_reviewable_misuse = $current_misuse; |
199 | | - if ($misuse) { |
200 | | - break; |
| 168 | + if(!$misuse){ |
| 169 | + // search for misuse out of review scope |
| 170 | + foreach($run->misuses as $current_misuse){ |
| 171 | + if($current_misuse->misuse_muid == $misuse_muid){ |
| 172 | + $misuse = $current_misuse; |
| 173 | + break; |
| 174 | + } |
| 175 | + $previous_misuse = $current_misuse; |
201 | 176 | } |
202 | 177 | } |
| 178 | + } elseif ($misuse && !$next_reviewable_misuse) { |
| 179 | + $next_reviewable_misuse = $this->findNextReviewableMisuse($run->getMisuses($experiment, $ex2_review_size), $reviewer); |
| 180 | + } |
| 181 | + |
| 182 | + if ($next_misuse && $next_reviewable_misuse) { |
| 183 | + break; |
| 184 | + } |
| 185 | + $last_run = $run; |
| 186 | + } |
| 187 | + if ($misuse && !$next_misuse) { |
| 188 | + $next_misuse = $runs->first()->getMisuses($experiment, $ex2_review_size)->first(); |
| 189 | + } |
| 190 | + if(!$next_reviewable_misuse){ |
| 191 | + $next_reviewable_misuse = $this->findNextReviewableBeforeMisuse($runs, $experiment, $project_muid, $version_muid, $misuse, $reviewer, $ex2_review_size); |
| 192 | + } |
| 193 | + if(!$previous_misuse){ |
| 194 | + $previous_misuse = $this->findPreviousMisuse($runs, $misuse); |
| 195 | + } |
| 196 | + return array($previous_misuse, $next_misuse, $next_reviewable_misuse, $misuse); |
| 197 | + } |
| 198 | + |
| 199 | + private function findMisuse(Collection $misuses, $misuse_muid, $reviewer, &$previous_misuse, &$misuse, &$next_misuse, &$next_reviewable_misuse) |
| 200 | + { |
| 201 | + foreach ($misuses as $current_misuse) { |
| 202 | + if ($misuse && !$next_misuse) { |
| 203 | + $next_misuse = $current_misuse; |
| 204 | + } |
| 205 | + if ($misuse && !$current_misuse->hasReviewed($reviewer) && !$current_misuse->hasSufficientReviews()) { |
| 206 | + $next_reviewable_misuse = $current_misuse; |
| 207 | + break; |
| 208 | + } |
| 209 | + if (!$misuse && $current_misuse->misuse_muid == $misuse_muid) { |
| 210 | + $misuse = $current_misuse; |
| 211 | + |
203 | 212 | } |
204 | 213 | if (!$misuse) { |
205 | 214 | $previous_misuse = $current_misuse; |
206 | 215 | } |
207 | 216 | } |
| 217 | + } |
208 | 218 |
|
209 | | - if (!$next_misuse) { |
210 | | - $next_misuse = $all_misuses->first(); |
| 219 | + private function findPreviousMisuse(Collection $runs, $misuse) |
| 220 | + { |
| 221 | + $previous_misuse = NULL; |
| 222 | + $idx = sizeof($runs) - 1; |
| 223 | + while(!$previous_misuse && $idx >= 0){ |
| 224 | + $run = $runs->get($idx); |
| 225 | + $previous_misuse = $run->misuses->last(); |
| 226 | + if($previous_misuse && ($misuse->id == $previous_misuse->id)){ |
| 227 | + $previous_misuse = NULL; |
| 228 | + } |
| 229 | + $idx--; |
211 | 230 | } |
| 231 | + return $previous_misuse; |
| 232 | + } |
212 | 233 |
|
213 | | - return array($previous_misuse, $next_misuse, $next_reviewable_misuse, $misuse); |
| 234 | + private function findNextReviewableMisuse(Collection $misuses, $reviewer) |
| 235 | + { |
| 236 | + $next_reviewable_misuse = NULL; |
| 237 | + foreach ($misuses as $current_misuse) { |
| 238 | + if (!$current_misuse->hasReviewed($reviewer) && !$current_misuse->hasSufficientReviews()) { |
| 239 | + $next_reviewable_misuse = $current_misuse; |
| 240 | + break; |
| 241 | + } |
| 242 | + } |
| 243 | + return $next_reviewable_misuse; |
| 244 | + } |
| 245 | + |
| 246 | + private function findNextReviewableBeforeMisuse(Collection $runs, $experiment, $project_muid, $version_muid, $misuse, $reviewer, $ex2_review_size) |
| 247 | + { |
| 248 | + $next_reviewable_misuse = NULL; |
| 249 | + foreach($runs as $run){ |
| 250 | + $next_reviewable_misuse = $this->findNextReviewableMisuse($run->getMisuses($experiment, $ex2_review_size), $reviewer); |
| 251 | + |
| 252 | + if($run->project_muid == $project_muid && $run->version_muid == $version_muid){ |
| 253 | + break; |
| 254 | + } |
| 255 | + } |
| 256 | + if($next_reviewable_misuse && $misuse->id == $next_reviewable_misuse->id) { |
| 257 | + return NULL; |
| 258 | + } |
| 259 | + return $next_reviewable_misuse; |
214 | 260 | } |
215 | 261 |
|
216 | 262 | } |
0 commit comments