Completed
Push — master ( 77a63f...cef321 )
by Restu
11:38
created

GrammarMySql::update()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 17
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
eloc 10
c 1
b 0
f 0
nc 2
nop 0
dl 0
loc 17
rs 9.4285
1
<?php
2
namespace JayaCode\Framework\Core\Database\Query\Grammar;
3
4
use JayaCode\Framework\Core\Database\Query\Query;
5
use Stringy\Stringy;
6
7
/**
8
 * Class GrammarMySql
9
 * @package JayaCode\Framework\Core\Database\Query\Grammar
10
 */
11
class GrammarMySql extends Grammar
12
{
13
14
    /**
15
     * @return string
16
     */
17
    public function build()
18
    {
19
        switch ($this->query->getType()) {
20
            case Query::TYPE_SELECT:
21
                return $this->select();
22
23
            case Query::TYPE_INSERT:
24
                return $this->insert();
25
26
            case Query::TYPE_UPDATE:
27
                return $this->update();
28
29
            case Query::TYPE_QUERY:
30
                return $this->query->query;
31
        }
32
        return null;
33
    }
34
35
    /**
36
     * @return string
37
     */
38
    private function select()
39
    {
40
        $this->queryString = "SELECT ";
41
42
        $this->queryString .= $this->selectColumn();
43
44
        $table = $this->query->table;
45
        $this->queryString .= " FROM {$this->getFormattedTableOrColumn($table)}";
46
47
        $this->queryString .= $this->where();
48
49
        return $this->queryString;
50
    }
51
52
    /**
53
     * @return string
54
     */
55
    private function selectColumn()
56
    {
57
        $columns = $this->query->columns;
58
        if (is_null($columns)) {
59
            $columns = [Query::sql("*")];
60
        }
61
62
        if (is_string($columns)) {
63
            $columns = array($columns);
64
        }
65
66
        foreach ($columns as $key => $val) {
67
            if ($columns[$key] instanceof Query) {
68
                $columns[$key] = $columns[$key]->query;
69
            } else {
70
                $columns[$key] = $this->getFormattedTableOrColumn($val);
71
            }
72
        }
73
74
        return implode(', ', $columns);
75
    }
76
77
    /**
78
     * @return string
79
     */
80
    private function where()
81
    {
82
        if (count($this->query->where) <= 0) {
83
            return "";
84
        }
85
86
        $q = Stringy::create("");
87
88
        foreach ($this->query->where as $where) {
89
            $type = $where[0];
90
            $arr = $where[1];
91
92
            if ($q->count() > 1) {
93
                $q = $q->append(" {$type} ");
94
            }
95
96
            if (is_string($arr)) {
97
                $q = $q->append($arr);
98
            }
99
100
            if (is_array($arr)) {
101
                $q = $q->append($this->buildArrWhere($arr));
102
103
                $this->params[] = $arr[2];
104
            }
105
        }
106
107
        return $q->count()?$q->prepend(" WHERE ")->__toString():"";
108
    }
109
110
    /**
111
     * @param $arr
112
     * @return string
113
     */
114
    private function buildArrWhere($arr)
115
    {
116
        if (count($arr) != 3) {
117
            throw new \OutOfBoundsException();
118
        }
119
120
        switch ($arr[1]) {
121
            case "BETWEEN":
122
                return "`{$arr[0]}` {$arr[1]} ? AND ?";
123
            default:
124
                return "`{$arr[0]}` {$arr[1]} ?";
125
        }
126
    }
127
128
    /**
129
     * @return string
130
     */
131
    private function insert()
132
    {
133
134
        $this->params = $this->query->values;
135
136
        $table = $this->query->table;
137
        $this->queryString = "INSERT INTO {$this->getFormattedTableOrColumn($table)}";
138
139
        $this->queryString .= "({$this->selectColumn()})";
140
141
        $this->queryString .= " VALUES(";
142
143
        $params = array();
144
145
        for ($i=0, $c=count($this->query->columns); $i<$c; $i++) {
146
            $params[$i] = "?";
147
        }
148
149
        $this->queryString .= join(', ', $params).")";
150
151
        return $this->queryString;
152
    }
153
154
    /**
155
     *
156
     */
157
    private function update()
158
    {
159
        $this->params = $this->query->values;
160
161
        $table = $this->query->table;
162
        $this->queryString = "UPDATE {$this->getFormattedTableOrColumn($table)} SET ";
163
164
        $arrSet = array();
165
        foreach ($this->query->columns as $column) {
166
            $arrSet[] = "{$this->getFormattedTableOrColumn($column)} = ?";
167
        }
168
        $this->queryString .= join(", ", $arrSet);
169
170
        $this->queryString .= $this->where();
171
172
        return $this->queryString;
173
    }
174
175
    /**
176
     * @param null $str
177
     * @return null|string
178
     */
179
    private function getFormattedTableOrColumn($str = null)
180
    {
181
        $tmpStr = $str?$str:$this->query->table;
182
        $strArr = explode(".", $tmpStr);
183
184
        foreach ($strArr as $key => $val) {
185
            $strArr[$key] = "`{$val}`";
186
        }
187
188
        return join(".", $strArr);
189
    }
190
}
191