DQL CONDITION PARSER parses the join condition/where/having part of the query string
{
$tmp = trim($str);
$parts = $this->_tokenizer->bracketExplode($str, array(' OR '), '(', ')');
if (count($parts) > 1) {
$ret = array();
foreach ($parts as $part) {
$part = $this->_tokenizer->bracketTrim($part, '(', ')');
$ret[] = $this->
parse($part);
}
$r = implode(' OR ', $ret);
} else {
$parts = $this->_tokenizer->bracketExplode($str, array(' AND '), '(', ')');
$tmp = array();
for ($i = 0, $l = count($parts); $i < $l; $i++) {
$test = $this->_tokenizer->sqlExplode($parts[$i]);
if (count($test) == 3 && strtoupper($test[1]) == 'BETWEEN') {
$tmp[] = $parts[$i] . ' AND ' . $parts[++$i];
} else if (count($test) == 4 && strtoupper($test[1]) == 'NOT' && strtoupper($test[2]) == 'BETWEEN') {
$tmp[] = $parts[$i] . ' AND ' . $parts[++$i];
} else {
$tmp[] = $parts[$i];
}
}
$parts = $tmp;
unset($tmp);
if (count($parts) > 1) {
$ret = array();
foreach ($parts as $part) {
$part = $this->_tokenizer->bracketTrim($part, '(', ')');
$ret[] = $this->
parse($part);
}
$r = implode(' AND ', $ret);
} else {
if (substr($parts[0],0,1) == '(' && substr($parts[0], -1) == ')') {
return $this->
parse(substr($parts[0], 1, -1));
} else {
if (strtoupper(substr($parts[0], 0, 4)) === 'NOT ') {
$r = 'NOT ('.$this->parse(substr($parts[0], 4)).')';
} else {
return $this->load($parts[0]);
}
}
}
}
return '(' . $r . ')';
}