Skip to content

Commit

Permalink
adds better support for string based where statements & complex expre…
Browse files Browse the repository at this point in the history
…ssions
  • Loading branch information
phpboyscout committed Oct 30, 2015
1 parent 3821c13 commit 38c18ed
Showing 1 changed file with 71 additions and 8 deletions.
79 changes: 71 additions & 8 deletions src/Zucchi/Controller/RequestParserTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@ trait RequestParserTrait
* a format usable by the getList() method of the services.
* @return array
*/
protected function parseWhere(array $where = array())
protected function parseWhere($where = false)
{
$clauses = array(
$operators = array(
'is' => 'is',
'eq' => '=',
'gt' => '>',
Expand All @@ -32,20 +32,83 @@ protected function parseWhere(array $where = array())
'regex' => 'regexp',
);

$modes = array(
'or' => 'or',
'and' => 'and',
);

if (is_array($where)) {
if (array_key_exists('expressions', $where)) {
$where = $this->parseComplexWhere($where, $operators, $modes);
} else {
$where = $this->parseSimpleWhere($where, $operators, $modes);
}
} else if (!is_string($where)) {
$where = false;
}

return $where;
}


/**
* @param $where
* @param $operators
* @param $modes
* @return array
*/
protected function parseComplexWhere($where, $operators, $modes)
{
if (array_key_exists('expressions', $where)) {

if (isset($where['mode']) && isset($modes[$where['mode']])) {
$where['mode'] = $modes[$where['mode']];
} else {
$where['mode'] = $modes['and'];
}

foreach ($where['expressions'] as $index => &$expression) {
if (isset($expression['mode']) && isset($modes[$expression['mode']])) {
$expression['mode'] = $modes[$expression['mode']];
} else {
$expression['mode'] = $expression['and'];
}
$expression['fields'] = $this->parseSimpleWhere($expression['fields'], $operators, $modes);
}
}

return $where;
}

/**
* @param $where
* @param $operators
* @param $modes
* @return array
*/
protected function parseSimpleWhere($where, $operators, $modes)
{
// loop through and sanitize the where statement
foreach ($where as $field => &$value) {
if (is_array($value)) {
if (isset($value['value']) && is_string($value['value']) && strlen($value['value'])) {
if (isset($value['operator']) && isset($clauses[$value['operator']])) {
$value['operator'] = $clauses[$value['operator']];
if (isset($value['operator']) && isset($operators[$value['operator']])) {
$value['operator'] = $operators[$value['operator']];
} else {
$value['operator'] = $operators['eq'];
}

if (isset($value['mode']) && isset($modes[$value['mode']])) {
$value['mode'] = $modes[$value['mode']];
} else {
$value['operator'] = '=';
$value['mode'] = $modes['and'];
}
}
} else if (is_string($value) && strlen($value)){
} else if (is_string($value) && strlen($value)) {
$value = array(
'operator' => '=',
'value' => $value
'mode' => $modes['and'],
'operator' => $operators['eq'],
'value' => $value
);
}
}
Expand Down

0 comments on commit 38c18ed

Please sign in to comment.