Skip to content

Commit

Permalink
SubQuery Improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
bajb committed Jul 17, 2018
1 parent aff3e68 commit a23e4cc
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 24 deletions.
6 changes: 3 additions & 3 deletions src/SelectExpression/SubQuerySelectExpression.php
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?php
namespace Packaged\QueryBuilder\SelectExpression;

use Packaged\QueryBuilder\Assembler\QueryAssembler;
use Packaged\Helpers\Strings;
use Packaged\QueryBuilder\SelectExpression\Traits\AliasTrait;
use Packaged\QueryBuilder\Statement\QueryStatement;

Expand All @@ -24,15 +24,15 @@ public function setQuery(QueryStatement $query, $alias = null)
$this->_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;
}

public static function create(QueryStatement $query, $alias = null)
{
$expression = new static;
$expression = new static();
$expression->setQuery($query, $alias);
return $expression;
}
Expand Down
31 changes: 31 additions & 0 deletions tests/Assembler/MySQL/MySQLAssemblerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand Down Expand Up @@ -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)
);
}
}
28 changes: 7 additions & 21 deletions tests/SelectExpression/SubQuerySelectExpressionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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'))
);
}
}

0 comments on commit a23e4cc

Please sign in to comment.