Passed
Push — main ( c57f14...b113cb )
by Thierry
02:36
created

QueryUtilTrait::getEditFunctionNames()   B

Complexity

Conditions 10
Paths 5

Size

Total Lines 16
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 10
eloc 9
c 1
b 0
f 0
nc 5
nop 3
dl 0
loc 16
rs 7.6666

How to fix   Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
namespace Lagdo\DbAdmin\Db\Traits;
4
5
use Lagdo\DbAdmin\Driver\Entity\TableFieldEntity;
6
7
trait QueryUtilTrait
8
{
9
    /**
10
     * @param TableFieldEntity $field
11
     * @param array $values First entries
12
     * @param bool $update
13
     *
14
     * @return string[]
15
     */
16
    private function getEditFunctionNames(TableFieldEntity $field, array $values, bool $update): array
17
    {
18
        $names = $values;
19
        foreach ($this->driver->editFunctions() as $key => $functions) {
20
            if (!$key || (!isset($this->input->values['call']) && $update)) { // relative functions
21
                foreach ($functions as $pattern => $value) {
22
                    if (!$pattern || preg_match("~$pattern~", $field->type)) {
23
                        $names[] = $value;
24
                    }
25
                }
26
            }
27
            if ($key && !preg_match('~set|blob|bytea|raw|file|bool~', $field->type)) {
28
                $names[] = 'SQL';
29
            }
30
        }
31
        return $names;
32
    }
33
34
    /**
35
     * Functions displayed in edit form
36
     *
37
     * @param TableFieldEntity $field Single field from fields()
38
     *
39
     * @return array
40
     */
41
    public function editFunctions(TableFieldEntity $field): array
42
    {
43
        $update = isset($this->input->values['select']); // || $this->where([]);
44
        if ($field->autoIncrement && !$update) {
45
            return [$this->trans->lang('Auto Increment')];
46
        }
47
48
        $names = ($field->null ? ['NULL', ''] : ['']);
49
        return $this->getEditFunctionNames($field, $names, $update);
50
    }
51
52
    /**
53
     * Create SQL string from field type
54
     *
55
     * @param TableFieldEntity $field
56
     * @param string $collate
57
     *
58
     * @return string
59
     */
60
    private function processType(TableFieldEntity $field, string $collate = 'COLLATE'): string
61
    {
62
        $collation = '';
63
        if (preg_match('~char|text|enum|set~', $field->type) && $field->collation) {
64
            $collation = " $collate " . $this->driver->quote($field->collation);
65
        }
66
        $sign = '';
67
        if (preg_match($this->driver->numberRegex(), $field->type) &&
68
            in_array($field->unsigned, $this->driver->unsigned())) {
69
            $sign = ' ' . $field->unsigned;
70
        }
71
        return ' ' . $field->type . $this->processLength($field->length) . $sign . $collation;
0 ignored issues
show
Bug introduced by
It seems like processLength() must be provided by classes using this trait. How about adding it as abstract method to this trait? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

71
        return ' ' . $field->type . $this->/** @scrutinizer ignore-call */ processLength($field->length) . $sign . $collation;
Loading history...
72
    }
73
74
    /**
75
     * Create SQL string from field
76
     *
77
     * @param TableFieldEntity $field Basic field information
78
     * @param TableFieldEntity $typeField Information about field type
79
     *
80
     * @return array
81
     */
82
    public function processField(TableFieldEntity $field, TableFieldEntity $typeField): array
83
    {
84
        $onUpdate = '';
85
        if (preg_match('~timestamp|datetime~', $field->type) && $field->onUpdate) {
86
            $onUpdate = ' ON UPDATE ' . $field->onUpdate;
87
        }
88
        $comment = '';
89
        if ($this->driver->support('comment') && $field->comment !== '') {
90
            $comment = ' COMMENT ' . $this->driver->quote($field->comment);
91
        }
92
        $null = $field->null ? ' NULL' : ' NOT NULL'; // NULL for timestamp
93
        $autoIncrement = $field->autoIncrement ? $this->driver->autoIncrement() : null;
94
        return [$this->driver->escapeId(trim($field->name)), $this->processType($typeField),
95
            $null, $this->driver->defaultValue($field), $onUpdate, $comment, $autoIncrement];
96
    }
97
}
98