Paginator   A
last analyzed

Complexity

Total Complexity 5

Size/Duplication

Total Lines 58
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 26
dl 0
loc 58
rs 10
c 1
b 0
f 0
wmc 5

4 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 3 1
A getIterator() 0 13 1
A count() 0 17 2
A cloneQuery() 0 7 1
1
<?php
2
3
namespace DH\DoctrineAuditBundle\Reader;
4
5
use ArrayIterator;
6
use Countable;
7
use Doctrine\DBAL\Query\QueryBuilder;
8
use IteratorAggregate;
9
10
class Paginator implements Countable, IteratorAggregate
11
{
12
    /**
13
     * @var QueryBuilder
14
     */
15
    private $queryBuilder;
16
17
    /**
18
     * @var int
19
     */
20
    private $count;
21
22
    public function __construct(QueryBuilder $queryBuilder)
23
    {
24
        $this->queryBuilder = $queryBuilder;
25
    }
26
27
    public function count(): int
28
    {
29
        $queryBuilder = $this->cloneQuery($this->queryBuilder);
30
31
        $result = $queryBuilder
32
            ->resetQueryPart('select')
33
            ->resetQueryPart('orderBy')
34
            ->setMaxResults(null)
35
            ->setFirstResult(null)
36
            ->select('COUNT(id)')
37
            ->execute()
38
            ->fetchColumn(0)
39
        ;
40
41
        $this->count = false === $result ? 0 : $result;
42
43
        return $this->count;
44
    }
45
46
    public function getIterator()
47
    {
48
        $offset = $this->queryBuilder->getFirstResult();
49
        $length = $this->queryBuilder->getMaxResults();
50
51
        $result = $this->cloneQuery($this->queryBuilder)
52
            ->setMaxResults($length)
53
            ->setFirstResult($offset)
54
            ->execute()
55
            ->fetchAll()
56
        ;
57
58
        return new ArrayIterator($result);
59
    }
60
61
    private function cloneQuery(QueryBuilder $queryBuilder): QueryBuilder
62
    {
63
        /** @var QueryBuilder $cloneQuery */
64
        $cloneQuery = clone $queryBuilder;
65
        $cloneQuery->setParameters($queryBuilder->getParameters(), $queryBuilder->getParameterTypes());
66
67
        return $cloneQuery;
68
    }
69
}
70