Passed
Pull Request — master (#53)
by Matthew
04:39
created

PickRepository::SearchSplit()   B

Complexity

Conditions 6
Paths 16

Size

Total Lines 42
Code Lines 26

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 26
dl 0
loc 42
rs 8.8817
c 0
b 0
f 0
cc 6
nc 16
nop 3
1
<?php
2
namespace PhpDraft\Domain\Repositories;
3
4
use Silex\Application;
5
use PhpDraft\Domain\Entities\Pick;
6
use PhpDraft\Domain\Entities\Draft;
7
use PhpDraft\Domain\Models\PickSearchModel;
8
9
class PickRepository {
10
  private $app;
11
12
  public function __construct(Application $app) {
13
    $this->app = $app;
14
  }
15
16
  //Used for when a pick is entered (made)
17
  public function AddPick(Pick $pick) {
18
    $add_stmt = $this->app['db']->prepare("UPDATE players
19
      SET first_name = ?, last_name = ?, team = ?, position = ?, player_counter = ?, pick_time = ?, pick_duration = ?
20
      WHERE player_id = ?");
21
22
    $add_stmt->bindParam(1, $pick->first_name);
23
    $add_stmt->bindParam(2, $pick->last_name);
24
    $add_stmt->bindParam(3, $pick->team);
25
    $add_stmt->bindParam(4, $pick->position);
26
    $add_stmt->bindParam(5, $pick->player_counter);
27
    $add_stmt->bindParam(6, $pick->pick_time);
28
    $add_stmt->bindParam(7, $pick->pick_duration);
29
    $add_stmt->bindParam(8, $pick->player_id);
30
31
    if (!$add_stmt->execute()) {
32
      throw new Exception("Unable to save pick #$pick->player_pick.");
0 ignored issues
show
Bug introduced by
The type PhpDraft\Domain\Repositories\Exception was not found. Did you mean Exception? If so, make sure to prefix the type with \.
Loading history...
33
    }
34
35
    return $pick;
36
  }
37
38
  public function Load($id) {
39
    $pick = new Pick();
40
41
    $pick_stmt = $this->app['db']->prepare("SELECT p.*, m.manager_name, m.manager_id FROM players p
42
      LEFT OUTER JOIN managers m ON p.manager_id = m.manager_id
43
      WHERE player_id = ? LIMIT 1");
44
    $pick_stmt->bindParam(1, $id);
45
46
    $pick_stmt->setFetchMode(\PDO::FETCH_INTO, $pick);
47
48
    if (!$pick_stmt->execute() || !$pick_stmt->fetch()) {
49
      throw new \Exception("Unable to load pick " . $id);
50
    }
51
52
    $pick->selected = strlen($pick->pick_time) > 0 && $pick->pick_duration > 0;
53
54
    return $pick;
55
  }
56
57
  //Is used by public draft board, need to consider serpentine or standard ordering
58
  public function LoadAll(Draft $draft) {
59
    $picks = array();
60
61
    $sort = true;
62
    for ($i = 1; $i <= $draft->draft_rounds; ++$i) {
63
      if ($draft->draft_style == "serpentine") {
64
        $picks[] = $this->LoadRoundPicks($draft, $i, $sort, false);
65
        $sort = $sort ? false : true;
66
      } else {
67
        $picks[] = $this->LoadRoundPicks($draft, $i, true, false);
68
      }
69
    }
70
71
    return $picks;
72
  }
73
74
  public function LoadUpdatedPicks($draft_id, $pick_counter) {
75
    $picks = array();
76
77
    $stmt = $this->app['db']->prepare("SELECT p.*, m.manager_name FROM players p " .
78
            "LEFT OUTER JOIN managers m " .
79
            "ON m.manager_id = p.manager_id " .
80
            "WHERE p.draft_id = ? " .
81
            "AND p.player_counter > ? ORDER BY p.player_counter");
82
83
    $stmt->bindParam(1, $draft_id);
84
    $stmt->bindParam(2, $pick_counter);
85
86
    $stmt->setFetchMode(\PDO::FETCH_CLASS, '\PhpDraft\Domain\Entities\Pick');
87
88
    if (!$stmt->execute()) {
89
      throw new \Exception("Unable to load updated picks.");
90
    }
91
92
    while ($pick = $stmt->fetch()) {
93
      $pick->selected = strlen($pick->pick_time) > 0 && $pick->pick_duration > 0;
94
      $picks[] = $pick;
95
    }
96
97
    return $picks;
98
  }
99
100
  public function UpdatePick(Pick $pick) {
101
    $update_stmt = $this->app['db']->prepare("UPDATE players SET manager_id = ?, first_name = ?, last_name = ?, team = ?, position = ?,
102
      pick_time = ?, pick_duration = ?, player_counter = ? WHERE player_id = ?");
103
104
    $update_stmt->bindParam(1, $pick->manager_id);
105
    $update_stmt->bindParam(2, $pick->first_name);
106
    $update_stmt->bindParam(3, $pick->last_name);
107
    $update_stmt->bindParam(4, $pick->team);
108
    $update_stmt->bindParam(5, $pick->position);
109
    $update_stmt->bindParam(6, $pick->pick_time);
110
    $update_stmt->bindParam(7, $pick->pick_duration);
111
    $update_stmt->bindParam(8, $pick->player_counter);
112
    $update_stmt->bindParam(9, $pick->player_id);
113
114
    if (!$update_stmt->execute()) {
115
      throw new \Exception("Unable to update pick #$pick->player_id");
116
    }
117
118
    return $pick;
119
  }
120
121
  //Used for when a pick has been updated on the depth chart (public-ish)
122
  public function UpdatePickDepthChart(Pick $pick) {
123
    $update_stmt = $this->app['db']->prepare("UPDATE players SET depth_chart_position_id = ?, position_eligibility = ? WHERE player_id = ?");
124
125
    $update_stmt->bindParam(1, $pick->depth_chart_position_id);
126
    $update_stmt->bindParam(2, $pick->position_eligibility);
0 ignored issues
show
Bug introduced by
The property position_eligibility does not exist on PhpDraft\Domain\Entities\Pick. Did you mean position?
Loading history...
127
    $update_stmt->bindParam(3, $pick->player_id);
128
129
    if (!$update_stmt->execute()) {
130
      throw new \Exception("Unable to update pick #$pick->player_id for depth chart.");
131
    }
132
133
    return $pick;
134
  }
135
136
  public function GetCurrentPick(Draft $draft) {
137
    $stmt = $this->app['db']->prepare("SELECT p.*, m.manager_id, m.manager_name " .
138
            "FROM players p " .
139
            "LEFT OUTER JOIN managers m " .
140
            "ON m.manager_id = p.manager_id " .
141
            "WHERE p.draft_id = ? " .
142
            "AND p.player_round = ? " .
143
            "AND p.player_pick = ? " .
144
            "LIMIT 1");
145
146
    $stmt->bindParam(1, $draft->draft_id);
147
    $stmt->bindParam(2, $draft->draft_current_round);
148
    $stmt->bindParam(3, $draft->draft_current_pick);
149
150
    //Saw some extra numbered properties in the object when a FETCH_CLASS was performed instead. Possibly from the JOIN? Use FETCH_INTO instead:
151
    $current_pick = new Pick();
152
    $stmt->setFetchMode(\PDO::FETCH_INTO, $current_pick);
153
154
    if (!$stmt->execute()) {
155
      throw new \Exception("Unable to get current pick.");
156
    }
157
158
    if ($stmt->rowCount() == 0) {
159
      throw new \Exception("Unable to get current pick.");
160
    }
161
162
    $stmt->fetch();
163
164
    $current_pick->selected = strlen($current_pick->pick_time) > 0 && $current_pick->pick_duration > 0;
165
    $current_pick->on_the_clock = true;
166
167
    return $current_pick;
168
  }
169
170
  public function GetPreviousPick(Draft $draft) {
171
    $stmt = $this->app['db']->prepare("SELECT p.*, m.manager_id, m.manager_name " .
172
            "FROM players p " .
173
            "LEFT OUTER JOIN managers m " .
174
            "ON m.manager_id = p.manager_id " .
175
            "WHERE p.draft_id = ? " .
176
            "AND p.player_pick = ? " .
177
            "AND p.pick_time IS NOT NULL " .
178
            "LIMIT 1");
179
180
    $stmt->bindParam(1, $draft->draft_id);
181
    $stmt->bindParam(2, $previous_pick_number);
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $previous_pick_number does not exist. Did you maybe mean $previous_pick?
Loading history...
182
183
    $previous_pick_number = ($draft->draft_current_pick - 1);
0 ignored issues
show
Unused Code introduced by
The assignment to $previous_pick_number is dead and can be removed.
Loading history...
184
185
    $previous_pick = new Pick();
186
    $stmt->setFetchMode(\PDO::FETCH_INTO, $previous_pick);
187
188
    if (!$stmt->execute()) {
189
      throw new \Exception("Unable to get last pick: " . implode(":", $stmt->errorInfo()));
190
    }
191
192
    if ($stmt->rowCount() == 0) {
193
      return null;
194
    }
195
196
    $stmt->fetch();
197
198
    $previous_pick->selected = strlen($previous_pick->pick_time) > 0 && $previous_pick->pick_duration > 0;
199
    $previous_pick->on_the_clock = false;
200
201
    return $previous_pick;
202
  }
203
204
  public function GetNextPick(Draft $draft) {
205
    $stmt = $this->app['db']->prepare("SELECT p.*, m.manager_id, m.manager_name " .
206
            "FROM players p " .
207
            "LEFT OUTER JOIN managers m " .
208
            "ON m.manager_id = p.manager_id " .
209
            "WHERE p.draft_id = ? " .
210
            "AND p.player_pick = ? LIMIT 1");
211
212
    $stmt->bindParam(1, $draft->draft_id);
213
    $stmt->bindParam(2, $current_pick_number);
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $current_pick_number seems to be never defined.
Loading history...
214
215
    $current_pick_number = $draft->draft_current_pick + 1;
0 ignored issues
show
Unused Code introduced by
The assignment to $current_pick_number is dead and can be removed.
Loading history...
216
217
    $next_pick = new Pick();
218
    $stmt->setFetchMode(\PDO::FETCH_INTO, $next_pick);
219
220
    if (!$stmt->execute()) {
221
      throw new Exception("Unable to get next pick.");
222
    }
223
224
    if ($stmt->rowCount() == 0) {
225
      return null;
226
    }
227
228
    $stmt->fetch();
229
230
    $next_pick->on_the_clock = true;
231
232
    return $next_pick;
233
  }
234
235
  public function LoadLastPicks($draft_id, $amount) {
236
    $picks = array();
237
238
    $stmt = $this->app['db']->prepare("SELECT p.*, m.manager_name, m.manager_id FROM players p " .
239
            "LEFT OUTER JOIN managers m " .
240
            "ON m.manager_id = p.manager_id " .
241
            "WHERE p.draft_id = ? " .
242
            "AND p.pick_time IS NOT NULL " .
243
            "AND p.pick_duration IS NOT NULL " .
244
            "ORDER BY p.player_pick DESC " .
245
            "LIMIT ?");
246
247
    $stmt->bindParam(1, $draft_id);
248
    $stmt->bindParam(2, $amount, \PDO::PARAM_INT);
249
250
    $stmt->setFetchMode(\PDO::FETCH_CLASS, '\PhpDraft\Domain\Entities\Pick');
251
252
    if (!$stmt->execute()) {
253
      throw new Exception("Unable to load last $amount picks.");
254
    }
255
256
    while ($pick = $stmt->fetch()) {
257
      $pick->selected = strlen($pick->pick_time) > 0 && $pick->pick_duration > 0;
258
      $picks[] = $pick;
259
    }
260
261
    return $picks;
262
  }
263
264
  public function LoadNextPicks($draft_id, $currentPick, $amount) {
265
    $picks = array();
266
267
    $stmt = $this->app['db']->prepare("SELECT p.*, m.manager_name, m.manager_id FROM players p " .
268
            "LEFT OUTER JOIN managers m " .
269
            "ON m.manager_id = p.manager_id " .
270
            "WHERE p.draft_id = ? " .
271
            "AND p.player_pick >= ? " .
272
            "ORDER BY p.player_pick ASC " .
273
            "LIMIT ?");
274
275
    $stmt->bindParam(1, $draft_id);
276
    $stmt->bindParam(2, $currentPick);
277
    $stmt->bindParam(3, $amount, \PDO::PARAM_INT);
278
279
    $stmt->setFetchMode(\PDO::FETCH_CLASS, '\PhpDraft\Domain\Entities\Pick');
280
281
    if (!$stmt->execute()) {
282
      throw new Exception("Unable to load next $amount picks.");
283
    }
284
285
    while ($pick = $stmt->fetch()) {
286
      $pick->selected = strlen($pick->pick_time) > 0 && $pick->pick_duration > 0;
287
      $pick->on_the_clock = $pick->player_pick == $currentPick;
288
289
      $picks[] = $pick;
290
    }
291
292
    return $picks;
293
  }
294
295
  public function LoadManagerPicks($manager_id, $draft = null, $selected = true) {
296
    $manager_id = (int)$manager_id;
297
298
    if ($manager_id == 0) {
299
      throw new \Exception("Unable to get manager #" . $manager_id . "'s picks.");
300
    }
301
302
    $picks = array();
303
304
    $stmt = $selected
305
      ? $this->app['db']->prepare("SELECT * FROM players WHERE manager_id = ? AND pick_time IS NOT NULL ORDER BY player_pick ASC")
306
      : $this->app['db']->prepare("SELECT * FROM players WHERE manager_id = ? ORDER BY player_pick ASC");
307
308
    $stmt->bindParam(1, $manager_id);
309
310
    $stmt->setFetchMode(\PDO::FETCH_CLASS, '\PhpDraft\Domain\Entities\Pick');
311
312
    if (!$stmt->execute()) {
313
      throw new \Exception("Unable to load manager #$manager_id's picks.");
314
    }
315
316
    while ($pick = $stmt->fetch()) {
317
      $pick->player_pick = (int)$pick->player_pick;
318
      $pick->selected = strlen($pick->pick_time) > 0 && $pick->pick_duration > 0;
319
      $pick->on_the_clock = $draft != null && $pick->player_pick == $draft->draft_current_pick;
320
321
      $picks[] = $pick;
322
    }
323
324
    return $picks;
325
  }
326
327
  public function LoadRoundPicks(Draft $draft, $draft_round, $sort_ascending = true, $selected = true) {
328
    $picks = array();
329
    $sortOrder = $sort_ascending ? "ASC" : "DESC";
330
331
    $stmt = $selected
332
      ? $this->app['db']->prepare("SELECT p.*, m.manager_name FROM players p " .
333
            "LEFT OUTER JOIN managers m " .
334
            "ON m.manager_id = p.manager_id " .
335
            "WHERE p.draft_id = ? " .
336
            " AND p.player_round = ? AND p.pick_time IS NOT NULL ORDER BY p.player_pick " . $sortOrder)
337
      : $this->app['db']->prepare("SELECT p.*, m.manager_name FROM players p " .
338
            "LEFT OUTER JOIN managers m " .
339
            "ON m.manager_id = p.manager_id " .
340
            "WHERE p.draft_id = ? " .
341
            " AND p.player_round = ? ORDER BY p.player_pick " . $sortOrder);
342
343
    $stmt->bindParam(1, $draft->draft_id);
344
    $stmt->bindParam(2, $draft_round);
345
346
    $stmt->setFetchMode(\PDO::FETCH_CLASS, '\PhpDraft\Domain\Entities\Pick');
347
348
    if (!$stmt->execute()) {
349
      throw new \Exception("Unable to load round #$round's picks.");
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $round seems to be never defined.
Loading history...
350
    }
351
352
    while ($pick = $stmt->fetch()) {
353
      $pick->selected = strlen($pick->pick_time) > 0 && $pick->pick_duration > 0;
354
      $pick->on_the_clock = $draft != null && $pick->player_pick == $draft->draft_current_pick;
355
356
      $picks[] = $pick;
357
    }
358
359
    return $picks;
360
  }
361
362
  public function DeleteAllPicks($draft_id) {
363
    $delete_stmt = $this->app['db']->prepare("DELETE FROM players WHERE draft_id = ?");
364
    $delete_stmt->bindParam(1, $draft_id);
365
366
    if (!$delete_stmt->execute()) {
367
      throw new \Exception("Unable to delete picks for $draft_id.");
368
    }
369
370
    return;
371
  }
372
373
  /*This logic will create all pick objects according to the draft information.
374
    The two lists are used in alternation for serpentine drafts. Only first list is
375
    used for standard drafts.*/
376
  public function SetupPicks(Draft $draft, $ascending_managers, $descending_managers = null) {
377
    $pick = 1;
378
    $even = true;
379
380
    for ($current_round = 1; $current_round <= $draft->draft_rounds; $current_round++) {
381
      if ($draft->draft_style == "serpentine") {
382
        if ($even) {
383
          $managers = $ascending_managers;
384
          $even = false;
385
        } else {
386
          if ($descending_managers == null) {
387
            throw new \Exception("Descending managers list is empty - unable to setup draft.");
388
          }
389
390
          $managers = $descending_managers;
391
          $even = true;
392
        }
393
      } else {
394
        $managers = $ascending_managers;
395
      }
396
397
      foreach ($managers as $manager) {
398
        $new_pick = new Pick();
399
        $new_pick->manager_id = $manager->manager_id;
400
        $new_pick->draft_id = $draft->draft_id;
401
        $new_pick->player_round = $current_round;
402
        $new_pick->player_pick = $pick;
403
404
        try {
405
          $this->_saveSetupPick($new_pick);
406
        } catch (Exception $e) {
407
          throw new Exception($e->getMessage());
408
        }
409
410
        $pick++;
411
      }
412
    }
413
    return;
414
  }
415
416
  //Used when SetupPicks is called, which is when a draft is flipped to "in_progress"
417
  private function _saveSetupPick(Pick $pick) {
418
    $insert_stmt = $this->app['db']->prepare("INSERT INTO players
419
      (manager_id, draft_id, player_round, player_pick)
420
      VALUES
421
      (?, ?, ?, ?)");
422
423
    $insert_stmt->bindParam(1, $pick->manager_id);
424
    $insert_stmt->bindParam(2, $pick->draft_id);
425
    $insert_stmt->bindParam(3, $pick->player_round);
426
    $insert_stmt->bindParam(4, $pick->player_pick);
427
428
    if (!$insert_stmt->execute()) {
429
      throw new \Exception("Unable to insert pick #$pick->player_pick for draft $pick->draft_id");
430
    }
431
432
    return;
433
  }
434
}
435