Passed
Push — master ( dc3688...f2f34e )
by Pavel
02:13
created

ArrayFilterParser   A

Complexity

Total Complexity 17

Size/Duplication

Total Lines 103
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

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