• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

daycry / doctrine / 5422826778

pending completion
5422826778

push

github

web-flow
Update phpunit.yml

206 of 214 relevant lines covered (96.26%)

7.85 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

97.81
/src/DataTables/Builder.php
1
<?php
2

3
namespace Daycry\Doctrine\DataTables;
4

5
use Doctrine\DBAL\Query\QueryBuilder;
6
use Doctrine\ORM\QueryBuilder as ORMQueryBuilder;
7
use Doctrine\ORM\Tools\Pagination\Paginator;
8

9
/**
10
 * Class Builder
11
 * @package Doctrine\Daycry\DataTables
12
 */
13
class Builder
14
{
15
    /**
16
     * @var array
17
     */
18
    protected $columnAliases = array();
19

20
    /**
21
     * @var string
22
     */
23
    protected $columnField = 'data'; // or 'name'
24

25
    /**
26
     * @var string
27
     */
28
    protected $indexColumn = '*';
29

30
    /**
31
     * @var bool
32
     */
33
    protected $caseInsensitive = false;
34

35
    /**
36
     * @var QueryBuilder|ORMQueryBuilder
37
     */
38
    protected $queryBuilder;
39

40
    /**
41
     * @var array
42
     */
43
    protected $requestParams;
44

45
    /**
46
     * @var bool
47
     */
48
    protected $useOutputWalkers = null;
49

50
    /**
51
     * @return array
52
     */
53
    public function getData()
54
    {
55
        $query = $this->getFilteredQuery();
10✔
56
        $columns = &$this->requestParams['columns'];
10✔
57

58
        // Order
59
        if (array_key_exists('order', $this->requestParams)) {
10✔
60
            $order = &$this->requestParams['order'];
10✔
61
            foreach ($order as $sort) {
10✔
62
                $column = &$columns[intval($sort['column'])];
10✔
63
                if (array_key_exists($column[$this->columnField], $this->columnAliases)) {
10✔
64
                    $column[$this->columnField] = $this->columnAliases[$column[$this->columnField]];
3✔
65
                }
66
                $query->addOrderBy($column[$this->columnField], $sort['dir']);
10✔
67
            }
68
        }
69

70
        // Offset
71
        if (array_key_exists('start', $this->requestParams)) {
10✔
72
            $query->setFirstResult(intval($this->requestParams['start']));
10✔
73
        }
74

75
        // Limit
76
        if (array_key_exists('length', $this->requestParams)) {
10✔
77
            $length = intval($this->requestParams['length']);
10✔
78
            if ($length > 0) {
10✔
79
                $query->setMaxResults($length);
10✔
80
            }
81
        }
82

83
        // Fetch
84
        $paginator = new Paginator($query, $fetchJoinCollection = true);
10✔
85
        $paginator->setUseOutputWalkers($this->useOutputWalkers);
10✔
86
        $result = array();
10✔
87

88
        foreach($paginator as $obj) {
10✔
89
            $result[] = $obj;
10✔
90
        }
91

92
        return $result;
10✔
93
    }
94

95
    /**
96
     * @return QueryBuilder|ORMQueryBuilder
97
     */
98
    public function getFilteredQuery()
99
    {
100
        $query = clone $this->queryBuilder;
10✔
101
        $columns = &$this->requestParams['columns'];
10✔
102
        $c = count($columns);
10✔
103

104
        // Search
105
        if (array_key_exists('search', $this->requestParams)) {
10✔
106
            if ($value = trim($this->requestParams['search']['value'])) {
10✔
107
                $orX = $query->expr()->orX();
1✔
108
                for ($i = 0; $i < $c; $i++) {
1✔
109
                    $column = &$columns[$i];
1✔
110
                    if ($column['searchable'] == 'true') {
1✔
111
                        if (array_key_exists($column[$this->columnField], $this->columnAliases)) {
1✔
112
                            $column[$this->columnField] = $this->columnAliases[$column[$this->columnField]];
1✔
113
                        }
114
                        if ($this->caseInsensitive) {
1✔
115
                            $searchColumn = "lower(" . $column[$this->columnField] . ")";
1✔
116
                            $orX->add($query->expr()->like($searchColumn, 'lower(:search)'));
1✔
117
                        } else {
118
                            $orX->add($query->expr()->like($column[$this->columnField], ':search'));
×
119
                        }
120
                    }
121
                }
122
                if ($orX->count() >= 1) {
1✔
123
                    $query->andWhere($orX)
1✔
124
                        ->setParameter('search', "%{$value}%");
1✔
125
                }
126
            }
127
        }
128
        // Filter
129
        for ($i = 0; $i < $c; $i++) {
10✔
130
            $column = &$columns[$i];
10✔
131
            $andX = $query->expr()->andX();
10✔
132
            if (($column['searchable'] == 'true') && ($value = trim($column['search']['value']))) {
10✔
133
                if (array_key_exists($column[$this->columnField], $this->columnAliases)) {
9✔
134
                    $column[$this->columnField] = $this->columnAliases[$column[$this->columnField]];
9✔
135
                }
136

137
                //$operator = preg_match('~^\[(?<operator>[=!%<>]+)\].*$~', $value, $matches) ? $matches['operator'] : '=';
138
                $operator = preg_match('~^\[(?<operator>[INOR=!%<>•]+)\].*$~i', $value, $matches) ? strtoupper($matches['operator']) : '%•';
9✔
139
                $value    = preg_match('~^\[(?<operator>[INOR=!%<>•]+)\](?<term>.*)$~i', $value, $matches) ? $matches['term'] : $value;
9✔
140
                if ($this->caseInsensitive) {
9✔
141
                    $searchColumn = "lower(" . $column[$this->columnField] . ")";
×
142
                    $filter = "lower(:filter_{$i})";
×
143
                } else {
144
                    $searchColumn = $column[$this->columnField];
9✔
145
                    $filter = ":filter_{$i}";
9✔
146
                }
147

148
                switch ($operator) {
149
                    case '!=': // Not equals; usage: [!=]search_term
9✔
150
                        $andX->add($query->expr()->neq($searchColumn, $filter));
1✔
151
                        $query->setParameter("filter_{$i}", $value);
1✔
152
                        break;
1✔
153
                    case '%%': // Like; usage: [%%]search_term
8✔
154
                        $andX->add($query->expr()->like($searchColumn, $filter));
1✔
155
                        $value = "%{$value}%";
1✔
156
                        $query->setParameter("filter_{$i}", $value);
1✔
157
                        break;
1✔
158
                    case '<': // Less than; usage: [>]search_term
7✔
159
                        $andX->add($query->expr()->lt($searchColumn, $filter));
1✔
160
                        $query->setParameter("filter_{$i}", $value);
1✔
161
                        break;
1✔
162
                    case '>': // Greater than; usage: [<]search_term
6✔
163
                        $andX->add($query->expr()->gt($searchColumn, $filter));
1✔
164
                        $query->setParameter("filter_{$i}", $value);
1✔
165
                        break;
1✔
166
                    case 'IN': // IN; usage: [IN]search_term,search_term  -> This equals OR with complete terms
5✔
167
                        $value = explode(',', $value);
1✔
168
                        $params = array();
1✔
169
                        for ($j = 0; $j < count($value); $j++) {
1✔
170
                            $params[] = ":filter_{$i}_{$j}";
1✔
171
                        }
172
                        $andX->add($query->expr()->in($column[$this->columnField], implode(',', $params)));
1✔
173
                        for ($j = 0; $j < count($value); $j++) {
1✔
174
                            $query->setParameter("filter_{$i}_{$j}", trim($value[$j]));
1✔
175
                        }
176
                        break;
1✔
177
                    case 'OR': // OR; usage: [IN]search_term,search_term  -> This equals OR with complete terms
4✔
178
                        $value = explode(',', $value);
1✔
179
                        $params = array();
1✔
180
                        $orX = $query->expr()->orX();
1✔
181
                        for ($j = 0; $j < count($value); $j++) {
1✔
182
                            $orX->add($query->expr()->like($column[$this->columnField], ":filter_{$i}_{$j}"));
1✔
183
                        }
184
                        $andX->add($orX);
1✔
185
                        for ($j = 0; $j < count($value); $j++) {
1✔
186
                            $query->setParameter("filter_{$i}_{$j}", "%".trim($value[$j])."%");
1✔
187
                        }
188
                        break;
1✔
189
                    case '><': // Between than; usage: [><]search_term,search_term
3✔
190
                        $value = explode(',', $value);
1✔
191
                        $params = array();
1✔
192
                        for ($j = 0; $j < count($value); $j++) {
1✔
193
                            $params[] = ":filter_{$i}_{$j}";
1✔
194
                        }
195
                        $andX->add($query->expr()->between($column[$this->columnField], trim($params[0]), trim($params[1])));
1✔
196
                        for ($j = 0; $j < count($value); $j++) {
1✔
197
                            $query->setParameter("filter_{$i}_{$j}", $value[$j]);
1✔
198
                        }
199
                        break;
1✔
200
                    case '=': // Equals; usage: [=]search_term
2✔
201
                        $andX->add($query->expr()->eq($column[$this->columnField], ":filter_{$i}"));
1✔
202
                        $query->setParameter("filter_{$i}", $value);
1✔
203
                        break;
1✔
204
                    case '%': // Like(default); usage: [%]search_term
1✔
205
                        default:
206
                            $andX->add($query->expr()->like($column[$this->columnField], ":filter_{$i}"));
1✔
207
                            $value = "{$value}%";
1✔
208
                            $query->setParameter("filter_{$i}", $value);
1✔
209
                            break;
1✔
210
                }
211
            }
212
            if ($andX->count() >= 1) {
10✔
213
                $query->andWhere($andX);
9✔
214
            }
215
        }
216
        // Done
217
        return $query;
10✔
218
    }
219

220
    /**
221
     * @return int
222
     */
223
    public function getRecordsFiltered()
224
    {
225
        $query = $this->getFilteredQuery();
10✔
226
        $paginator = new Paginator($query, $fetchJoinCollection = true);
10✔
227
        $paginator->setUseOutputWalkers($this->useOutputWalkers);
10✔
228
        return $paginator->count();
10✔
229
    }
230

231
    /**
232
     * @return int
233
     */
234
    public function getRecordsTotal()
235
    {
236
        $query = clone $this->queryBuilder;
10✔
237
        $paginator = new Paginator($query, $fetchJoinCollection = true);
10✔
238
        $paginator->setUseOutputWalkers($this->useOutputWalkers);
10✔
239
        return $paginator->count();
10✔
240
    }
241

242
    /**
243
     * @return array
244
     */
245
    public function getResponse()
246
    {
247
        return array(
10✔
248
            'data' => $this->getData(),
10✔
249
            'draw' => $this->requestParams['draw'],
10✔
250
            'recordsFiltered' => $this->getRecordsFiltered(),
10✔
251
            'recordsTotal' => $this->getRecordsTotal(),
10✔
252
        );
10✔
253
    }
254

255
    /**
256
     * @param string $indexColumn
257
     * @return static
258
     */
259
    public function withIndexColumn($indexColumn)
260
    {
261
        $this->indexColumn = $indexColumn;
10✔
262
        return $this;
10✔
263
    }
264

265
    /**
266
     * @param string|null $useOutputWalkers
267
     * return static
268
     */
269
    public function setUseOutputWalkers($useOutputWalkers)
270
    {
271
        $this->useOutputWalkers = $useOutputWalkers;
10✔
272
        return $this;
10✔
273
    }
274

275
    /**
276
     * @param array $columnAliases
277
     * @return static
278
     */
279
    public function withColumnAliases($columnAliases)
280
    {
281
        $this->columnAliases = $columnAliases;
10✔
282
        return $this;
10✔
283
    }
284

285
    /**
286
     * @param bool $caseInsensitive
287
     * @return static
288
     */
289
    public function withCaseInsensitive($caseInsensitive)
290
    {
291
        $this->caseInsensitive = $caseInsensitive;
10✔
292
        return $this;
10✔
293
    }
294

295
    /**
296
     * @param string $columnField
297
     * @return static
298
     */
299
    public function withColumnField($columnField)
300
    {
301
        $this->columnField = $columnField;
10✔
302
        return $this;
10✔
303
    }
304

305
    /**
306
     * @param QueryBuilder|ORMQueryBuilder $queryBuilder
307
     * @return static
308
     */
309
    public function withQueryBuilder($queryBuilder)
310
    {
311
        $this->queryBuilder = $queryBuilder;
10✔
312
        return $this;
10✔
313
    }
314

315
    /**
316
     * @param array $requestParams
317
     * @return static
318
     */
319
    public function withRequestParams($requestParams)
320
    {
321
        $this->requestParams = $requestParams;
10✔
322
        return $this;
10✔
323
    }
324
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc