Completed
Push — master ( b7ef6a...58a002 )
by Kirill
03:12
created

Expression   A

Complexity

Total Complexity 17

Size/Duplication

Total Lines 133
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 3

Test Coverage

Coverage 35.38%

Importance

Changes 0
Metric Value
wmc 17
lcom 1
cbo 3
dl 0
loc 133
ccs 23
cts 65
cp 0.3538
rs 10
c 0
b 0
f 0

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 6 1
D create() 0 98 16
1
<?php
2
/**
3
 * This file is part of Hydrogen package.
4
 *
5
 * For the full copyright and license information, please view the LICENSE
6
 * file that was distributed with this source code.
7
 */
8
declare(strict_types=1);
9
10
namespace RDS\Hydrogen\Processor\DatabaseProcessor\Common;
11
12
use Doctrine\ORM\Query\Expr;
13
use Doctrine\ORM\QueryBuilder;
14
use RDS\Hydrogen\Criteria\Common\Field;
15
use RDS\Hydrogen\Criteria\Where\Operator;
16
17
/**
18
 * Class Expression
19
 */
20
class Expression
21
{
22
    /**
23
     * @var QueryBuilder
24
     */
25
    private $builder;
26
27
    /**
28
     * @var Operator
29
     */
30
    private $operator;
31
32
    /**
33
     * @var mixed
34
     */
35
    private $value;
36
37
    /**
38
     * Expression constructor.
39
     * @param QueryBuilder $builder
40
     * @param Operator $operator
41
     * @param mixed $value
42
     */
43 8
    public function __construct(QueryBuilder $builder, Operator $operator, $value)
44
    {
45 8
        $this->builder = $builder;
46 8
        $this->operator = $operator;
47 8
        $this->value = $value;
48 8
    }
49
50
    /**
51
     * @param Field $field
52
     * @return Expr\Comparison|Expr\Func|string|\Generator
53
     */
54 8
    public function create(Field $field): \Generator
55
    {
56 8
        $expr = $this->builder->expr();
57 8
        $operator = $this->operator->toString();
58
59
        /**
60
         * Expr:
61
         * - "X IS NULL"
62
         * - "X IS NOT NULL"
63
         */
64 8
        if ($this->value === null) {
65
            switch ($operator) {
66
                case Operator::EQ:
67
                    return $expr->isNull(yield $field);
68
69
                case Operator::NEQ:
70
                    return $expr->isNull(yield $field);
71
            }
72
        }
73
74
        switch ($operator) {
75 8
            case Operator::EQ:
76 2
                return $expr->eq(
77
                    yield $field,
78 2
                    yield $field => $this->value
79
                );
80
81 6
            case Operator::NEQ:
82
                return $expr->neq(
83
                    yield $field,
84
                    yield $field => $this->value
85
                );
86
87 6
            case Operator::GT:
88 2
                return $expr->gt(
89
                    yield $field,
90 2
                    yield $field => $this->value
91
                );
92
93 6
            case Operator::LT:
94 4
                return $expr->lt(
95
                    yield $field,
96 4
                    yield $field => $this->value
97
                );
98
99 2
            case Operator::GTE:
100
                return $expr->gte(
101
                    yield $field,
102
                    yield $field => $this->value
103
                );
104
105 2
            case Operator::LTE:
106 2
                return $expr->lte(
107
                    yield $field,
108 2
                    yield $field => $this->value
109
                );
110
111
            case Operator::IN:
112
                return $expr->in(
113
                    yield $field,
114
                    yield $field => $this->value
115
                );
116
117
            case Operator::NOT_IN:
118
                return $expr->notIn(
119
                    yield $field,
120
                    yield $field => $this->value
121
                );
122
123
            case Operator::LIKE:
124
                return $expr->like(
125
                    yield $field,
126
                    yield $field => $this->value
127
                );
128
            case Operator::NOT_LIKE:
129
                return $expr->notLike(
130
                    yield $field,
131
                    yield $field => $this->value
132
                );
133
134
            case Operator::BTW:
135
                return $expr->between(
136
                    yield $field,
137
                    yield $field => $this->value[0] ?? null,
138
                    yield $field => $this->value[1] ?? null
139
                );
140
141
            case Operator::NOT_BTW:
142
                return \vsprintf('%s NOT BETWEEN %s AND %s', [
143
                    yield $field,
144
                    yield $field => $this->value[0] ?? null,
145
                    yield $field => $this->value[1] ?? null,
146
                ]);
147
        }
148
149
        $error = \sprintf('Unexpected "%s" operator type', $operator);
150
        throw new \InvalidArgumentException($error);
151
    }
152
}
153