Passed
Push — master ( f522be...4a4c08 )
by Aleksandr
02:19
created

QB_OPERATOR::expr()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 17
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 16
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 15
nc 1
nop 0
dl 0
loc 17
ccs 16
cts 16
cp 1
crap 1
rs 9.7666
c 0
b 0
f 0
1
<?php
2
/**
3
 * This file is part of the eav package.
4
 * @author    Aleksandr Drobotik <[email protected]>
5
 * @copyright 2023 Aleksandr Drobotik
6
 * @license   https://opensource.org/license/mit  The MIT License
7
 */
8
declare(strict_types=1);
9
10
namespace Drobotik\Eav\Enum;
11
12
use Drobotik\Eav\Exception\QueryBuilderException;
13
14
enum QB_OPERATOR
15
{
16
    case EQUAL;
17
    case NOT_EQUAL;
18
    case IN;
19
    case NOT_IN;
20
    case LESS;
21
    case LESS_OR_EQUAL;
22
    case GREATER;
23
    case GREATER_OR_EQUAL;
24
    case BETWEEN;
25
    case NOT_BETWEEN;
26
    case BEGINS_WITH;
27
    case NOT_BEGINS_WITH;
28
    case CONTAINS;
29
    case NOT_CONTAINS;
30
    case ENDS_WITH;
31
    case NOT_ENDS_WITH;
32
    case IS_EMPTY;
33
    case IS_NOT_EMPTY;
34
    case IS_NULL;
35
    case IS_NOT_NULL;
36
37
38 1
    public function name(): string {
39 1
        return match ($this) {
40 1
            self::EQUAL => 'equal',
41 1
            self::NOT_EQUAL => 'not_equal',
42 1
            self::IN => 'in',
43 1
            self::NOT_IN => 'not_in',
44 1
            self::LESS => 'less',
45 1
            self::LESS_OR_EQUAL => 'less_or_equal',
46 1
            self::GREATER => 'greater',
47 1
            self::GREATER_OR_EQUAL => 'greater_or_equal',
48 1
            self::BETWEEN => 'between',
49 1
            self::NOT_BETWEEN => 'not_between',
50 1
            self::BEGINS_WITH => 'begins_with',
51 1
            self::NOT_BEGINS_WITH => 'not_begins_with',
52 1
            self::CONTAINS => 'contains',
53 1
            self::NOT_CONTAINS => 'not_contains',
54 1
            self::ENDS_WITH => 'ends_with',
55 1
            self::NOT_ENDS_WITH => 'not_ends_with',
56 1
            self::IS_EMPTY => 'is_empty',
57 1
            self::IS_NOT_EMPTY => 'is_not_empty',
58 1
            self::IS_NULL => 'is_null',
59 1
            self::IS_NOT_NULL => 'is_not_null',
60 1
        };
61
    }
62
    /**
63
     * @throws QueryBuilderException
64
     */
65 2
    public static function getCase(string $case)
66
    {
67 2
        return match ($case) {
68 2
            self::EQUAL->name() => self::EQUAL,
69 2
            self::NOT_EQUAL->name() => self::NOT_EQUAL,
70 2
            self::IN->name() => self::IN,
71 2
            self::NOT_IN->name() => self::NOT_IN,
72 2
            self::LESS->name() => self::LESS,
73 2
            self::LESS_OR_EQUAL->name() => self::LESS_OR_EQUAL,
74 2
            self::GREATER->name() => self::GREATER,
75 2
            self::GREATER_OR_EQUAL->name() => self::GREATER_OR_EQUAL,
76 2
            self::BETWEEN->name() => self::BETWEEN,
77 2
            self::NOT_BETWEEN->name() => self::NOT_BETWEEN,
78 2
            self::BEGINS_WITH->name() => self::BEGINS_WITH,
79 2
            self::NOT_BEGINS_WITH->name() => self::NOT_BEGINS_WITH,
80 2
            self::CONTAINS->name() => self::CONTAINS,
81 2
            self::NOT_CONTAINS->name() => self::NOT_CONTAINS,
82 2
            self::ENDS_WITH->name() => self::ENDS_WITH,
83 2
            self::NOT_ENDS_WITH->name() => self::NOT_ENDS_WITH,
84 2
            self::IS_EMPTY->name() => self::IS_EMPTY,
85 2
            self::IS_NOT_EMPTY->name() => self::IS_NOT_EMPTY,
86 2
            self::IS_NULL->name() => self::IS_NULL,
87 2
            self::IS_NOT_NULL->name() => self::IS_NOT_NULL,
88 2
            default => QueryBuilderException::unsupportedOperator($case),
89 2
        };
90
    }
91
92 1
    public function isValueRequired(): bool {
93 1
        return match ($this) {
94 1
            self::EQUAL,
95 1
            self::NOT_EQUAL,
96 1
            self::IN,
97 1
            self::NOT_IN,
98 1
            self::LESS,
99 1
            self::LESS_OR_EQUAL,
100 1
            self::GREATER,
101 1
            self::GREATER_OR_EQUAL,
102 1
            self::BETWEEN,
103 1
            self::NOT_BETWEEN,
104 1
            self::BEGINS_WITH,
105 1
            self::NOT_BEGINS_WITH,
106 1
            self::CONTAINS,
107 1
            self::NOT_CONTAINS,
108 1
            self::ENDS_WITH,
109 1
            self::NOT_ENDS_WITH => true,
110 1
            self::IS_EMPTY,
111 1
            self::IS_NOT_EMPTY,
112 1
            self::IS_NULL,
113 1
            self::IS_NOT_NULL => false,
114 1
        };
115
    }
116
117 1
    public function applyTo(): array {
118 1
        return match ($this) {
119 1
            self::EQUAL, self::NOT_EQUAL, self::IN, self::NOT_IN, self::LESS,
120 1
            self::LESS_OR_EQUAL, self::GREATER, self::GREATER_OR_EQUAL, self::BETWEEN,
121 1
            self::NOT_BETWEEN =>
122 1
            [ATTR_TYPE::INTEGER,
123 1
             ATTR_TYPE::DECIMAL,
124 1
             ATTR_TYPE::DATETIME],
125
126 1
            self::BEGINS_WITH, self::NOT_BEGINS_WITH, self::CONTAINS, self::NOT_CONTAINS,
127 1
            self::ENDS_WITH, self::NOT_ENDS_WITH, self::IS_EMPTY, self::IS_NOT_EMPTY =>
128 1
            [ATTR_TYPE::STRING,
129 1
             ATTR_TYPE::TEXT],
130
131 1
            self::IS_NULL, self::IS_NOT_NULL =>
132 1
            [ATTR_TYPE::STRING,
133 1
             ATTR_TYPE::TEXT,
134 1
             ATTR_TYPE::INTEGER,
135 1
             ATTR_TYPE::DECIMAL,
136 1
             ATTR_TYPE::DATETIME],
137 1
        };
138
    }
139 1
    public function sql(): string {
140 1
        return match ($this) {
141 1
            self::EQUAL,
142 1
            self::IS_EMPTY => '=',
143 1
            self::NOT_EQUAL,
144 1
            self::IS_NOT_EMPTY => '!=',
145 1
            self::IN => 'IN',
146 1
            self::NOT_IN => 'NOT IN',
147 1
            self::LESS => '<',
148 1
            self::LESS_OR_EQUAL => '<=',
149 1
            self::GREATER => '>',
150 1
            self::GREATER_OR_EQUAL => '>=',
151 1
            self::BETWEEN => 'BETWEEN',
152 1
            self::NOT_BETWEEN => 'NOT BETWEEN',
153 1
            self::BEGINS_WITH,
154 1
            self::CONTAINS,
155 1
            self::ENDS_WITH => 'LIKE',
156 1
            self::NOT_BEGINS_WITH,
157 1
            self::NOT_ENDS_WITH,
158 1
            self::NOT_CONTAINS => 'NOT LIKE',
159 1
            self::IS_NULL => 'NULL',
160 1
            self::IS_NOT_NULL => 'NOT NULL',
161 1
        };
162
    }
163
164 1
    public function prepend(): string|bool {
165 1
        return match ($this) {
166 1
            self::ENDS_WITH,
167 1
            self::NOT_ENDS_WITH,
168 1
            self::CONTAINS,
169 1
            self::NOT_CONTAINS => '%',
170 1
            default => false
171 1
        };
172
    }
173
174 1
    public function append(): string|bool {
175 1
        return match ($this) {
176 1
            self::BEGINS_WITH,
177 1
            self::NOT_BEGINS_WITH,
178 1
            self::CONTAINS,
179 1
            self::NOT_CONTAINS => '%',
180 1
            default => false
181 1
        };
182
    }
183
184 1
    public function isNeedsArray() : bool
185
    {
186 1
        return match ($this) {
187 1
            self::NOT_IN,
188 1
            self::IN,
189 1
            self::NOT_BETWEEN,
190 1
            self::BETWEEN => true,
191 1
            default => false
192 1
        };
193
    }
194
195 1
    public function isNull() : bool
196
    {
197 1
        return match ($this) {
198 1
            self::IS_NOT_NULL,
199 1
            self::IS_NULL => true,
200 1
            default => false
201 1
        };
202
    }
203
204 1
    public function isEmpty() : bool
205
    {
206 1
        return match ($this) {
207 1
            self::IS_EMPTY,
208 1
            self::IS_NOT_EMPTY => true,
209 1
            default => false
210 1
        };
211
    }
212
213
214 1
    public function isBetween() : bool
215
    {
216 1
        return match ($this) {
217 1
            self::BETWEEN,
218 1
            self::NOT_BETWEEN => true,
219 1
            default => false
220 1
        };
221
    }
222
223
    public function isLike() : bool
224
    {
225
        return match ($this) {
226
            self::BEGINS_WITH,
227
            self::CONTAINS,
228
            self::ENDS_WITH,
229
            self::NOT_BEGINS_WITH,
230
            self::NOT_ENDS_WITH,
231
            self::NOT_CONTAINS => true,
232
            default => false
233
        };
234
    }
235
236
237 1
    public function expr(): string
238
    {
239 1
        return match($this) {
240 1
            self::EQUAL, self::IS_EMPTY => 'eq',
241 1
            self::NOT_EQUAL, self::IS_NOT_EMPTY => 'neq',
242 1
            self::IN => 'in',
243 1
            self::NOT_IN => 'notIn',
244 1
            self::LESS => 'lt',
245 1
            self::LESS_OR_EQUAL => 'lte',
246 1
            self::GREATER => 'gt',
247 1
            self::GREATER_OR_EQUAL => 'gte',
248 1
            self::BETWEEN => 'between',
249 1
            self::NOT_BETWEEN => 'notBetween',
250 1
            self::BEGINS_WITH, self::CONTAINS, self::ENDS_WITH => 'like',
251 1
            self::NOT_BEGINS_WITH, self::NOT_CONTAINS, self::NOT_ENDS_WITH => 'notLike',
252 1
            self::IS_NULL => 'isNull',
253 1
            self::IS_NOT_NULL => 'isNotNull',
254 1
        };
255
    }
256
}