Passed
Push — master ( 24b8dd...d95a94 )
by noitran
01:52
created

EloquentProcessor::applyAnd()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 2
Code Lines 0

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
eloc 0
dl 0
loc 2
ccs 0
cts 0
cp 0
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 1
crap 2
1
<?php
2
3
namespace Noitran\RQL\Processors;
4
5
use Illuminate\Database\Eloquent\Builder;
6
use Illuminate\Database\Eloquent\Model;
7
use Noitran\RQL\Contracts\Expression\ExprInterface;
8
use Noitran\RQL\Contracts\Processor\ProcessorInterface;
9
use Noitran\RQL\Expressions\OrExpr;
10
use Noitran\RQL\ExprQueue;
11
12
/**
13
 * Class EloquentProcessor
14
 */
15
class EloquentProcessor implements ProcessorInterface
16
{
17
    /**
18
     * @var Builder
19
     */
20
    protected $builder;
21
22
    /**
23
     * @var array
24
     */
25
    protected static $methodMap = [
26
        '$eq' => 'where',
27
        '$notEq' => 'where',
28
        '$lt' => 'where',
29
        '$lte' => 'where',
30
        '$gt' => 'where',
31
        '$gte' => 'where',
32
        '$like' => 'where',
33
        '$in' => 'whereIn',
34
        '$notIn' => 'whereNotIn',
35
        '$between' => 'whereBetween',
36
        '$or' => null,
37
    ];
38
39
    /**
40
     * @var array
41
     */
42
    protected static $comparisonMethods = [
43
        '$eq',
44
        '$notEq',
45
        '$lt',
46
        '$lte',
47
        '$gt',
48
        '$gte',
49
        '$like',
50
    ];
51
52
    /**
53
     * EloquentProcessor constructor.
54
     *
55
     * @param Builder $builder
56
     */
57
    public function __construct($builder)
58
    {
59
        $this->builder = $builder;
60
    }
61
62
    /**
63
     * @return Builder|Model
64
     */
65
    public function getBuilder()
66
    {
67
        return $this->builder;
68
    }
69
70
    /**
71
     * @param ExprQueue $exprClasses
72
     *
73
     * @return Builder
74
     */
75
    public function process(ExprQueue $exprClasses): Builder
76
    {
77
        foreach ($exprClasses as $exprClass) {
78
            /** @var ExprInterface $exprClass */
79
            if (in_array($exprClass->getExpression(), self::$comparisonMethods, true)) {
80
                return $this->applyComparison($exprClass);
81
            }
82
83
            if (in_array($exprClass->getExpression(), ['$in', '$notIn', '$between'], true)) {
84
                return $this->applyIfValueIsArray($exprClass);
85
            }
86
87
            if ($exprClass instanceof OrExpr) {
88
                return $this->applyOr($exprClass);
89
            }
90
        }
91
92
        return $this->getBuilder();
93
    }
94
95
    /**
96
     * @param ExprInterface $exprClass
97
     *
98
     * @return Builder
99
     */
100
    protected function applyComparison(ExprInterface $exprClass): Builder
101
    {
102
        $method = self::$methodMap[$exprClass->getExpression()];
103
104
        return $this->getBuilder()->{$method}(
105
            $exprClass->getColumn(),
106
            $exprClass->getOperator(),
107
            $exprClass->getValue()
108
        );
109
    }
110
111
    /**
112
     * @param ExprInterface $exprClass
113
     *
114
     * @return Builder
115
     */
116
    protected function applyIfValueIsArray(ExprInterface $exprClass): Builder
117
    {
118
        $method = self::$methodMap[$exprClass->getExpression()];
119
120
        return $this->getBuilder()->{$method}(
121
            $exprClass->getColumn(),
122
            $exprClass->getValue()
123
        );
124
    }
125
126
    /**
127
     * @param ExprInterface $exprClass
128
     *
129
     * @return Builder
130
     */
131
    protected function applyOr(ExprInterface $exprClass): Builder
132
    {
133
        return $this->getBuilder()->where(function (Builder $builder) use ($exprClass) {
134
            $values = $exprClass->getValue();
135
136
            foreach ($values as $value) {
137
                $builder->orWhere($exprClass->getColumn(), $value);
138
            }
139
140
            return $builder;
141
        });
142
    }
143
}
144