. */ Doctrine::autoload('Doctrine_Query_Part'); /** * Doctrine_Query_Condition * * @package Doctrine * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @category Object Relational Mapping * @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 */ final public function parse($str) { $tmp = trim($str); $parts = Doctrine_Query::bracketExplode($str, array(' \&\& ', ' AND '), '(', ')'); if (count($parts) > 1) { $ret = array(); foreach ($parts as $part) { $part = Doctrine_Query::bracketTrim($part, '(', ')'); $ret[] = $this->parse($part); } $r = implode(' AND ',$ret); } else { $parts = Doctrine_Query::bracketExplode($str, array(' \|\| ', ' OR '), '(', ')'); if (count($parts) > 1) { $ret = array(); foreach ($parts as $part) { $part = Doctrine_Query::bracketTrim($part, '(', ')'); $ret[] = $this->parse($part); } $r = implode(' OR ', $ret); } else { if (substr($parts[0],0,1) == '(' && substr($parts[0],-1) == ')') { return $this->parse(substr($parts[0],1,-1)); } 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 if ($value == 'true') $value = 1; elseif ($value == 'false') $value = 0; $a = explode('.', $value); if (count($a) > 1) { // either a float or a component.. if ( ! is_numeric($a[0])) { // a component found $value = $this->query->getTableAlias($a[0]). '.' . $a[1]; } } } else { // string literal found } return $value; } }