Passed
Push — master ( 500a63...c8d25d )
by Glynn
03:58 queued 01:28
created

TablePrefixer::addTablePrefix()   C

Complexity

Conditions 12
Paths 25

Size

Total Lines 49
Code Lines 23

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 12
eloc 23
c 1
b 0
f 0
nc 25
nop 2
dl 0
loc 49
rs 6.9666

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 Pixie\QueryBuilder;
4
5
use Closure;
6
use Pixie\Exception;
7
use Pixie\Connection;
8
use Pixie\QueryBuilder\Raw;
9
10
trait TablePrefixer
11
{
12
    /**
13
         * Add table prefix (if given) on given string.
14
         *
15
         * @param array<string|int, string|int|float|bool|Raw|Closure>|string|int|float|bool|Raw|Closure     $values
16
         * @param bool $tableFieldMix If we have mixes of field and table names with a "."
17
         *
18
         * @return mixed|mixed[]
19
         */
20
    public function addTablePrefix($values, bool $tableFieldMix = true)
21
    {
22
        if (is_null($this->getTablePrefix())) {
23
            return $values;
24
        }
25
26
        // $value will be an array and we will add prefix to all table names
27
28
        // If supplied value is not an array then make it one
29
        $single = false;
30
        if (!is_array($values)) {
31
            $values = [$values];
32
            // We had single value, so should return a single value
33
            $single = true;
34
        }
35
36
        $return = [];
37
38
        foreach ($values as $key => $value) {
39
            // It's a raw query, just add it to our return array and continue next
40
            if ($value instanceof Raw || $value instanceof Closure) {
41
                $return[$key] = $value;
42
                continue;
43
            }
44
45
            // If key is not integer, it is likely a alias mapping,
46
            // so we need to change prefix target
47
            $target = &$value;
48
            if (!is_int($key)) {
49
                $target = &$key;
50
            }
51
52
            // Do prefix if the target is an expression or function.
53
            if (
54
                !$tableFieldMix
55
                || (
56
                    is_string($target) // Must be a string
57
                    && (bool) preg_match('/^[A-Za-z0-9_.]+$/', $target) // Can only contain letters, numbers, underscore and full stops
58
                    && 1 === \substr_count($target, '.') // Contains a single full stop ONLY.
59
                )
60
            ) {
61
                $target = $this->getTablePrefix() . $target;
62
            }
63
64
            $return[$key] = $value;
65
        }
66
67
        // If we had single value then we should return a single value (end value of the array)
68
        return true === $single ? end($return) : $return;
69
    }
70
71
    /**
72
     * Returns the table prefix if defined in connection
73
     *
74
     * @return string|null
75
     */
76
    protected function getTablePrefix(): ?string
77
    {
78
        $adapterConfig = $this->getConnection()->getAdapterConfig();
79
        return isset($adapterConfig[Connection::PREFIX])
80
            ? $adapterConfig[Connection::PREFIX]
81
            : null;
82
    }
83
84
    abstract public function getConnection(): Connection;
85
}
86