diff --git a/src/SelectExpression/SubQuerySelectExpression.php b/src/SelectExpression/SubQuerySelectExpression.php index 1afd488..594c7db 100644 --- a/src/SelectExpression/SubQuerySelectExpression.php +++ b/src/SelectExpression/SubQuerySelectExpression.php @@ -1,7 +1,7 @@ _alias = $alias; if($this->_alias === null) { - $this->_alias = substr(md5(QueryAssembler::stringify($query)), 0, 6); + $this->_alias = 't' . Strings::randomString(5); } $this->_query = $query; return $this; @@ -32,7 +32,7 @@ public function setQuery(QueryStatement $query, $alias = null) public static function create(QueryStatement $query, $alias = null) { - $expression = new static; + $expression = new static(); $expression->setQuery($query, $alias); return $expression; } diff --git a/tests/Assembler/MySQL/MySQLAssemblerTest.php b/tests/Assembler/MySQL/MySQLAssemblerTest.php index 9eeeae6..c922275 100644 --- a/tests/Assembler/MySQL/MySQLAssemblerTest.php +++ b/tests/Assembler/MySQL/MySQLAssemblerTest.php @@ -2,9 +2,15 @@ namespace Packaged\Tests\QueryBuilder\Assembler\MySQL; use Packaged\QueryBuilder\Assembler\MySQL\MySQLAssembler; +use Packaged\QueryBuilder\Builder\QueryBuilder; use Packaged\QueryBuilder\Expression\FieldExpression; +use Packaged\QueryBuilder\Expression\StringExpression; use Packaged\QueryBuilder\Expression\TableExpression; +use Packaged\QueryBuilder\Predicate\GreaterThanPredicate; use Packaged\QueryBuilder\SelectExpression\FieldSelectExpression; +use Packaged\QueryBuilder\SelectExpression\MatchSelectExpression; +use Packaged\QueryBuilder\SelectExpression\MaxSelectExpression; +use Packaged\QueryBuilder\SelectExpression\SubQuerySelectExpression; class MySQLAssemblerTest extends \PHPUnit_Framework_TestCase { @@ -43,4 +49,29 @@ public function testSelectField() ) ); } + + public function testSubQuery() + { + $subQuery = QueryBuilder::select( + FieldSelectExpression::create('articleFid'), + MatchSelectExpression::create(FieldExpression::create('term'), StringExpression::create('search')) + ->setAlias('score') + ) + ->from('search_terms') + ->having(GreaterThanPredicate::create('score', 0)); + + $subQueryText = 'SELECT `articleFid`, MATCH (`term`) AGAINST ("search") AS `score` FROM `search_terms` HAVING `score` > 0'; + $this->assertEquals($subQueryText, MySQLAssembler::stringify($subQuery)); + + $query = QueryBuilder::select( + FieldSelectExpression::create('articleFid'), + MaxSelectExpression::createWithAlias('score', 'score') + ) + ->from(SubQuerySelectExpression::create($subQuery, 'x')) + ->groupBy('articleFid')->orderBy(['score' => 'DESC']); + $this->assertEquals( + 'SELECT `articleFid`, MAX(`score`) AS `score` FROM (' . $subQueryText . ') AS `x` GROUP BY `articleFid` ORDER BY `score` DESC', + MySQLAssembler::stringify($query) + ); + } } diff --git a/tests/SelectExpression/SubQuerySelectExpressionTest.php b/tests/SelectExpression/SubQuerySelectExpressionTest.php index 02f37d5..20959dc 100644 --- a/tests/SelectExpression/SubQuerySelectExpressionTest.php +++ b/tests/SelectExpression/SubQuerySelectExpressionTest.php @@ -34,37 +34,23 @@ public function testAssemble() $selector = new SubQuerySelectExpression(); $selector->setQuery($statement); $this->assertEquals( - '(SELECT * FROM tbl) AS ' . substr( - md5(QueryAssembler::stringify($statement)), - 0, - 6 - ), + '(SELECT * FROM tbl) AS ' . $selector->getAlias(), QueryAssembler::stringify($selector) ); $selector = SubQuerySelectExpression::create($statement)->setAlias(null); - $this->assertEquals( - '(SELECT * FROM tbl)', - QueryAssembler::stringify($selector) - ); + $this->assertEquals('(SELECT * FROM tbl)', QueryAssembler::stringify($selector)); } public function testStatic() { $statement = $this->_basicQuery(); + $subQuery = SubQuerySelectExpression::create($statement, 'query'); + $this->assertEquals('(SELECT * FROM tbl) AS query', QueryAssembler::stringify($subQuery)); + $this->assertEquals( - '(SELECT * FROM tbl) AS query', - QueryAssembler::stringify( - SubQuerySelectExpression::create($statement, 'query') - ) - ); - $this->assertEquals( - '(SELECT * FROM tbl) AS ' . substr( - md5(QueryAssembler::stringify($statement)), - 0, - 6 - ), - QueryAssembler::stringify(SubQuerySelectExpression::create($statement)) + '(SELECT * FROM tbl) AS ' . $subQuery->getAlias(), + QueryAssembler::stringify(SubQuerySelectExpression::create($statement)->setAlias('query')) ); } }