Test Failed
Push — master ( f562c0...ed7d3a )
by Dominik
02:11
created

CourseRepository::searchCount()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 4
nc 1
nop 1
dl 0
loc 7
rs 9.4285
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Chubbyphp\ApiSkeleton\Repository;
6
7
use Chubbyphp\Model\ModelInterface;
8
use Doctrine\DBAL\Query\QueryBuilder;
9
use Chubbyphp\ApiSkeleton\Model\Course;
10
use Chubbyphp\ApiSkeleton\Search\CourseSearch;
11
12
final class CourseRepository extends AbstractRepository
13
{
14
    /**
15
     * @param array $row
16
     *
17
     * @return ModelInterface
18
     */
19
    protected function fromPersistence(array $row): ModelInterface
20
    {
21
        return Course::fromPersistence($row);
22
    }
23
24
    /**
25
     * @return string
26
     */
27
    protected function getTable(): string
28
    {
29
        return 'courses';
30
    }
31
32
    /**
33
     * @param string $modelClass
34
     *
35
     * @return bool
36
     */
37
    public function isResponsible(string $modelClass): bool
38
    {
39
        return $modelClass === Course::class;
40
    }
41
42
    /**
43
     * @param CourseSearch $courseSearch
44
     *
45
     * @return CourseSearch
46
     */
47
    public function search(CourseSearch $courseSearch): CourseSearch
48
    {
49
        $count = $this->searchCount($courseSearch);
50
51
        $courseSearch->setPages((int) ceil($count / $courseSearch->getPerPage()));
52
        $courseSearch->setCount($count);
53
        $courseSearch->setCourses($this->searchResult($courseSearch));
54
55
        return $courseSearch;
56
    }
57
58
    /**
59
     * @param CourseSearch $courseSearch
60
     *
61
     * @return int
62
     */
63
    private function searchCount(CourseSearch $courseSearch): int
64
    {
65
        $qb = $this->prepareSearchQuery($courseSearch);
66
        $qb->select('COUNT(id) AS rowCount');
67
68
        return (int) $qb->execute()->fetchColumn();
69
    }
70
71
    /**
72
     * @param CourseSearch $courseSearch
73
     *
74
     * @return array
75
     */
76
    private function searchResult(CourseSearch $courseSearch): array
77
    {
78
        $qb = $this->prepareSearchQuery($courseSearch);
79
80
        $perPage = $courseSearch->getPerPage();
81
82
        $qb->select('*');
83
        $qb->setFirstResult($courseSearch->getPage() * $perPage - $perPage);
84
        $qb->setMaxResults($perPage);
85
86
        if (null !== $sort = $courseSearch->getSort()) {
87
            $qb->orderBy($sort, $courseSearch->getOrder());
88
        }
89
90
        $courses = [];
91
        foreach ($qb->execute()->fetchAll(\PDO::FETCH_ASSOC) as $row) {
92
            $courses[] = $this->fromPersistence($row);
93
        }
94
95
        return $courses;
96
    }
97
98
    /**
99
     * @param CourseSearch $courseSearch
100
     *
101
     * @return QueryBuilder
102
     */
103
    private function prepareSearchQuery(CourseSearch $courseSearch): QueryBuilder
0 ignored issues
show
Unused Code introduced by
The parameter $courseSearch is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
104
    {
105
        $qb = $this->connection->createQueryBuilder();
106
        $qb->from($this->getTable());
107
108
        return $qb;
109
    }
110
}
111