Passed
Push — master ( 99686f...b494ba )
by Jean-Christophe
11:21
created

ConditionParser::refactorParts()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 5
c 1
b 0
f 0
dl 0
loc 7
ccs 6
cts 6
cp 1
rs 10
cc 2
nc 2
nop 0
crap 2
1
<?php
2
namespace Ubiquity\orm\parser;
3
4
use Ubiquity\orm\OrmUtils;
5
use Ubiquity\db\SqlUtils;
6
7
/**
8
 * Represents a query condition.
9
 *
10
 * Ubiquity\orm\parser$ConditionParser
11
 * This class is part of Ubiquity
12
 *
13
 * @author jcheron <[email protected]>
14
 * @version 1.0.2
15
 *
16
 */
17
class ConditionParser {
18
19
	private $firstPart;
20
21
	private $condition;
22
23
	private $parts = [];
24
25
	private $params;
26
27
	private $invertedParams = true;
28
29 81
	public function __construct($condition = null, $firstPart = null, $params = null) {
30 81
		$this->condition = $condition;
31 81
		$this->firstPart = $firstPart;
32 81
		if (\is_array($params)) {
33 8
			$this->setParams($params);
34
		}
35 81
	}
36
37 53
	public function addKeyValues($keyValues, $classname, $separator = ' AND ') {
38 53
		if (! \is_array($keyValues)) {
39 25
			$this->condition = $this->parseKey($keyValues, $classname);
40
		} else {
41 37
			if ((\array_keys($keyValues) === \range(0, \count($keyValues) - 1))) { // Not associative array
42 35
				if (isset($classname)) {
43 35
					$keys = OrmUtils::getKeyFields($classname);
44 35
					if (\is_array($keys)) {
45 35
						$keyValues = \array_combine($keys, $keyValues);
46
					}
47
				}
48
			}
49 37
			$retArray = array();
50 37
			foreach ($keyValues as $key => $value) {
51 37
				if ($this->addParams($value)) {
52 37
					$retArray[] = SqlUtils::$quote . $key . SqlUtils::$quote . ' = ?';
53
				}
54
			}
55 37
			$this->condition = \implode($separator, $retArray);
56
		}
57 53
	}
58
59 17
	public function setKeyValues($values) {
60 17
		if (! \is_array($values)) {
61 11
			$this->params = [
62 11
				$values => true
63
			];
64
			return [
65 11
				$values
66
			];
67
		} else {
68 7
			$this->params = [];
69 7
			$ret = [];
70 7
			foreach ($values as $val) {
71 7
				$this->params[$val] = true;
72 7
				$ret[] = $val;
73
			}
74 7
			return $ret;
75
		}
76
	}
77
78 69
	private function addParams($value) {
79 69
		if (! isset($this->params[$value])) {
80 69
			return $this->params[$value] = true;
81
		}
82 13
		return false;
83
	}
84
85 43
	public function addPart($condition, $value) {
86 43
		if ($this->addParams($value)) {
87 43
			$this->parts[] = $condition;
88 43
			return true;
89
		}
90
		return false;
91
	}
92
93 23
	public function addParts($condition, $values) {
94 23
		foreach ($values as $value) {
95 23
			if ($this->addParams($value)) {
96 23
				$this->parts[] = $condition;
97
			}
98
		}
99 23
	}
100
101 46
	public function compileParts($separator = ' OR ') {
102 46
		if ($separator == ' OR ' && \sizeof($this->parts) > 3) {
103 24
			$parts = $this->refactorParts();
104 24
			$conditions = [];
105 24
			foreach ($parts as $part => $values) {
106 24
				$values[0] = 'SELECT ? as _id';
107 24
				$conditions[] = ' INNER JOIN (' . \implode(' UNION ALL SELECT ', $values) . ') as _tmp ON ' . $part . '=_tmp._id';
108
			}
109 24
			$this->condition = \implode(' ', $conditions);
110
		} else {
111 39
			$this->condition = \implode($separator, $this->parts);
112
		}
113 46
	}
114
115 24
	private function refactorParts() {
116 24
		$result = [];
117 24
		foreach ($this->parts as $part) {
118 24
			$part = \str_replace('= ?', '', $part);
119 24
			$result[$part][] = '?';
120
		}
121 24
		return $result;
122
	}
123
124 25
	private function parseKey($keyValues, $className) {
125 25
		$condition = $keyValues;
126 25
		if (\strrpos($keyValues, '=') === false && \strrpos($keyValues, '>') === false && \strrpos($keyValues, '<') === false) {
127 11
			if ($this->addParams($keyValues)) {
128 11
				$condition = SqlUtils::$quote . OrmUtils::getFirstKey($className) . SqlUtils::$quote . '= ?';
129
			}
130
		}
131 25
		return $condition;
132
	}
133
134
	/**
135
	 *
136
	 * @return string
137
	 */
138 83
	public function getCondition() {
139 83
		if ($this->firstPart == null)
140 83
			return $this->condition;
141 3
		$ret = $this->firstPart;
142 3
		if (isset($this->condition)) {
143 3
			$ret .= ' WHERE ' . $this->condition;
144
		}
145 3
		return $ret;
146
	}
147
148
	/**
149
	 *
150
	 * @return mixed
151
	 */
152 70
	public function getParams() {
153 70
		if (\is_array($this->params)) {
154 63
			if ($this->invertedParams) {
155 58
				return \array_keys($this->params);
156
			}
157 9
			return $this->params;
158
		}
159 43
		return;
160
	}
161
162
	/**
163
	 *
164
	 * @return mixed
165
	 */
166 43
	public function hasParam($value) {
167 43
		if (\is_array($this->params)) {
168 20
			if ($this->invertedParams) {
169 20
				return isset($this->params[$value]);
170
			}
171
			return \array_search($value, $this->params) !== false;
172
		}
173 43
		return false;
174
	}
175
176 43
	public function countParts() {
177 43
		if (\is_array($this->params))
178 20
			return \sizeof($this->params);
179 43
		return 0;
180
	}
181
182
	/**
183
	 *
184
	 * @param string $condition
185
	 */
186 28
	public function setCondition($condition) {
187 28
		$this->condition = $condition;
188 28
		return $this;
189
	}
190
191
	/**
192
	 *
193
	 * @param mixed $params
194
	 */
195 9
	public function setParams($params) {
196 9
		$this->params = $params;
197 9
		$this->invertedParams = false;
198 9
		return $this;
199
	}
200
201 62
	public function limitOne() {
202 62
		$limit = '';
203 62
		if (\stripos($this->condition, ' limit ') === false) {
204 54
			$limit = ' limit 1';
205
		}
206 62
		$this->condition .= $limit;
207 62
	}
208
209 11
	public static function simple($condition, $params) {
210 11
		$cParser = new ConditionParser($condition);
211 11
		$cParser->addParams($params);
212 11
		return $cParser;
213
	}
214
}
215
216