Completed
Pull Request — master (#4)
by
unknown
09:38 queued 20s
created

Restrictions   A

Complexity

Total Complexity 24

Size/Duplication

Total Lines 335
Duplicated Lines 8.36 %

Coupling/Cohesion

Components 1
Dependencies 1

Importance

Changes 0
Metric Value
wmc 24
lcom 1
cbo 1
dl 28
loc 335
rs 10
c 0
b 0
f 0

17 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A getFieldsAndValues() 0 4 1
A equals() 0 8 1
A different() 0 8 1
A biggerThen() 0 8 1
A greaterThan() 0 8 1
A lessThen() 0 8 1
A lessLike() 0 8 1
A like() 0 8 1
A either() 7 7 1
A and() 7 7 1
A limit() 0 6 1
A offset() 0 4 1
A orderBy() 0 6 1
C join() 14 32 7
A fields() 0 8 2
A addFieldsAndValues() 0 4 1

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

1
<?php
2
3
/**
4
 * Copyright (c) 2017. Este código foi feito por @marciioluucas, sob licença MIT
5
 */
6
namespace Phiber\ORM\Queries;
7
8
use Phiber\ORM\Exceptions\PhiberException;
9
10
/**
11
 * Classe responsável por fazer as restrições das operações do banco
12
 * 
13
 * @package bin
14
 */
15
class Restrictions
16
{
17
    /**
18
     * @var array
19
     */
20
    private static $fieldsAndValues = [];
21
22
    /**
23
     * Restrictions constructor.
24
     */
25
    public function __construct()
26
    {
27
        self::$fieldsAndValues = [];
28
    }
29
30
    /**
31
     * @return array
32
     */
33
    public function getFieldsAndValues(): array
34
    {
35
        return self::$fieldsAndValues;
36
    }
37
38
    /**
39
     * Faz a query de comparação IGUAL
40
     * 
41
     * @example Exemplo:
42
     *  equals("idade",15);
43
     *  Criará um pedaço da query do banco assim -> idade = :condition_idade
44
     *  OBS: O ":condition_idade" é o responsável por depois fazer o binding do valor para
45
     *  evitar SQL Injection.
46
     * 
47
     * @param  string $column
48
     * @param  string $value
49
     * @return array
50
     */
51
    public function equals($column, $value)
52
    {
53
        self::addFieldsAndValues($column, $value);
54
        
55
        return [
56
            "where" => "{$column} = :condition_{$value}"
57
        ];
58
    }
59
60
    /**
61
     * Faz a query de comparação DIFERENTE
62
     * 
63
     * @example Exemplo:
64
     *  different("idade",15);
65
     *  Criará um pedaço da query do banco assim -> idade != :condition_idade
66
     *  OBS: O ":condition_idade" é o responsável por depois fazer o binding do valor para
67
     *  evitar SQL Injection.
68
     * @param  string $column
69
     * @param  string $value
70
     * @return array
71
     */
72
    public function different($column, $value)
73
    {
74
        self::addFieldsAndValues($column, $value);
75
76
        return [
77
            "where" => "{$column} != :condition_$value"
78
        ];
79
    }
80
81
    /**
82
     * Faz a query de comparação MAIOR QUE
83
     * 
84
     * @example Exemplo:
85
     *  biggerThen("idade",15);
86
     *  Criará um pedaço da query do banco assim -> idade > :condition_idade
87
     *  OBS: O ":condition_idade" é o responsável por depois fazer o binding do valor para
88
     *  evitar SQL Injection.
89
     * @param  string $column
90
     * @param  string $value
91
     * @return array
92
     */
93
    public function biggerThen($column, $value)
94
    {
95
        self::addFieldsAndValues($column, $value);
96
97
        return [
98
            "where" => "{$column} > :condition_{$value}"
99
        ];
100
    }
101
102
    /**
103
     * Faz a query de comparação MAIOR OU IGUAL A
104
     * 
105
     * @example Exemplo:
106
     *  greaterThan("idade",15);
107
     *  Criará um pedaço da query do banco assim -> idade >= :condition_idade
108
     *  OBS: O ":condition_idade" é o responsável por depois fazer o binding do valor para
109
     *  evitar SQL Injection.
110
     * @param  string $column
111
     * @param  string $value
112
     * @return array
113
     */
114
    public function greaterThan($column, $value)
115
    {
116
        self::addFieldsAndValues($column, $value);
117
118
        return [
119
            "where" => "{$column} >= :condition_{$value}"
120
        ];
121
    }
122
123
    /**
124
     * Faz a query de comparação MENOR QUE
125
     * 
126
     * @example Exemplo:
127
     *  lessThen("idade",15);
128
     *  Criará um pedaço da query do banco assim -> idade < :condition_idade
129
     *  OBS: O ":condition_idade" é o responsável por depois fazer o binding do valor para
130
     *  evitar SQL Injection.
131
     * @param  string $column
132
     * @param  string $param2
0 ignored issues
show
Bug introduced by
There is no parameter named $param2. Was it maybe removed?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function.

Consider the following example. The parameter $italy is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $island
 * @param array $italy
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was removed, but the annotation was not.

Loading history...
133
     * @return array
134
     */
135
    public function lessThen($column, $value)
136
    {
137
        self::addFieldsAndValues($column, $value);
138
139
        return [
140
            "where" => "{$column} < :condition_{$value}"
141
        ];
142
    }
143
144
    /**
145
     * Faz a query de comparação MENOR OU IGUAL A
146
     * 
147
     * @example Exemplo:
148
     *  lessLike("idade",15);
149
     *  Criará um pedaço da query do banco assim -> idade <= :condition_idade
150
     *  OBS: O ":condition_idade" é o responsável por depois fazer o binding do valor para
151
     *  evitar SQL Injection.
152
     * @param  string $column
153
     * @param  string $value
154
     * @return array
155
     */
156
    public function lessLike($column, $value)
157
    {
158
        self::addFieldsAndValues($column, $value);
159
160
        return [
161
            "where" => "{$column} <= :condition_{$value}"
162
        ];
163
    }
164
165
    /**
166
     * Faz a query de comparação LIKE
167
     * 
168
     * @example Exemplo:
169
     *  like("nome","Jhon Snow");
170
     *  Criará um pedaço da query do banco assim -> idade LIKE %:condition_nome%
171
     *  OBS: O ":condition_nome" é o responsável por depois fazer o binding do valor para
172
     *  evitar SQL Injection.
173
     * @param $param1
174
     * @param $param2
175
     * @return array
176
     */
177
    public function like($param1, $param2)
178
    {
179
        self::addFieldsAndValues($param1, $param2);
180
181
        return [
182
            "where" => $param1 . " LIKE CONCAT('%',:condition_" . $param1 . ",'%')",
183
        ];
184
    }
185
186
    /**
187
     * Faz a query de conjunção OU
188
     * Exemplo:
189
     *  $condicao1 = equals("idade",15);
190
     *  $condicao2 = like("nome","Jhon");
191
     *  either($condicao1,$condicao2);
192
     *
193
     *  Criará um pedaço da query do banco assim ->
194
     *    (idade = :condition_idade or nome like %:condition_nome%);
195
     *  OBS: O ":condition_idade, :condition_nome" são responsáveis por depois fazer o
196
     * binding do valor para evitar SQL Injection.
197
     * @param $condition1
198
     * @param $condition2
199
     * @return array
200
     */
201 View Code Duplication
    public function either($condition1, $condition2)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
202
    {
203
204
        return [
205
            "where" => "(" . $condition1['where'] . " OR " . $condition2['where'] . ")",
206
        ];
207
    }
208
209
    /**
210
     * Faz a query de conjunção E
211
     * Exemplo:
212
     *  $condicao1 = eq("idade",15);
213
     *  $condicao2 = like("nome","Jhon");
214
     *  or($condicao1,$condicao2);
215
     *
216
     *  Criará um pedaço da query do banco assim ->
217
     *    (idade = :condition_idade and nome like %:condition_nome%);
218
     *  OBS: O ":condition_idade, :condition_nome" são responsáveis por depois fazer o
219
     * binding do valor para evitar SQL Injection.
220
     * @param $condition1
221
     * @param $condition2
222
     * @return array
223
     */
224 View Code Duplication
    public function and ($condition1, $condition2)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
225
    {
226
227
        return [
228
            "where" => "(" . $condition1['where'] . " AND " . $condition2['where'] . ")"
229
        ];
230
    }
231
232
    /**
233
     * Faz a query de limite.
234
     * 
235
     * @example Exemplo:
236
     * Retornar os primeiros registros com o limite 15
237
     * LIMIT 15
238
     * @param  int $limit
239
     * @return array
240
     */
241
    public function limit($limit)
242
    {
243
        return [
244
            "limit" => (int)$limit . " "
245
        ];
246
    }
247
248
    /**
249
     * Faz a query de offset (a partir de )
250
     * 
251
     * @example Exemplo:
252
     * Retorne os x resultados a partir de 15
253
     * OFFSET 15
254
     * @param  $offset
255
     * @return array
256
     */
257
    public function offset($offset)
258
    {
259
        return [ "offset" => $offset ];
260
    }
261
262
    /**
263
     * Faz a query de OrderBy
264
     * 
265
     * @example EXEMPLO:
266
     * Passará um array com os orderBys e se quer desc ou asc.
267
     * Se caso quiser tudo desc ou tudo asc, colocar DESC|ASC somente no ultimo.
268
     * orderBy(["nome asc","id desc"])
269
     * @param array $orderBy
270
     * @return array
271
     */
272
    public function orderBy(array $orderBy)
273
    {
274
        return [
275
            "orderby" => $orderBy
276
        ];
277
    }
278
279
    /**
280
     * Responsável por montar instruções JOIN.
281
     *
282
     * @param  string $table
283
     * @param  array $on
284
     * @param  string $type
285
     * @return void
286
     */
287
    public function join(string $table, array $on, string $type = "INNER")
288
    {
289
        if (count($on) > 2) {
290
            throw new PhiberException("error_on_join");
291
        }
292
293
        try {
294
            switch (strtoupper($type)) {
295 View Code Duplication
                case "INNER":
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
296
                    return ["join" => "INNER JOIN " . $table . " ON " . $on[0] . " = " . $on[1]];
297
                    break;
0 ignored issues
show
Unused Code introduced by
break is not strictly necessary here and could be removed.

The break statement is not necessary if it is preceded for example by a return statement:

switch ($x) {
    case 1:
        return 'foo';
        break; // This break is not necessary and can be left off.
}

If you would like to keep this construct to be consistent with other case statements, you can safely mark this issue as a false-positive.

Loading history...
298
299 View Code Duplication
                case "LEFT":
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
300
                    return ["join" => "LEFT JOIN " . $table . " ON " . $on[0] . " = " . $on[1]];
301
                    break;
0 ignored issues
show
Unused Code introduced by
break is not strictly necessary here and could be removed.

The break statement is not necessary if it is preceded for example by a return statement:

switch ($x) {
    case 1:
        return 'foo';
        break; // This break is not necessary and can be left off.
}

If you would like to keep this construct to be consistent with other case statements, you can safely mark this issue as a false-positive.

Loading history...
302
303 View Code Duplication
                case "RIGHT":
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
304
                    return ["join" => "RIGHT JOIN " . $table . " ON " . $on[0] . " = " . $on[1]];
305
                    break;
0 ignored issues
show
Unused Code introduced by
break is not strictly necessary here and could be removed.

The break statement is not necessary if it is preceded for example by a return statement:

switch ($x) {
    case 1:
        return 'foo';
        break; // This break is not necessary and can be left off.
}

If you would like to keep this construct to be consistent with other case statements, you can safely mark this issue as a false-positive.

Loading history...
306
307 View Code Duplication
                case "FULL OUTER":
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
308
                    return ["join" => "FULL OUTER JOIN " . $table . " ON " . $on[0] . " = " . $on[1]];
309
                    break;
0 ignored issues
show
Unused Code introduced by
break is not strictly necessary here and could be removed.

The break statement is not necessary if it is preceded for example by a return statement:

switch ($x) {
    case 1:
        return 'foo';
        break; // This break is not necessary and can be left off.
}

If you would like to keep this construct to be consistent with other case statements, you can safely mark this issue as a false-positive.

Loading history...
310
311 View Code Duplication
                default:
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
312
                    return ["join" => "INNER JOIN " . $table . " ON " . $on[0] . " = " . $on[1]];
313
            }
314
315
        } catch (PhiberException $phiberException) {
316
            throw new PhiberException("join_no_exists");
317
        }
318
    }
319
320
    /**
321
     * Função para determinar os campos que quer buscar no SELECT.
322
     * 
323
     * @example Exemplo: fields("nome, id");
324
     * Gerará: Select nome, id from ...
325
     * Caso não informar campos, retornará todos.
326
     * @param  array $fields
327
     * @return array
328
     */
329
    public function fields(array $fields)
330
    {
331
        if (!empty($fields)) {
332
            return ["fields" => $fields];
333
        }
334
335
        return ["fields" => ["*"]];
336
    }
337
338
    /**
339
     * Adiciona os campos e os valores.
340
     * 
341
     * @ignore
342
     * @param string $field
343
     * @param mixed $value
344
     */
345
    private function addFieldsAndValues($field, $value)
346
    {
347
        self::$fieldsAndValues['fields_and_values'][$field] = $value;
348
    }
349
}
350