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

ArrayFilterParser::applyFilter()   B

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 8.8571
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
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