From 38c18ed5060b14d5554d8ed7a3931e048af46672 Mon Sep 17 00:00:00 2001 From: Matt Cockayne Date: Fri, 30 Oct 2015 15:13:10 +0000 Subject: [PATCH] adds better support for string based where statements & complex expressions --- src/Zucchi/Controller/RequestParserTrait.php | 79 ++++++++++++++++++-- 1 file changed, 71 insertions(+), 8 deletions(-) diff --git a/src/Zucchi/Controller/RequestParserTrait.php b/src/Zucchi/Controller/RequestParserTrait.php index 7b17a40..e0350de 100755 --- a/src/Zucchi/Controller/RequestParserTrait.php +++ b/src/Zucchi/Controller/RequestParserTrait.php @@ -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' => '>', @@ -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 ); } }