. */ Doctrine::autoload('Doctrine_Query_Part'); /** * Doctrine_Query_Condition * * @package Doctrine * @subpackage Query * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link www.phpdoctrine.com * @since 1.0 * @version $Revision$ * @author Konsta Vesterinen */ abstract class Doctrine_Query_Condition extends Doctrine_Query_Part { /** * DQL CONDITION PARSER * parses the join condition/where/having part of the query string * * @param string $str * @return string */ public function parse($str) { $tmp = trim($str); $parts = $this->_tokenizer->bracketExplode($str, array(' \&\& ', ' AND '), '(', ')'); if (count($parts) > 1) { $ret = array(); foreach ($parts as $part) { $part = $this->_tokenizer->bracketTrim($part, '(', ')'); $ret[] = $this->parse($part); } $r = implode(' AND ', $ret); } else { $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 { // Fix for #710 if (substr($parts[0],0,1) == '(' && substr($parts[0], -1) == ')') { return $this->parse(substr($parts[0], 1, -1)); } else { // Processing NOT here if (strtoupper(substr($parts[0], 0, 4)) === 'NOT ') { $r = 'NOT ('.$this->parse(substr($parts[0], 4)).')'; } else { return $this->load($parts[0]); } } } } return '(' . $r . ')'; } /** * parses a literal value and returns the parsed value * * boolean literals are parsed to integers * components are parsed to associated table aliases * * @param string $value literal value to be parsed * @return string */ public function parseLiteralValue($value) { // check that value isn't a string if (strpos($value, '\'') === false) { // parse booleans $value = $this->query->getConnection() ->dataDict->parseBoolean($value); $a = explode('.', $value); if (count($a) > 1) { // either a float or a component.. if ( ! is_numeric($a[0])) { // a component found $field = array_pop($a); $reference = implode('.', $a); $value = $this->query->getTableAlias($reference). '.' . $field; } } } else { // string literal found } return $value; } }