Passed
Push — master ( 4c08a2...19d2d9 )
by Damien
03:42
created

Paginator::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
nc 1
nop 1
dl 0
loc 3
rs 10
c 1
b 0
f 0
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 $query;
16
17
    /**
18
     * @var int
19
     */
20
    private $count;
21
22
    public function __construct($query)
23
    {
24
        $this->query = $query;
25
    }
26
27
    public function count()
28
    {
29
        $queryBuilder = $this->cloneQuery($this->query);
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->query->getFirstResult();
49
        $length = $this->query->getMaxResults();
50
51
        $result = $this->cloneQuery($this->query)
52
            ->setMaxResults($length)
53
            ->setFirstResult($offset)
54
            ->execute()
55
            ->fetchAll()
56
        ;
57
58
        return new ArrayIterator($result);
59
    }
60
61
    private function cloneQuery(QueryBuilder $query): QueryBuilder
62
    {
63
        /** @var QueryBuilder $cloneQuery */
64
        $cloneQuery = clone $query;
65
        $cloneQuery->setParameters($query->getParameters());
66
67
        return $cloneQuery;
68
    }
69
}
70