Passed
Pull Request — master (#8)
by Derek Stephen
10:36
created

PersonRepository   A

Complexity

Total Complexity 25

Size/Duplication

Total Lines 115
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 2
Bugs 1 Features 2
Metric Value
wmc 25
eloc 49
c 2
b 1
f 2
dl 0
loc 115
ccs 0
cts 49
cp 0
rs 10

14 Methods

Rating   Name   Duplication   Size   Complexity  
A delete() 0 4 1
A checkLimit() 0 3 2
A save() 0 6 1
A checkCountry() 0 5 2
A checkDob() 0 5 2
A checkBirthplace() 0 5 2
A checkFirstname() 0 5 2
A checkAka() 0 5 2
A checkOrder() 0 3 2
A checkOffset() 0 3 2
A findByCriteria() 0 18 1
A checkMiddlename() 0 5 2
A checkId() 0 5 2
A checkLastname() 0 5 2
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Del\Person\Repository;
6
7
use Del\Person\Entity\Person as PersonEntity;
8
use Del\Person\Criteria\PersonCriteria;
9
use Doctrine\ORM\EntityRepository;
10
use Doctrine\ORM\QueryBuilder;
11
use PDO;
12
13
class PersonRepository extends EntityRepository
14
{
15
    private QueryBuilder $qb;
16
17
    public function save(PersonEntity $person): PersonEntity
18
    {
19
        $this->_em->persist($person);
20
        $this->_em->flush();
21
22
        return $person;
23
    }
24
25
    public function delete(PersonEntity $person): void
26
    {
27
        $this->_em->remove($person);
28
        $this->_em->flush();
29
    }
30
31
    public function findByCriteria(PersonCriteria $criteria): array
32
    {
33
        $this->qb = $this->createQueryBuilder('p');
34
        $this->checkId($criteria);
35
        $this->checkFirstname($criteria);
36
        $this->checkMiddlename($criteria);
37
        $this->checkLastname($criteria);
38
        $this->checkAka($criteria);
39
        $this->checkBirthplace($criteria);
40
        $this->checkCountry($criteria);
41
        $this->checkDob($criteria);
42
        $this->checkOrder($criteria);
43
        $this->checkLimit($criteria);
44
        $this->checkOffset($criteria);
45
        $query = $this->qb->getQuery();
46
        unset($this->qb);
47
48
        return $query->getResult();
0 ignored issues
show
Bug Best Practice introduced by
The expression return $query->getResult() could return the type integer which is incompatible with the type-hinted return array. Consider adding an additional type-check to rule them out.
Loading history...
49
    }
50
51
    private function checkId(PersonCriteria $criteria): void
52
    {
53
        if($criteria->hasId()) {
54
            $this->qb->where('p.id = :id');
55
            $this->qb->setParameter('id', $criteria->getId(), PDO::PARAM_INT);
56
        }
57
    }
58
59
    private function checkFirstname(PersonCriteria $criteria): void
60
    {
61
        if($criteria->hasFirstname()) {
62
            $this->qb->andWhere('p.firstname = :firstname');
63
            $this->qb->setParameter('firstname', $criteria->getFirstname(), PDO::PARAM_STR);
64
        }
65
    }
66
67
    private function checkMiddlename(PersonCriteria $criteria): void
68
    {
69
        if($criteria->hasMiddlename()) {
70
            $this->qb->andWhere('p.middlename = :middlename');
71
            $this->qb->setParameter('middlename', $criteria->getMiddlename(), PDO::PARAM_STR);
72
        }
73
    }
74
75
    private function checkLastname(PersonCriteria $criteria): void
76
    {
77
        if($criteria->hasLastname()) {
78
            $this->qb->andWhere('p.lastname = :lastname');
79
            $this->qb->setParameter('lastname', $criteria->getLastname(), PDO::PARAM_STR);
80
        }
81
    }
82
83
    private function checkAka(PersonCriteria $criteria): void
84
    {
85
        if($criteria->hasAka()) {
86
            $this->qb->andWhere('p.aka = :aka');
87
            $this->qb->setParameter('aka', $criteria->getAka(), PDO::PARAM_STR);
88
        }
89
    }
90
91
    private function checkBirthplace(PersonCriteria $criteria): void
92
    {
93
        if($criteria->hasBirthplace()) {
94
            $this->qb->andWhere('p.birthplace = :birthplace');
95
            $this->qb->setParameter('birthplace', $criteria->getBirthplace(), PDO::PARAM_STR);
96
        }
97
    }
98
99
    private function checkCountry(PersonCriteria $criteria): void
100
    {
101
        if($criteria->hasCountry()) {
102
            $this->qb->andWhere('p.country = :country');
103
            $this->qb->setParameter('country', $criteria->getCountry(), PDO::PARAM_STR);
104
        }
105
    }
106
107
    private function checkDob(PersonCriteria $criteria): void
108
    {
109
        if($criteria->hasDob()) {
110
            $this->qb->andWhere('p.dob = :dob');
111
            $this->qb->setParameter('dob', $criteria->getDob(), PDO::PARAM_STR);
112
        }
113
    }
114
115
    private function checkOrder(PersonCriteria $criteria): void
116
    {
117
        $criteria->hasOrder() ? $this->qb->addOrderBy('p.'.$criteria->getOrder(), $criteria->getOrderDirection()) : null;
118
    }
119
120
    private function checkLimit(PersonCriteria $criteria): void
121
    {
122
        $criteria->hasLimit() ? $this->qb->setMaxResults($criteria->getLimit()) : null;
123
    }
124
125
    private function checkOffset(PersonCriteria $criteria): void
126
    {
127
        $criteria->hasOffset() ? $this->qb->setFirstResult($criteria->getOffset()) : null;
128
    }
129
}
130