Passed
Push — master ( f16abf...a45e17 )
by y
01:38
created

TextTrait::concat()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 8
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
eloc 5
c 1
b 0
f 0
nc 2
nop 1
dl 0
loc 8
rs 10
1
<?php
2
3
namespace Helix\DB\Fluent\Text;
4
5
use Helix\DB\Fluent\Num;
6
use Helix\DB\Fluent\Num\BaseConversionTrait;
7
use Helix\DB\Fluent\Text;
8
use Helix\DB\Fluent\Value\ValueTrait;
9
use Helix\DB\Fluent\ValueInterface;
10
11
/**
12
 * Character string expression manipulation.
13
 */
14
trait TextTrait
15
{
16
17
    use ValueTrait;
18
    use BaseConversionTrait;
19
20
    /**
21
     * Concatenate other strings.
22
     *
23
     * - SQLite: `($this || ...)`
24
     * - MySQL: `CONCAT($this, ...)`
25
     *
26
     * @param string|ValueInterface ...$strings
27
     * @return Text
28
     */
29
    public function concat(...$strings)
30
    {
31
        array_unshift($strings, $this);
32
        $strings = $this->db->quoteArray($strings);
33
        if ($this->db->isSQLite()) {
34
            return Text::factory($this->db, sprintf('(%s)', implode(' || ', $strings)));
35
        }
36
        return Text::factory($this->db, sprintf('CONCAT(%s)', implode(',', $strings)));
37
    }
38
39
    /**
40
     * Hex representation.
41
     *
42
     * `HEX($this)`
43
     *
44
     * @return Text
45
     */
46
    public function hex()
47
    {
48
        return Text::factory($this->db, "HEX({$this})");
49
    }
50
51
    /**
52
     * Number of characters (not necessarily bytes).
53
     *
54
     * @see TextTrait::size()
55
     *
56
     * @return Num
57
     */
58
    public function length()
59
    {
60
        if ($this->db->isSQLite()) {
61
            return Num::factory($this->db, "LENGTH(CAST({$this} AS TEXT))");
62
        }
63
        return Num::factory($this->db, "CHAR_LENGTH({$this})");
64
    }
65
66
    /**
67
     * Lowercase.
68
     *
69
     * `LOWER($this)`
70
     *
71
     * @return Text
72
     */
73
    public function lower()
74
    {
75
        return Text::factory($this->db, "LOWER({$this})");
76
    }
77
78
    /**
79
     * Substring's position (1-based).
80
     *
81
     * The position is `0` if the substring isn't found.
82
     *
83
     * @param string $substring
84
     * @return Num
85
     */
86
    public function position(string $substring)
87
    {
88
        $substring = $this->db->quote($substring);
89
        if ($this->db->isSQLite()) {
90
            return Num::factory($this->db, "INSTR({$this},{$substring})");
91
        }
92
        return Num::factory($this->db, "LOCATE({$substring},{$this})");
93
    }
94
95
    /**
96
     * String replacement.
97
     *
98
     * `REPLACE($this,$search,$replace)`
99
     *
100
     * @param string $search
101
     * @param string $replace
102
     * @return Text
103
     */
104
    public function replace(string $search, string $replace)
105
    {
106
        $search = $this->db->quote($search);
107
        $replace = $this->db->quote($replace);
108
        return Text::factory($this->db, "REPLACE({$this},{$search},{$replace})");
109
    }
110
111
    /**
112
     * Size in bytes.
113
     *
114
     * @return Num
115
     */
116
    public function size()
117
    {
118
        if ($this->db->isSQLite()) {
119
            return Num::factory($this->db, "LENGTH(CAST({$this} AS BLOB))");
120
        }
121
        return Num::factory($this->db, "LENGTH({$this})");
122
    }
123
124
    /**
125
     * Substring.
126
     *
127
     * `SUBSTR($this,$start)` or `SUBSTR($this,$start,$length)`
128
     *
129
     * @param int $start 1-based, can be negative to start from the right.
130
     * @param null|int $length
131
     * @return Text
132
     */
133
    public function substr(int $start, int $length = null)
134
    {
135
        if (isset($length)) {
136
            return Text::factory($this->db, "SUBSTR({$this},{$start},{$length})");
137
        }
138
        return Text::factory($this->db, "SUBSTR({$this},{$start})");
139
    }
140
141
    /**
142
     * Convert from an arbitrary base to base 10.
143
     *
144
     * `CONV($this,$from,10)`
145
     *
146
     * @param int $from
147
     * @return Num
148
     */
149
    public function toBase10(int $from)
150
    {
151
        return Num::factory($this->db, "CONV({$this},{$from},10)");
152
    }
153
154
    /**
155
     * Uppercase.
156
     *
157
     * `UPPER($this)`
158
     *
159
     * @return Text
160
     */
161
    public function upper()
162
    {
163
        return Text::factory($this->db, "UPPER({$this})");
164
    }
165
}
166