Skip to content

Commit 4f4396e

Browse files
committed
Improve the QueryParser
Add a new validity check for unexpected "." in query. Add support for "count" queries, with 2 new extensions: "as" and "group".
1 parent 22bd2be commit 4f4396e

File tree

1 file changed

+50
-2
lines changed

1 file changed

+50
-2
lines changed

src/JSONDB/QueryParser.php

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ class QueryParser
7373
* A list of supported queries
7474
* @var array
7575
*/
76-
private static $supportedQueries = array('select', 'insert', 'delete', 'replace', 'truncate', 'update');
76+
private static $supportedQueries = array('select', 'insert', 'delete', 'replace', 'truncate', 'update', 'count');
7777

7878
/**
7979
* Registered query operators
@@ -114,7 +114,10 @@ public function parse($query)
114114
}
115115

116116
// Checking query's parts validity
117-
foreach (array_slice($queryParts, 1) as $part) {
117+
foreach (array_slice($queryParts, 1) as $index => $part) {
118+
if (NULL === $part || $part === '') {
119+
throw new Exception("JSONDB Query Parse Error: Unexpected \".\" after extension \"{$queryParts[$index]}\".");
120+
}
118121
if (FALSE === (bool)preg_match('#\w+\(.*\)#', $part)) {
119122
throw new Exception("JSONDB Query Parse Error: There is an error at the extension \"{$part}\".");
120123
}
@@ -171,6 +174,14 @@ public function parse($query)
171174
case 'with':
172175
$extensions['with'] = $this->_parseWithExtension($string);
173176
break;
177+
178+
case 'as':
179+
$extensions['as'] = $this->_parseAsExtension($string);
180+
break;
181+
182+
case 'group':
183+
$extensions['group'] = $this->_parseGroupExtension($string);
184+
break;
174185
}
175186
}
176187
$this->parsedQuery['extensions'] = $extensions;
@@ -329,6 +340,43 @@ private function _parseWithExtension($clause)
329340
return (array)array_map(array(&$this, '_parseValue'), $parsedClause);
330341
}
331342

343+
/**
344+
* Parses a as() extension
345+
* @param string $clause
346+
* @return array
347+
* @throws Exception
348+
*/
349+
private function _parseAsExtension($clause)
350+
{
351+
$parsedClause = explode(',', $clause);
352+
$parsedClause = NULL !== $parsedClause[0] ? $parsedClause : array();
353+
if (count($parsedClause) === 0) {
354+
throw new Exception("JSONDB Query Parse Error: At least one parameter expected for the \"as()\" extension.");
355+
}
356+
357+
return $parsedClause;
358+
}
359+
360+
/**
361+
* Parses a group() extension
362+
* @param string $clause
363+
* @return array
364+
* @throws Exception
365+
*/
366+
private function _parseGroupExtension($clause)
367+
{
368+
$parsedClause = explode(',', $clause);
369+
$parsedClause = NULL !== $parsedClause[0] ? $parsedClause : array();
370+
if (count($parsedClause) === 0) {
371+
throw new Exception("JSONDB Query Parse Error: At least one parameter expected for the \"as()\" extension.");
372+
}
373+
if (count($parsedClause) > 1) {
374+
throw new Exception("JSONDB Query Parse Error: Too much parameters given to the \"group()\" extension, only one required.");
375+
}
376+
377+
return $parsedClause;
378+
}
379+
332380
/**
333381
* Parses a value
334382
*

0 commit comments

Comments
 (0)