IsBetween   A
last analyzed

Complexity

Total Complexity 4

Size/Duplication

Total Lines 52
Duplicated Lines 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 26
dl 0
loc 52
rs 10
c 2
b 0
f 0
wmc 4

1 Method

Rating   Name   Duplication   Size   Complexity  
A filter() 0 42 4
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Arp\DoctrineQueryFilter\Filter;
6
7
use Arp\DoctrineQueryFilter\Enum\WhereType;
8
use Arp\DoctrineQueryFilter\Filter\Exception\FilterException;
9
use Arp\DoctrineQueryFilter\Filter\Exception\InvalidArgumentException;
10
use Arp\DoctrineQueryFilter\Metadata\MetadataInterface;
11
use Arp\DoctrineQueryFilter\QueryBuilderInterface;
12
13
class IsBetween extends AbstractFilter
14
{
15
    /**
16
     * @param QueryBuilderInterface $queryBuilder
17
     * @param MetadataInterface $metadata
18
     * @param array<mixed> $criteria
19
     *
20
     * @throws InvalidArgumentException
21
     * @throws FilterException
22
     */
23
    public function filter(QueryBuilderInterface $queryBuilder, MetadataInterface $metadata, array $criteria): void
24
    {
25
        if (empty($criteria['from'])) {
26
            throw new InvalidArgumentException(
27
                sprintf('The required \'from\' criteria option is missing for filter \'%s\'', self::class)
28
            );
29
        }
30
31
        if (empty($criteria['to'])) {
32
            throw new InvalidArgumentException(
33
                sprintf('The required \'to\' criteria option is missing for filter \'%s\'', self::class)
34
            );
35
        }
36
37
        $fieldName = $this->resolveFieldName($metadata, $criteria);
38
        $queryAlias = $this->getAlias($queryBuilder, $criteria['alias'] ?? null);
39
40
        $fromParamName = $this->createParamName('from', $fieldName, $queryAlias);
41
        $toParamName = $this->createParamName('to', $fieldName, $queryAlias);
42
43
        $expression = $queryBuilder->expr()->between(
44
            $queryAlias . '.' . $fieldName,
45
            ':' . $fromParamName,
46
            ':' . $toParamName
47
        );
48
49
        if ($this->getWhereType($criteria) === WhereType::AND) {
50
            $queryBuilder->andWhere($expression);
51
        } else {
52
            $queryBuilder->orWhere($expression);
53
        }
54
55
        $format = $criteria['format'] ?? null;
56
57
        $queryBuilder->setParameter(
58
            $fromParamName,
59
            $this->formatValue($metadata, $fieldName, $criteria['from'], $format)
60
        );
61
62
        $queryBuilder->setParameter(
63
            $toParamName,
64
            $this->formatValue($metadata, $fieldName, $criteria['to'], $format)
65
        );
66
    }
67
}
68