|
1 <?php |
|
2 /** |
|
3 * Zend Framework |
|
4 * |
|
5 * LICENSE |
|
6 * |
|
7 * This source file is subject to the new BSD license that is bundled |
|
8 * with this package in the file LICENSE.txt. |
|
9 * It is also available through the world-wide-web at this URL: |
|
10 * http://framework.zend.com/license/new-bsd |
|
11 * If you did not receive a copy of the license and are unable to |
|
12 * obtain it through the world-wide-web, please send an email |
|
13 * to license@zend.com so we can send you a copy immediately. |
|
14 * |
|
15 * @category Zend |
|
16 * @package Zend_Service_WindowsAzure |
|
17 * @subpackage Storage |
|
18 * @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com) |
|
19 * @license http://framework.zend.com/license/new-bsd New BSD License |
|
20 * @version $Id: TableEntityQuery.php 23167 2010-10-19 17:53:31Z mabe $ |
|
21 */ |
|
22 |
|
23 /** |
|
24 * @category Zend |
|
25 * @package Zend_Service_WindowsAzure |
|
26 * @subpackage Storage |
|
27 * @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com) |
|
28 * @license http://framework.zend.com/license/new-bsd New BSD License |
|
29 */ |
|
30 class Zend_Service_WindowsAzure_Storage_TableEntityQuery |
|
31 { |
|
32 /** |
|
33 * From |
|
34 * |
|
35 * @var string |
|
36 */ |
|
37 protected $_from = ''; |
|
38 |
|
39 /** |
|
40 * Where |
|
41 * |
|
42 * @var array |
|
43 */ |
|
44 protected $_where = array(); |
|
45 |
|
46 /** |
|
47 * Order by |
|
48 * |
|
49 * @var array |
|
50 */ |
|
51 protected $_orderBy = array(); |
|
52 |
|
53 /** |
|
54 * Top |
|
55 * |
|
56 * @var int |
|
57 */ |
|
58 protected $_top = null; |
|
59 |
|
60 /** |
|
61 * Partition key |
|
62 * |
|
63 * @var string |
|
64 */ |
|
65 protected $_partitionKey = null; |
|
66 |
|
67 /** |
|
68 * Row key |
|
69 * |
|
70 * @var string |
|
71 */ |
|
72 protected $_rowKey = null; |
|
73 |
|
74 /** |
|
75 * Select clause |
|
76 * |
|
77 * @return Zend_Service_WindowsAzure_Storage_TableEntityQuery |
|
78 */ |
|
79 public function select() |
|
80 { |
|
81 return $this; |
|
82 } |
|
83 |
|
84 /** |
|
85 * From clause |
|
86 * |
|
87 * @param string $name Table name to select entities from |
|
88 * @return Zend_Service_WindowsAzure_Storage_TableEntityQuery |
|
89 */ |
|
90 public function from($name) |
|
91 { |
|
92 $this->_from = $name; |
|
93 return $this; |
|
94 } |
|
95 |
|
96 /** |
|
97 * Specify partition key |
|
98 * |
|
99 * @param string $value Partition key to query for |
|
100 * @return Zend_Service_WindowsAzure_Storage_TableEntityQuery |
|
101 */ |
|
102 public function wherePartitionKey($value = null) |
|
103 { |
|
104 $this->_partitionKey = $value; |
|
105 return $this; |
|
106 } |
|
107 |
|
108 /** |
|
109 * Specify row key |
|
110 * |
|
111 * @param string $value Row key to query for |
|
112 * @return Zend_Service_WindowsAzure_Storage_TableEntityQuery |
|
113 */ |
|
114 public function whereRowKey($value = null) |
|
115 { |
|
116 $this->_rowKey = $value; |
|
117 return $this; |
|
118 } |
|
119 |
|
120 /** |
|
121 * Add where clause |
|
122 * |
|
123 * @param string $condition Condition, can contain question mark(s) (?) for parameter insertion. |
|
124 * @param string|array $value Value(s) to insert in question mark (?) parameters. |
|
125 * @param string $cond Condition for the clause (and/or/not) |
|
126 * @return Zend_Service_WindowsAzure_Storage_TableEntityQuery |
|
127 */ |
|
128 public function where($condition, $value = null, $cond = '') |
|
129 { |
|
130 $condition = $this->_replaceOperators($condition); |
|
131 |
|
132 if ($value !== null) { |
|
133 $condition = $this->_quoteInto($condition, $value); |
|
134 } |
|
135 |
|
136 if (count($this->_where) == 0) { |
|
137 $cond = ''; |
|
138 } else if ($cond !== '') { |
|
139 $cond = ' ' . strtolower(trim($cond)) . ' '; |
|
140 } |
|
141 |
|
142 $this->_where[] = $cond . $condition; |
|
143 return $this; |
|
144 } |
|
145 |
|
146 /** |
|
147 * Add where clause with AND condition |
|
148 * |
|
149 * @param string $condition Condition, can contain question mark(s) (?) for parameter insertion. |
|
150 * @param string|array $value Value(s) to insert in question mark (?) parameters. |
|
151 * @return Zend_Service_WindowsAzure_Storage_TableEntityQuery |
|
152 */ |
|
153 public function andWhere($condition, $value = null) |
|
154 { |
|
155 return $this->where($condition, $value, 'and'); |
|
156 } |
|
157 |
|
158 /** |
|
159 * Add where clause with OR condition |
|
160 * |
|
161 * @param string $condition Condition, can contain question mark(s) (?) for parameter insertion. |
|
162 * @param string|array $value Value(s) to insert in question mark (?) parameters. |
|
163 * @return Zend_Service_WindowsAzure_Storage_TableEntityQuery |
|
164 */ |
|
165 public function orWhere($condition, $value = null) |
|
166 { |
|
167 return $this->where($condition, $value, 'or'); |
|
168 } |
|
169 |
|
170 /** |
|
171 * OrderBy clause |
|
172 * |
|
173 * @param string $column Column to sort by |
|
174 * @param string $direction Direction to sort (asc/desc) |
|
175 * @return Zend_Service_WindowsAzure_Storage_TableEntityQuery |
|
176 */ |
|
177 public function orderBy($column, $direction = 'asc') |
|
178 { |
|
179 $this->_orderBy[] = $column . ' ' . $direction; |
|
180 return $this; |
|
181 } |
|
182 |
|
183 /** |
|
184 * Top clause |
|
185 * |
|
186 * @param int $top Top to fetch |
|
187 * @return Zend_Service_WindowsAzure_Storage_TableEntityQuery |
|
188 */ |
|
189 public function top($top = null) |
|
190 { |
|
191 $this->_top = (int)$top; |
|
192 return $this; |
|
193 } |
|
194 |
|
195 /** |
|
196 * Assembles the query string |
|
197 * |
|
198 * @param boolean $urlEncode Apply URL encoding to the query string |
|
199 * @return string |
|
200 */ |
|
201 public function assembleQueryString($urlEncode = false) |
|
202 { |
|
203 $query = array(); |
|
204 if (count($this->_where) != 0) { |
|
205 $filter = implode('', $this->_where); |
|
206 $query[] = '$filter=' . ($urlEncode ? self::encodeQuery($filter) : $filter); |
|
207 } |
|
208 |
|
209 if (count($this->_orderBy) != 0) { |
|
210 $orderBy = implode(',', $this->_orderBy); |
|
211 $query[] = '$orderby=' . ($urlEncode ? self::encodeQuery($orderBy) : $orderBy); |
|
212 } |
|
213 |
|
214 if ($this->_top !== null) { |
|
215 $query[] = '$top=' . $this->_top; |
|
216 } |
|
217 |
|
218 if (count($query) != 0) { |
|
219 return '?' . implode('&', $query); |
|
220 } |
|
221 |
|
222 return ''; |
|
223 } |
|
224 |
|
225 /** |
|
226 * Assemble from |
|
227 * |
|
228 * @param boolean $includeParentheses Include parentheses? () |
|
229 * @return string |
|
230 */ |
|
231 public function assembleFrom($includeParentheses = true) |
|
232 { |
|
233 $identifier = ''; |
|
234 if ($includeParentheses) { |
|
235 $identifier .= '('; |
|
236 |
|
237 if ($this->_partitionKey !== null) { |
|
238 $identifier .= 'PartitionKey=\'' . $this->_partitionKey . '\''; |
|
239 } |
|
240 |
|
241 if ($this->_partitionKey !== null && $this->_rowKey !== null) { |
|
242 $identifier .= ', '; |
|
243 } |
|
244 |
|
245 if ($this->_rowKey !== null) { |
|
246 $identifier .= 'RowKey=\'' . $this->_rowKey . '\''; |
|
247 } |
|
248 |
|
249 $identifier .= ')'; |
|
250 } |
|
251 return $this->_from . $identifier; |
|
252 } |
|
253 |
|
254 /** |
|
255 * Assemble full query |
|
256 * |
|
257 * @return string |
|
258 */ |
|
259 public function assembleQuery() |
|
260 { |
|
261 $assembledQuery = $this->assembleFrom(); |
|
262 |
|
263 $queryString = $this->assembleQueryString(); |
|
264 if ($queryString !== '') { |
|
265 $assembledQuery .= $queryString; |
|
266 } |
|
267 |
|
268 return $assembledQuery; |
|
269 } |
|
270 |
|
271 /** |
|
272 * Quotes a variable into a condition |
|
273 * |
|
274 * @param string $text Condition, can contain question mark(s) (?) for parameter insertion. |
|
275 * @param string|array $value Value(s) to insert in question mark (?) parameters. |
|
276 * @return string |
|
277 */ |
|
278 protected function _quoteInto($text, $value = null) |
|
279 { |
|
280 if (!is_array($value)) { |
|
281 $text = str_replace('?', '\'' . addslashes($value) . '\'', $text); |
|
282 } else { |
|
283 $i = 0; |
|
284 while(strpos($text, '?') !== false) { |
|
285 if (is_numeric($value[$i])) { |
|
286 $text = substr_replace($text, $value[$i++], strpos($text, '?'), 1); |
|
287 } else { |
|
288 $text = substr_replace($text, '\'' . addslashes($value[$i++]) . '\'', strpos($text, '?'), 1); |
|
289 } |
|
290 } |
|
291 } |
|
292 return $text; |
|
293 } |
|
294 |
|
295 /** |
|
296 * Replace operators |
|
297 * |
|
298 * @param string $text |
|
299 * @return string |
|
300 */ |
|
301 protected function _replaceOperators($text) |
|
302 { |
|
303 $text = str_replace('==', 'eq', $text); |
|
304 $text = str_replace('>', 'gt', $text); |
|
305 $text = str_replace('<', 'lt', $text); |
|
306 $text = str_replace('>=', 'ge', $text); |
|
307 $text = str_replace('<=', 'le', $text); |
|
308 $text = str_replace('!=', 'ne', $text); |
|
309 |
|
310 $text = str_replace('&&', 'and', $text); |
|
311 $text = str_replace('||', 'or', $text); |
|
312 $text = str_replace('!', 'not', $text); |
|
313 |
|
314 return $text; |
|
315 } |
|
316 |
|
317 /** |
|
318 * urlencode a query |
|
319 * |
|
320 * @param string $query Query to encode |
|
321 * @return string Encoded query |
|
322 */ |
|
323 public static function encodeQuery($query) |
|
324 { |
|
325 $query = str_replace('/', '%2F', $query); |
|
326 $query = str_replace('?', '%3F', $query); |
|
327 $query = str_replace(':', '%3A', $query); |
|
328 $query = str_replace('@', '%40', $query); |
|
329 $query = str_replace('&', '%26', $query); |
|
330 $query = str_replace('=', '%3D', $query); |
|
331 $query = str_replace('+', '%2B', $query); |
|
332 $query = str_replace(',', '%2C', $query); |
|
333 $query = str_replace('$', '%24', $query); |
|
334 |
|
335 |
|
336 $query = str_replace(' ', '%20', $query); |
|
337 |
|
338 return $query; |
|
339 } |
|
340 |
|
341 /** |
|
342 * __toString overload |
|
343 * |
|
344 * @return string |
|
345 */ |
|
346 public function __toString() |
|
347 { |
|
348 return $this->assembleQuery(); |
|
349 } |
|
350 } |