Passed
Branch 2.3.0 (f3b97b)
by Matthew
06:16
created

PickSearchRepository::SearchLoose()   C

Complexity

Conditions 10
Paths 256

Size

Total Lines 61
Code Lines 36

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 36
dl 0
loc 61
rs 6.1333
c 0
b 0
f 0
cc 10
nc 256
nop 1

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
namespace PhpDraft\Domain\Repositories;
3
4
use Silex\Application;
5
use PhpDraft\Domain\Entities\Pick;
6
use PhpDraft\Domain\Models\PickSearchModel;
7
8
class PickSearchRepository {
9
  private $app;
10
11
  public function __construct(Application $app) {
12
    $this->app = $app;
13
  }
14
15
  /**
16
   * Searches for picks with strict criteria, using the MATCH() and score method. Sorts by score ASC first, then pick DESC last.
17
   * @param int $draft_id
18
   */
19
  public function SearchStrict(PickSearchModel $searchModel) {
20
    $draft_id = (int)$searchModel->draft_id;
21
    $param_number = 4;
22
    $players = array();
23
24
    $sql = "SELECT p.*, m.manager_name, MATCH (p.first_name, p.last_name) AGAINST (?) as search_score " .
25
            "FROM players p LEFT OUTER JOIN managers m ON m.manager_id = p.manager_id WHERE MATCH (p.first_name, p.last_name) AGAINST (?) AND p.draft_id = ? ";
26
27
    if ($searchModel->hasTeam()) {
28
      $sql .= "AND p.team = ? ";
29
    }
30
31
    if ($searchModel->hasPosition()) {
32
      $sql .= "AND p.position = ? ";
33
    }
34
35
    $sql .= "AND p.pick_time IS NOT NULL ORDER BY search_score ASC, p.player_pick $searchModel->sort";
36
37
    $stmt = $this->app['db']->prepare($sql);
38
    $stmt->bindParam(1, $searchModel->keywords);
39
    $stmt->bindParam(2, $searchModel->keywords);
40
    $stmt->bindParam(3, $draft_id);
41
42
    if ($searchModel->hasTeam()) {
43
      $stmt->bindParam(4, $searchModel->team);
44
      $param_number++;
45
    }
46
47
    if ($searchModel->hasPosition()) {
48
      $stmt->bindParam($param_number, $searchModel->position);
49
      $param_number++;
50
    }
51
52
    $stmt->setFetchMode(\PDO::FETCH_CLASS, '\PhpDraft\Domain\Entities\Pick');
53
54
    if (!$stmt->execute()) {
55
      throw new \Exception("Unable to search for picks.");
56
    }
57
58
    while ($player = $stmt->fetch()) {
59
      $player->selected = strlen($player->pick_time) > 0 && $player->pick_duration > 0;
60
      $players[] = $player;
61
    }
62
63
    $searchModel->player_results = $players;
64
65
    return $searchModel;
66
  }
67
68
  /**
69
   * Search picks by a loose criteria that uses a LIKE %% query. Used if strict query returns 0 results. Sorts by pick DESC.
70
   * @param int $draft_id
71
   */
72
  public function SearchLoose(PickSearchModel $searchModel) {
73
    $draft_id = (int)$searchModel->draft_id;
74
    $players = array();
75
    $param_number = 2;
76
    $loose_search_score = -1;
77
78
    $sql = "SELECT p.*, m.manager_name FROM players p LEFT OUTER JOIN managers m ON m.manager_id = p.manager_id WHERE p.draft_id = ? ";
79
80
    if ($searchModel->hasName()) {
81
      $sql .= "AND (p.first_name LIKE ? OR p.last_name LIKE ?)";
82
    }
83
84
    if ($searchModel->hasTeam()) {
85
      $sql .= "AND p.team = ? ";
86
    }
87
88
    if ($searchModel->hasPosition()) {
89
      $sql .= "AND p.position = ? ";
90
    }
91
92
    $sql .= "AND p.pick_time IS NOT NULL ORDER BY p.player_pick $searchModel->sort";
93
94
    $stmt = $this->app['db']->prepare($sql);
95
    $stmt->bindParam(1, $draft_id);
96
97
    if ($searchModel->hasName()) {
98
      $keywords = "%" . $searchModel->keywords . "%";
99
100
      $stmt->bindParam($param_number, $keywords);
101
      $param_number++;
102
      $stmt->bindParam($param_number, $keywords);
103
      $param_number++;
104
    }
105
106
    if ($searchModel->hasTeam()) {
107
      $stmt->bindParam($param_number, $searchModel->team);
108
      $param_number++;
109
    }
110
111
    if ($searchModel->hasPosition()) {
112
      $stmt->bindParam($param_number, $searchModel->position);
113
      $param_number++;
114
    }
115
116
    $stmt->setFetchMode(\PDO::FETCH_CLASS, '\PhpDraft\Domain\Entities\Pick');
117
118
    if (!$stmt->execute()) {
119
      throw new \Exception("Unable to search for picks.");
120
    }
121
122
    while ($player = $stmt->fetch()) {
123
      $player->search_score = $loose_search_score;
124
      $player->selected = strlen($player->pick_time) > 0 && $player->pick_duration > 0;
125
      $players[] = $player;
126
127
      $loose_search_score--;
128
    }
129
130
    $searchModel->player_results = $players;
131
132
    return $searchModel;
133
  }
134
135
  /**
136
   * Search picks by assuming a first + last combo was entered. Used if strict and loose queries return 0 and theres a space in the name. Sorts by pick DESC.
137
   * @param int $draft_id
138
   */
139
  public function SearchSplit(PickSearchModel $searchModel, $first_name, $last_name) {
140
    $draft_id = (int)$searchModel->draft_id;
141
    $players = array();
142
    $param_number = 4;
143
    $loose_search_score = -1;
144
145
    $sql = "SELECT p.*, m.manager_name FROM players p LEFT OUTER JOIN managers m ON m.manager_id = p.manager_id WHERE p.draft_id = ?
146
      AND (p.first_name LIKE ? OR p.last_name LIKE ?)
147
      AND p.pick_time IS NOT NULL ORDER BY p.player_pick $searchModel->sort";
148
149
    $stmt = $this->app['db']->prepare($sql);
150
    $stmt->bindParam(1, $draft_id);
151
    $stmt->bindParam(2, $first_name);
152
    $stmt->bindParam(3, $last_name);
153
154
    if ($searchModel->hasTeam()) {
155
      $stmt->bindParam($param_number, $searchModel->team);
156
      $param_number++;
157
    }
158
159
    if ($searchModel->hasPosition()) {
160
      $stmt->bindParam($param_number, $searchModel->position);
161
      $param_number++;
162
    }
163
164
    $stmt->setFetchMode(\PDO::FETCH_CLASS, '\PhpDraft\Domain\Entities\Pick');
165
166
    if (!$stmt->execute()) {
167
      throw new \Exception("Unable to search for picks.");
168
    }
169
170
    while ($player = $stmt->fetch()) {
171
      $player->search_score = $loose_search_score;
172
      $player->selected = strlen($player->pick_time) > 0 && $player->pick_duration > 0;
173
      $players[] = $player;
174
175
      $loose_search_score--;
176
    }
177
178
    $searchModel->player_results = $players;
179
180
    return $searchModel;
181
  }
182
183
  //Analogous to 1.3's "getAlreadyDrafted" method from the player service - used on the add pre-check
184
  public function SearchAlreadyDrafted($draft_id, $first_name, $last_name) {
185
    $picks = array();
186
187
    $stmt = $this->app['db']->prepare("SELECT p.*, m.manager_name " .
188
      "FROM players p " .
189
      "LEFT OUTER JOIN managers m " .
190
      "ON m.manager_id = p.manager_id " .
191
      "WHERE p.draft_id = ? " .
192
      "AND p.pick_time IS NOT NULL " .
193
      "AND p.first_name = ? " .
194
      "AND p.last_name = ? " .
195
      "ORDER BY p.player_pick");
196
197
    $stmt->bindParam(1, $draft_id);
198
    $stmt->bindParam(2, $first_name);
199
    $stmt->bindParam(3, $last_name);
200
201
    $stmt->setFetchMode(\PDO::FETCH_CLASS, '\PhpDraft\Domain\Entities\Pick');
202
203
    if (!$stmt->execute()) {
204
      throw new \Exception("Unable to check to see if $first_name $last_name was already drafted.");
205
    }
206
207
    while ($pick = $stmt->fetch()) {
208
      $pick->selected = strlen($pick->pick_time) > 0 && $pick->pick_duration > 0;
209
      $picks[] = $pick;
210
    }
211
212
    return $picks;
213
  }
214
}
215