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 ...@@ -96,6 +96,8 @@ class Doctrine_Query extends Doctrine_Query_Abstract implements Countable
*/ */
protected $_pendingJoinConditions = array(); protected $_pendingJoinConditions = array();
protected $_expressionMap = array();
protected $_state = Doctrine_Query::STATE_CLEAN; protected $_state = Doctrine_Query::STATE_CLEAN;
/** /**
...@@ -115,6 +117,7 @@ class Doctrine_Query extends Doctrine_Query_Abstract implements Countable ...@@ -115,6 +117,7 @@ class Doctrine_Query extends Doctrine_Query_Abstract implements Countable
$this->pendingSubqueries = array(); $this->pendingSubqueries = array();
$this->pendingFields = array(); $this->pendingFields = array();
$this->_neededTables = array(); $this->_neededTables = array();
$this->_expressionMap = array();
$this->subqueryAliases = array(); $this->subqueryAliases = array();
$this->needsSubquery = false; $this->needsSubquery = false;
$this->isLimitSubqueryUsed = false; $this->isLimitSubqueryUsed = false;
...@@ -228,6 +231,9 @@ class Doctrine_Query extends Doctrine_Query_Abstract implements Countable ...@@ -228,6 +231,9 @@ class Doctrine_Query extends Doctrine_Query_Abstract implements Countable
public function getAggregateAlias($dqlAlias) public function getAggregateAlias($dqlAlias)
{ {
if (isset($this->aggregateMap[$dqlAlias])) { if (isset($this->aggregateMap[$dqlAlias])) {
// mark the expression as used
$this->_expressionMap[$dqlAlias][1] = true;
return $this->aggregateMap[$dqlAlias]; return $this->aggregateMap[$dqlAlias];
} }
if ( ! empty($this->pendingAggregates)) { if ( ! empty($this->pendingAggregates)) {
...@@ -577,6 +583,7 @@ class Doctrine_Query extends Doctrine_Query_Abstract implements Countable ...@@ -577,6 +583,7 @@ class Doctrine_Query extends Doctrine_Query_Abstract implements Countable
$this->parts['select'][] = $expression . ' AS ' . $sqlAlias; $this->parts['select'][] = $expression . ' AS ' . $sqlAlias;
$this->aggregateMap[$alias] = $sqlAlias; $this->aggregateMap[$alias] = $sqlAlias;
$this->_expressionMap[$alias][0] = $expression;
$this->_aliasMap[$componentAlias]['agg'][$index] = $alias; $this->_aliasMap[$componentAlias]['agg'][$index] = $alias;
...@@ -852,7 +859,7 @@ class Doctrine_Query extends Doctrine_Query_Abstract implements Countable ...@@ -852,7 +859,7 @@ class Doctrine_Query extends Doctrine_Query_Abstract implements Countable
/**
foreach ($this->parts['orderby'] as $part) { foreach ($this->parts['orderby'] as $part) {
$part = trim($part); $part = trim($part);
$e = Doctrine_Tokenizer::bracketExplode($part, ' '); $e = Doctrine_Tokenizer::bracketExplode($part, ' ');
...@@ -884,6 +891,14 @@ class Doctrine_Query extends Doctrine_Query_Abstract implements Countable ...@@ -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'; $subquery .= ' FROM';
...@@ -928,7 +943,7 @@ class Doctrine_Query extends Doctrine_Query_Abstract implements Countable ...@@ -928,7 +943,7 @@ class Doctrine_Query extends Doctrine_Query_Abstract implements Countable
if (strpos($part, '.') !== false) { if (strpos($part, '.') !== false) {
$separator = '.'; $separator = '.';
} }
if ($driverName == 'mysql' || $driverName == 'pgsql') { if ($driverName == 'mysql' || $driverName == 'pgsql') {
if (strpos($part, '__') !== false) { if (strpos($part, '__') !== false) {
$separator = '__'; $separator = '__';
......
...@@ -69,7 +69,7 @@ class Doctrine_Query_Having extends Doctrine_Query_Condition ...@@ -69,7 +69,7 @@ class Doctrine_Query_Having extends Doctrine_Query_Condition
$func = $this->query->getTableAlias($reference) . '.' . $field; $func = $this->query->getTableAlias($reference) . '.' . $field;
} else { } else {
$field = end($a); $field = end($a);
$func = $this->query->getAggregateAlias($field); $func = $this->query->getAggregateAlias($field);
} }
return $func; return $func;
} else { } else {
......
...@@ -83,4 +83,35 @@ class Doctrine_Query_MysqlSubquery_TestCase extends Doctrine_UnitTestCase ...@@ -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'); $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