Skip to content

Commit

Permalink
Adding ORDER support for UNION queries
Browse files Browse the repository at this point in the history
  • Loading branch information
mhtghn authored and homersimpsons committed May 24, 2023
1 parent 77be5c8 commit 7b53545
Showing 1 changed file with 25 additions and 4 deletions.
29 changes: 25 additions & 4 deletions src/QueryFactory/FindObjectsFromRawSqlQueryFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@

use Doctrine\DBAL\Platforms\MySqlPlatform;
use Doctrine\DBAL\Schema\Schema;
use PHPSQLParser\builders\OrderByBuilder;
use PHPSQLParser\builders\SelectStatementBuilder;
use TheCodingMachine\TDBM\TDBMException;
use TheCodingMachine\TDBM\TDBMService;
use PHPSQLParser\PHPSQLCreator;
Expand Down Expand Up @@ -106,7 +108,7 @@ private function compute(string $sql, ?string $sqlCount): array
* @param mixed[] $parsedSql
* @param null|string $sqlCount
* @return mixed[] An array of 3 elements: [$processedSql, $processedSqlCount, $columnDescriptors]
* @throws \PHPSQLParser\exceptions\UnsupportedFeatureException
* @throws \PHPSQLParser\exceptions\UnsupportedFeatureException|\PHPSQLParser\exceptions\UnableToCreateSQLException
*/
private function processParsedUnionQuery(array $parsedSql, ?string $sqlCount): array
{
Expand All @@ -120,9 +122,9 @@ private function processParsedUnionQuery(array $parsedSql, ?string $sqlCount): a

// Let's reparse the returned SQL (not the most efficient way of doing things)
$parser = new PHPSQLParser();
$parsedSql = $parser->parse($selectProcessedSql);
$parsedSelectSql = $parser->parse($selectProcessedSql);

$parsedSqlList[] = $parsedSql;
$parsedSqlList[] = $parsedSelectSql;
}

// Let's rebuild the UNION query
Expand All @@ -133,12 +135,31 @@ private function processParsedUnionQuery(array $parsedSql, ?string $sqlCount): a

$generator = new PHPSQLCreator();

$processedSql = $generator->create($query);
// Replaced the default generator by our own to add parenthesis around each SELECT
$processedSql = $this->buildUnion($query);
$processedSqlCount = $generator->create($countQuery);

// Let's add the ORDER BY if any
if (isset($parsedSql['0']['ORDER'])) {
$orderByBuilder = new OrderByBuilder();
$processedSql .= " " . $orderByBuilder->build($parsedSql['0']['ORDER']);
}

return [$processedSql, $sqlCount ?? $processedSqlCount, $columnDescriptors];
}

/**
* @param mixed[] $parsed
*/
private function buildUnion(array $parsed): string
{
$selectBuilder = new SelectStatementBuilder();

return implode(' UNION ', array_map(function ($clause) use ($selectBuilder) {
return '(' . $selectBuilder->build($clause) . ')';
}, $parsed['UNION']));
}

/**
* @param mixed[] $parsedSql
* @param null|string $sqlCount
Expand Down

0 comments on commit 7b53545

Please sign in to comment.