ArrayFilterParser::applyFilter()   A
last analyzed

Complexity

Conditions 5
Paths 4

Size

Total Lines 15
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 5

Importance

Changes 0
Metric Value
cc 5
eloc 8
nc 4
nop 2
dl 0
loc 15
ccs 9
cts 9
cp 1
crap 5
rs 9.6111
c 0
b 0
f 0
1
<?php namespace Pz\Doctrine\Rest\QueryParser;
2
3
use Doctrine\Common\Collections\Criteria;
4
use Doctrine\ORM\Query\Expr;
5
use Pz\Doctrine\Rest\Contracts\RestRequestContract;
6
use Pz\Doctrine\Rest\Exceptions\RestException;
7
8
class ArrayFilterParser extends FilterParserAbstract
9
{
10
    /**
11
     * @var bool|array
12
     */
13
    protected $filterable;
14
15
    /**
16
     * StringParser constructor.
17
     *
18
     * @param RestRequestContract $request
19
     * @param bool|array          $filterable
20
     */
21 16
    public function __construct(RestRequestContract $request, array $filterable)
22
    {
23 16
        parent::__construct($request);
24 16
        $this->filterable = $filterable;
25 16
    }
26
27
    /**
28
     * @param Criteria $criteria
29
     * @param          $filter
30
     *
31
     * @return Criteria
32
     */
33 16
    public function applyFilter(Criteria $criteria, $filter)
34
    {
35 16
        if (!is_array($filter) || !is_array($this->filterable)) {
36 12
            return $criteria;
37
        }
38
39 5
        foreach ($this->filterable as $field) {
40 5
            if (array_key_exists($field, $filter)) {
41 5
                $this->processEqualFilter($criteria, $field, $filter[$field]);
42 5
                $this->processBetweenFilter($criteria, $field, $filter[$field]);
43 5
                $this->processOperatorFilter($criteria, $field, $filter[$field]);
44
            }
45
        }
46
47 4
        return $criteria;
48
    }
49
50
    /**
51
     * @param Criteria $criteria
52
     * @param          $field
53
     * @param          $value
54
     *
55
     * @return $this
56
     */
57 5
    protected function processEqualFilter(Criteria $criteria, $field, $value)
58
    {
59 5
        if (is_string($value)) {
60 1
            $criteria->andWhere(
61 1
                $criteria->expr()->eq($field, $value)
62
            );
63
        }
64
65 5
        return $this;
66
    }
67
68
    /**
69
     * @param Criteria $criteria
70
     * @param          $field
71
     * @param          $value
72
     *
73
     * @return $this
74
     */
75 5
    protected function processBetweenFilter(Criteria $criteria, $field, $value)
76
    {
77 5
        if (is_array($value) && isset($value['start']) && isset($value['end'])) {
78
79 2
            $criteria->andWhere($criteria->expr()->andX(
80 2
                $criteria->expr()->gte($field, $value['start']),
81 2
                $criteria->expr()->lt($field, $value['end'])
82
            ));
83
84
        }
85
86 5
        return $this;
87
    }
88
89
    /**
90
     * @param Criteria $criteria
91
     * @param          $field
92
     * @param          $value
93
     *
94
     * @return $this
95
     */
96 5
    protected function processOperatorFilter(Criteria $criteria, $field, $value)
97
    {
98 5
        if (is_array($value) && isset($value['operator']) && array_key_exists('value', $value)) {
99 2
            $operator = $value['operator'];
100
101 2
            if (!method_exists($criteria->expr(), $operator)) {
102 1
                throw RestException::createFilterError(['field' => $field, 'filter' => $value], 'Unknown operator.');
103
            }
104
105 1
            $criteria->andWhere(
106 1
                $criteria->expr()->$operator($field, $value['value'])
107
            );
108
        }
109
110 4
        return $this;
111
    }
112
}
113