Completed
Push — master ( 03ee46...05e56c )
by Alejandro
24s queued 10s
created

VisitRepository::findVisitsByShortUrl()   B

Complexity

Conditions 7
Paths 10

Size

Total Lines 27
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 16
CRAP Score 7.0099

Importance

Changes 0
Metric Value
cc 7
eloc 16
nc 10
nop 2
dl 0
loc 27
rs 8.8333
c 0
b 0
f 0
ccs 16
cts 17
cp 0.9412
crap 7.0099

1 Method

Rating   Name   Duplication   Size   Complexity  
A VisitRepository::countVisitsByShortCode() 0 6 1
1
<?php
2
declare(strict_types=1);
3
4
namespace Shlinkio\Shlink\Core\Repository;
5
6
use Doctrine\ORM\EntityRepository;
7
use Doctrine\ORM\QueryBuilder;
8
use Shlinkio\Shlink\Common\Util\DateRange;
9
use Shlinkio\Shlink\Core\Entity\Visit;
10
11
class VisitRepository extends EntityRepository implements VisitRepositoryInterface
12
{
13 1
    public function findUnlocatedVisits(): iterable
14
    {
15 1
        $qb = $this->createQueryBuilder('v');
16 1
        $qb->where($qb->expr()->isNull('v.visitLocation'));
17
18 1
        return $qb->getQuery()->iterate();
19
    }
20
21
    /**
22
     * @return Visit[]
23
     */
24 1
    public function findVisitsByShortCode(
25
        string $shortCode,
26
        ?DateRange $dateRange = null,
27
        ?int $limit = null,
28
        ?int $offset = null
29
    ): array {
30 1
        $qb = $this->createVisitsByShortCodeQueryBuilder($shortCode, $dateRange);
31 1
        $qb->select('v');
32
33 1
        if ($limit !== null) {
34
            $qb->setMaxResults($limit);
35
        }
36 1
        if ($offset !== null) {
37
            $qb->setFirstResult($offset);
38
        }
39
40 1
        return $qb->getQuery()->getResult();
41
    }
42
43 1
    public function countVisitsByShortCode(string $shortCode, ?DateRange $dateRange = null): int
44
    {
45 1
        $qb = $this->createVisitsByShortCodeQueryBuilder($shortCode, $dateRange);
46 1
        $qb->select('COUNT(DISTINCT v.id)');
47
48 1
        return (int) $qb->getQuery()->getSingleScalarResult();
49
    }
50
51 2
    private function createVisitsByShortCodeQueryBuilder(string $shortCode, ?DateRange $dateRange = null): QueryBuilder
52
    {
53 2
        $qb = $this->getEntityManager()->createQueryBuilder();
54 2
        $qb->from(Visit::class, 'v')
55 2
           ->join('v.shortUrl', 'su')
56 2
           ->where($qb->expr()->eq('su.shortCode', ':shortCode'))
57 2
           ->setParameter('shortCode', $shortCode)
58 2
           ->orderBy('v.date', 'DESC') ;
59
60
        // Apply date range filtering
61 2
        if ($dateRange !== null && $dateRange->getStartDate() !== null) {
62 2
            $qb->andWhere($qb->expr()->gte('v.date', ':startDate'))
63 2
               ->setParameter('startDate', $dateRange->getStartDate());
64
        }
65 2
        if ($dateRange !== null && $dateRange->getEndDate() !== null) {
66 2
            $qb->andWhere($qb->expr()->lte('v.date', ':endDate'))
67 2
               ->setParameter('endDate', $dateRange->getEndDate());
68
        }
69
70 2
        return $qb;
71
    }
72
}
73