ArrayFilterParser   A
last analyzed

Complexity

Total Complexity 17

Size/Duplication

Total Lines 103
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
eloc 28
dl 0
loc 103
ccs 32
cts 32
cp 1
rs 10
c 0
b 0
f 0
wmc 17

5 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A processEqualFilter() 0 9 2
A processBetweenFilter() 0 12 4
A applyFilter() 0 15 5
A processOperatorFilter() 0 15 5
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