Commit 2a2cb285 authored by zYne's avatar zYne

--no commit message

--no commit message
parent 8ae8fa7c
......@@ -96,6 +96,8 @@ class Doctrine_Query extends Doctrine_Query_Abstract implements Countable
*/
protected $_pendingJoinConditions = array();
protected $_expressionMap = array();
protected $_state = Doctrine_Query::STATE_CLEAN;
/**
......@@ -115,6 +117,7 @@ class Doctrine_Query extends Doctrine_Query_Abstract implements Countable
$this->pendingSubqueries = array();
$this->pendingFields = array();
$this->_neededTables = array();
$this->_expressionMap = array();
$this->subqueryAliases = array();
$this->needsSubquery = false;
$this->isLimitSubqueryUsed = false;
......@@ -228,6 +231,9 @@ class Doctrine_Query extends Doctrine_Query_Abstract implements Countable
public function getAggregateAlias($dqlAlias)
{
if (isset($this->aggregateMap[$dqlAlias])) {
// mark the expression as used
$this->_expressionMap[$dqlAlias][1] = true;
return $this->aggregateMap[$dqlAlias];
}
if ( ! empty($this->pendingAggregates)) {
......@@ -577,6 +583,7 @@ class Doctrine_Query extends Doctrine_Query_Abstract implements Countable
$this->parts['select'][] = $expression . ' AS ' . $sqlAlias;
$this->aggregateMap[$alias] = $sqlAlias;
$this->_expressionMap[$alias][0] = $expression;
$this->_aliasMap[$componentAlias]['agg'][$index] = $alias;
......@@ -852,7 +859,7 @@ class Doctrine_Query extends Doctrine_Query_Abstract implements Countable
/**
foreach ($this->parts['orderby'] as $part) {
$part = trim($part);
$e = Doctrine_Tokenizer::bracketExplode($part, ' ');
......@@ -884,6 +891,14 @@ class Doctrine_Query extends Doctrine_Query_Abstract implements Countable
}
}
}
*/
if ($driverName == 'mysql' || $driverName == 'pgsql') {
foreach ($this->_expressionMap as $dqlAlias => $expr) {
if (isset($expr[1])) {
$subquery .= ', ' . $expr[0] . ' AS ' . $this->aggregateMap[$dqlAlias];
}
}
}
$subquery .= ' FROM';
......@@ -928,7 +943,7 @@ class Doctrine_Query extends Doctrine_Query_Abstract implements Countable
if (strpos($part, '.') !== false) {
$separator = '.';
}
if ($driverName == 'mysql' || $driverName == 'pgsql') {
if (strpos($part, '__') !== false) {
$separator = '__';
......
......@@ -69,7 +69,7 @@ class Doctrine_Query_Having extends Doctrine_Query_Condition
$func = $this->query->getTableAlias($reference) . '.' . $field;
} else {
$field = end($a);
$func = $this->query->getAggregateAlias($field);
$func = $this->query->getAggregateAlias($field);
}
return $func;
} else {
......
......@@ -83,4 +83,35 @@ class Doctrine_Query_MysqlSubquery_TestCase extends Doctrine_UnitTestCase
$this->assertEqual($this->dbh->pop(), 'SELECT DISTINCT e2.id, COUNT(DISTINCT a2.id) AS a2__0 FROM entity e2 LEFT JOIN album a2 ON e2.id = a2.user_id WHERE (e2.type = 0) GROUP BY e2.id ORDER BY a2__0, e2.name LIMIT 5');
}
public function testGetLimitSubquerySupportsOrderByAndHavingWithAggregateValues()
{
$q = new Doctrine_Query();
$q->select('u.name, COUNT(DISTINCT a.id) num_albums');
$q->from('User u, u.Album a');
$q->orderby('num_albums DESC');
$q->having('num_albums > 0');
$q->groupby('u.id');
$q->limit(5);
$q->execute();
$this->dbh->pop();
$this->assertEqual($this->dbh->pop(), 'SELECT DISTINCT e2.id, COUNT(DISTINCT a2.id) AS a2__0 FROM entity e2 LEFT JOIN album a2 ON e2.id = a2.user_id WHERE (e2.type = 0) GROUP BY e2.id HAVING a2__0 > 0 ORDER BY a2__0 DESC LIMIT 5');
}
public function testGetLimitSubquerySupportsHavingWithAggregateValues()
{
$q = new Doctrine_Query();
$q->select('u.name, COUNT(DISTINCT a.id) num_albums');
$q->from('User u, u.Album a');
$q->having('num_albums > 0');
$q->groupby('u.id');
$q->limit(5);
$q->execute();
$this->dbh->pop();
$this->assertEqual($this->dbh->pop(), 'SELECT DISTINCT e2.id, COUNT(DISTINCT a2.id) AS a2__0 FROM entity e2 LEFT JOIN album a2 ON e2.id = a2.user_id WHERE (e2.type = 0) GROUP BY e2.id HAVING a2__0 > 0 LIMIT 5');
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment