2006-06-30 03:04:39 +04:00
|
|
|
<?php
|
2006-09-15 14:48:59 +04:00
|
|
|
Doctrine::autoload("Doctrine_Query_Part");
|
2006-06-30 03:04:39 +04:00
|
|
|
|
2006-12-29 17:40:47 +03:00
|
|
|
abstract class Doctrine_Query_Condition extends Doctrine_Query_Part
|
|
|
|
{
|
2006-06-30 03:04:39 +04:00
|
|
|
/**
|
|
|
|
* DQL CONDITION PARSER
|
|
|
|
* parses the where/having part of the query string
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* @param string $str
|
|
|
|
* @return string
|
|
|
|
*/
|
2006-12-29 17:40:47 +03:00
|
|
|
final public function parse($str)
|
|
|
|
{
|
2006-06-30 03:04:39 +04:00
|
|
|
$tmp = trim($str);
|
|
|
|
|
2006-12-24 01:45:36 +03:00
|
|
|
$parts = Doctrine_Query::bracketExplode($str, array(' \&\& ', ' AND '), '(', ')');
|
|
|
|
|
2006-12-29 17:01:31 +03:00
|
|
|
if (count($parts) > 1) {
|
2006-06-30 03:04:39 +04:00
|
|
|
$ret = array();
|
2006-12-29 17:01:31 +03:00
|
|
|
foreach ($parts as $part) {
|
2006-12-24 01:45:36 +03:00
|
|
|
$part = Doctrine_Query::bracketTrim($part, '(', ')');
|
2006-07-05 02:36:22 +04:00
|
|
|
$ret[] = $this->parse($part);
|
2006-06-30 03:04:39 +04:00
|
|
|
}
|
2006-12-24 01:45:36 +03:00
|
|
|
$r = implode(' AND ',$ret);
|
2006-06-30 03:04:39 +04:00
|
|
|
} else {
|
2006-07-05 02:36:22 +04:00
|
|
|
|
2006-12-24 01:45:36 +03:00
|
|
|
$parts = Doctrine_Query::bracketExplode($str, array(' \|\| ', ' OR '), '(', ')');
|
2006-12-29 17:01:31 +03:00
|
|
|
if (count($parts) > 1) {
|
2006-06-30 03:04:39 +04:00
|
|
|
$ret = array();
|
2006-12-29 17:01:31 +03:00
|
|
|
foreach ($parts as $part) {
|
2006-12-24 01:45:36 +03:00
|
|
|
$part = Doctrine_Query::bracketTrim($part, '(', ')');
|
2006-06-30 03:04:39 +04:00
|
|
|
$ret[] = $this->parse($part);
|
|
|
|
}
|
2006-12-24 01:45:36 +03:00
|
|
|
$r = implode(' OR ',$ret);
|
2006-06-30 03:04:39 +04:00
|
|
|
} else {
|
2006-12-29 17:01:31 +03:00
|
|
|
if (substr($parts[0],0,1) == '(' && substr($parts[0],-1) == ')') {
|
2006-07-05 02:36:22 +04:00
|
|
|
return $this->parse(substr($parts[0],1,-1));
|
2006-12-29 17:01:31 +03:00
|
|
|
} else {
|
2006-07-05 02:36:22 +04:00
|
|
|
return $this->load($parts[0]);
|
2006-12-29 17:01:31 +03:00
|
|
|
}
|
2006-06-30 03:04:39 +04:00
|
|
|
}
|
|
|
|
}
|
2006-07-05 02:36:22 +04:00
|
|
|
|
2006-12-24 01:45:36 +03:00
|
|
|
return '(' . $r . ')';
|
2006-06-30 03:04:39 +04:00
|
|
|
}
|
|
|
|
}
|