2006-06-30 03:04:39 +04:00
|
|
|
<?php
|
|
|
|
require_once("Condition.php");
|
|
|
|
|
|
|
|
class Doctrine_Query_Having extends Doctrine_Query_Condition {
|
|
|
|
/**
|
|
|
|
* DQL Aggregate Function parser
|
|
|
|
*
|
|
|
|
* @param string $func
|
|
|
|
* @return mixed
|
|
|
|
*/
|
|
|
|
private function parseAggregateFunction($func) {
|
|
|
|
$pos = strpos($func,"(");
|
|
|
|
|
|
|
|
if($pos !== false) {
|
|
|
|
|
|
|
|
$funcs = array();
|
|
|
|
|
|
|
|
$name = substr($func, 0, $pos);
|
|
|
|
$func = substr($func, ($pos + 1), -1);
|
|
|
|
$params = Doctrine_Query::bracketExplode($func, ",", "(", ")");
|
|
|
|
|
|
|
|
foreach($params as $k => $param) {
|
|
|
|
$params[$k] = $this->parseAggregateFunction($param);
|
|
|
|
}
|
|
|
|
|
|
|
|
$funcs = $name."(".implode(", ", $params).")";
|
|
|
|
|
|
|
|
return $funcs;
|
|
|
|
|
|
|
|
} else {
|
|
|
|
if( ! is_numeric($func)) {
|
|
|
|
$a = explode(".",$func);
|
|
|
|
$field = array_pop($a);
|
|
|
|
$reference = implode(".",$a);
|
|
|
|
$table = $this->query->load($reference, false);
|
|
|
|
$func = $this->query->getTableAlias($reference).".".$field;
|
|
|
|
|
|
|
|
return $func;
|
|
|
|
} else {
|
|
|
|
return $func;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
* load
|
|
|
|
* returns the parsed query part
|
|
|
|
*
|
|
|
|
* @param string $having
|
|
|
|
* @return string
|
|
|
|
*/
|
|
|
|
final public function load($having) {
|
|
|
|
$e = Doctrine_Query::bracketExplode($having," ","(",")");
|
|
|
|
|
|
|
|
$r = array_shift($e);
|
|
|
|
$t = explode("(",$r);
|
|
|
|
|
|
|
|
$count = count($t);
|
|
|
|
$r = $this->parseAggregateFunction($r);
|
|
|
|
$operator = array_shift($e);
|
|
|
|
$value = implode(" ",$e);
|
|
|
|
$r .= " ".$operator." ".$value;
|
|
|
|
|
|
|
|
return $r;
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
* __toString
|
|
|
|
*
|
|
|
|
* @return string
|
|
|
|
*/
|
|
|
|
public function __toString() {
|
|
|
|
return ( ! empty($this->parts))?implode(" AND ", $this->parts):'';
|
|
|
|
}
|
|
|
|
}
|
2006-09-04 02:46:30 +04:00
|
|
|
|