protected function _getAggregate($method, ISelectExpression $expression) { if ($this->isEmpty() && !$this->_isLoaded) { $orderBy = $this->_query->getClause('ORDER BY'); //Remove order by for improved query performance if ($orderBy !== null) { $this->_query->removeClause('ORDER BY'); } //Run a sub query if a limit is specified if ($this->_query->hasClause('LIMIT')) { $builder = $this->_getQueryBuilder(); $aggregateQuery = $builder::select($expression)->from(SubQuerySelectExpression::create($this->_query, '_')); $result = Arrays::first(Arrays::first($this->_getDataStore()->getData($aggregateQuery))); } else { $originalClause = $this->_query->getClause('SELECT'); $this->_query->addClause((new SelectClause())->addExpression($expression)); $result = Arrays::first(Arrays::first($this->_getDataStore()->getData($this->_query))); $this->_query->addClause($originalClause); } if ($orderBy !== null) { $this->_query->addClause($orderBy); } return $result; } return parent::$method(); }
public function testClause() { $statement = new QueryStatement(); $this->assertFalse($statement->hasClause('SELECT')); $select = new SelectClause(); $statement->addClause($select); $this->assertSame($select, $statement->getClause('SELECT')); $this->assertTrue($statement->hasClause('SELECT')); $statement->removeClause('SELECT'); $this->assertFalse($statement->hasClause('SELECT')); }