Skip to content

Commit 8dc17b2

Browse files
committed
Remove legacy implementation of the DQL -> SQL transformation
1 parent ee9dd47 commit 8dc17b2

File tree

7 files changed

+10
-102
lines changed

7 files changed

+10
-102
lines changed

UPGRADE.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Upgrade to 4.0
22

3+
## Require implementation of `OutputWalker`, remove `SqlWalker::getExecutor()`
4+
5+
The `SqlWalker::getExecutor()` method is removed. Output walkers should
6+
implement the `\Doctrine\ORM\Query\OutputWalker` interface and create
7+
`Doctrine\ORM\Query\Exec\SqlFinalizer` instances.
8+
39
## Remove `DatabaseDriver`
410

511
The class `Doctrine\ORM\Mapping\Driver\DatabaseDriver` is removed.

psalm-baseline.xml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -896,9 +896,6 @@
896896
<ArgumentTypeCoercion>
897897
<code><![CDATA[$stringPattern]]></code>
898898
</ArgumentTypeCoercion>
899-
<DeprecatedMethod>
900-
<code><![CDATA[setSqlExecutor]]></code>
901-
</DeprecatedMethod>
902899
<InvalidNullableReturnType>
903900
<code><![CDATA[AST\SelectStatement|AST\UpdateStatement|AST\DeleteStatement]]></code>
904901
</InvalidNullableReturnType>

src/Query.php

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,11 @@
77
use Doctrine\DBAL\LockMode;
88
use Doctrine\DBAL\Result;
99
use Doctrine\DBAL\Types\Type;
10-
use Doctrine\Deprecations\Deprecation;
1110
use Doctrine\ORM\Mapping\ClassMetadata;
1211
use Doctrine\ORM\Query\AST\DeleteStatement;
1312
use Doctrine\ORM\Query\AST\SelectStatement;
1413
use Doctrine\ORM\Query\AST\UpdateStatement;
1514
use Doctrine\ORM\Query\Exec\AbstractSqlExecutor;
16-
use Doctrine\ORM\Query\Exec\SqlFinalizer;
17-
use Doctrine\ORM\Query\OutputWalker;
1815
use Doctrine\ORM\Query\Parameter;
1916
use Doctrine\ORM\Query\ParameterTypeInferer;
2017
use Doctrine\ORM\Query\Parser;
@@ -30,7 +27,6 @@
3027
use function count;
3128
use function get_debug_type;
3229
use function in_array;
33-
use function is_a;
3430
use function ksort;
3531
use function md5;
3632
use function reset;
@@ -665,31 +661,10 @@ protected function getQueryCacheId(): string
665661
{
666662
ksort($this->hints);
667663

668-
if (! $this->hasHint(self::HINT_CUSTOM_OUTPUT_WALKER)) {
669-
// Assume Parser will create the SqlOutputWalker; save is_a call, which might trigger a class load
670-
$firstAndMaxResult = '';
671-
} else {
672-
$outputWalkerClass = $this->getHint(self::HINT_CUSTOM_OUTPUT_WALKER);
673-
if (is_a($outputWalkerClass, OutputWalker::class, true)) {
674-
$firstAndMaxResult = '';
675-
} else {
676-
Deprecation::trigger(
677-
'doctrine/orm',
678-
'https://github.com/doctrine/orm/pull/11188/',
679-
'Your output walker class %s should implement %s in order to provide a %s. This also means the output walker should not use the query firstResult/maxResult values, which should be read from the query by the SqlFinalizer only.',
680-
$outputWalkerClass,
681-
OutputWalker::class,
682-
SqlFinalizer::class,
683-
);
684-
$firstAndMaxResult = '&firstResult=' . $this->firstResult . '&maxResult=' . $this->maxResults;
685-
}
686-
}
687-
688664
return md5(
689665
$this->getDQL() . serialize($this->hints) .
690666
'&platform=' . get_debug_type($this->getEntityManager()->getConnection()->getDatabasePlatform()) .
691667
($this->em->hasFilters() ? $this->em->getFilters()->getHash() : '') .
692-
$firstAndMaxResult .
693668
'&hydrationMode=' . $this->hydrationMode . '&types=' . serialize($this->parsedTypes) . 'DOCTRINE_QUERY_CACHE_SALT',
694669
);
695670
}

src/Query/Parser.php

Lines changed: 2 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,13 @@
55
namespace Doctrine\ORM\Query;
66

77
use Doctrine\Common\Lexer\Token;
8-
use Doctrine\Deprecations\Deprecation;
98
use Doctrine\ORM\EntityManagerInterface;
109
use Doctrine\ORM\Exception\DuplicateFieldException;
1110
use Doctrine\ORM\Exception\NoMatchingPropertyException;
1211
use Doctrine\ORM\Mapping\AssociationMapping;
1312
use Doctrine\ORM\Mapping\ClassMetadata;
1413
use Doctrine\ORM\Query;
1514
use Doctrine\ORM\Query\AST\Functions;
16-
use Doctrine\ORM\Query\Exec\SqlFinalizer;
1715
use LogicException;
1816
use ReflectionClass;
1917

@@ -158,7 +156,7 @@ final class Parser
158156
/**
159157
* The custom last tree walker, if any, that is responsible for producing the output.
160158
*
161-
* @var class-string<SqlWalker>|null
159+
* @var class-string<OutputWalker>|null
162160
*/
163161
private $customOutputWalker;
164162

@@ -177,24 +175,6 @@ public function __construct(private readonly Query $query)
177175
$this->parserResult = new ParserResult();
178176
}
179177

180-
/**
181-
* Sets a custom tree walker that produces output.
182-
* This tree walker will be run last over the AST, after any other walkers.
183-
*
184-
* @param class-string<SqlWalker> $className
185-
*/
186-
public function setCustomOutputTreeWalker(string $className): void
187-
{
188-
Deprecation::trigger(
189-
'doctrine/orm',
190-
'https://github.com/doctrine/orm/pull/11641',
191-
'%s is deprecated, set the output walker class with the \Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER query hint instead',
192-
__METHOD__,
193-
);
194-
195-
$this->customOutputWalker = $className;
196-
}
197-
198178
/**
199179
* Adds a custom tree walker for modifying the AST.
200180
*
@@ -359,23 +339,7 @@ public function parse(): ParserResult
359339
$outputWalkerClass = $this->customOutputWalker ?: SqlOutputWalker::class;
360340
$outputWalker = new $outputWalkerClass($this->query, $this->parserResult, $this->queryComponents);
361341

362-
if ($outputWalker instanceof OutputWalker) {
363-
$finalizer = $outputWalker->getFinalizer($AST);
364-
$this->parserResult->setSqlFinalizer($finalizer);
365-
} else {
366-
Deprecation::trigger(
367-
'doctrine/orm',
368-
'https://github.com/doctrine/orm/pull/11188/',
369-
'Your output walker class %s should implement %s in order to provide a %s. This also means the output walker should not use the query firstResult/maxResult values, which should be read from the query by the SqlFinalizer only.',
370-
$outputWalkerClass,
371-
OutputWalker::class,
372-
SqlFinalizer::class,
373-
);
374-
// @phpstan-ignore method.deprecated
375-
$executor = $outputWalker->getExecutor($AST);
376-
// @phpstan-ignore method.deprecated
377-
$this->parserResult->setSqlExecutor($executor);
378-
}
342+
$this->parserResult->setSqlFinalizer($outputWalker->getFinalizer($AST));
379343

380344
return $this->parserResult;
381345
}

src/Query/SqlWalker.php

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -230,22 +230,6 @@ public function setQueryComponent(string $dqlAlias, array $queryComponent): void
230230
$this->queryComponents[$dqlAlias] = $queryComponent;
231231
}
232232

233-
/**
234-
* Gets an executor that can be used to execute the result of this walker.
235-
*
236-
* @deprecated Output walkers should no longer create the executor directly, but instead provide
237-
* a SqlFinalizer by implementing the `OutputWalker` interface. Thus, this method is
238-
* no longer needed and will be removed in 4.0.
239-
*/
240-
public function getExecutor(AST\SelectStatement|AST\UpdateStatement|AST\DeleteStatement $statement): Exec\AbstractSqlExecutor
241-
{
242-
return match (true) {
243-
$statement instanceof AST\UpdateStatement => $this->createUpdateStatementExecutor($statement),
244-
$statement instanceof AST\DeleteStatement => $this->createDeleteStatementExecutor($statement),
245-
default => new Exec\SingleSelectExecutor($statement, $this),
246-
};
247-
}
248-
249233
/** @psalm-internal Doctrine\ORM */
250234
protected function createUpdateStatementExecutor(AST\UpdateStatement $AST): Exec\AbstractSqlExecutor
251235
{

tests/Tests/ORM/Functional/PaginationTest.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use Doctrine\ORM\Query\AST\PathExpression;
1313
use Doctrine\ORM\Query\AST\SelectStatement;
1414
use Doctrine\ORM\Query\AST\WhereClause;
15+
use Doctrine\ORM\Query\SqlOutputWalker;
1516
use Doctrine\ORM\Query\SqlWalker;
1617
use Doctrine\ORM\Query\TreeWalkerAdapter;
1718
use Doctrine\ORM\Tools\Pagination\Paginator;
@@ -643,7 +644,7 @@ public function testCountQueryStripsParametersInSelect(): void
643644
self::assertCount(2, $getCountQuery->invoke($paginator)->getParameters());
644645
self::assertCount(9, $paginator);
645646

646-
$query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, SqlWalker::class);
647+
$query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, SqlOutputWalker::class);
647648

648649
$paginator = new Paginator($query);
649650

tests/Tests/ORM/Functional/ParserResultSerializationTest.php

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -32,25 +32,6 @@ protected function setUp(): void
3232
parent::setUp();
3333
}
3434

35-
/** @param Closure(ParserResult): ParserResult $toSerializedAndBack */
36-
#[DataProvider('provideToSerializedAndBack')]
37-
public function testSerializeParserResultForQueryWithSqlWalker(Closure $toSerializedAndBack): void
38-
{
39-
$query = $this->_em
40-
->createQuery('SELECT u FROM Doctrine\Tests\Models\Company\CompanyEmployee u WHERE u.name = :name');
41-
42-
// Use the (legacy) SqlWalker which directly puts an SqlExecutor instance into the parser result
43-
$query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, Query\SqlWalker::class);
44-
45-
$parserResult = self::parseQuery($query);
46-
$unserialized = $toSerializedAndBack($parserResult);
47-
48-
$this->assertInstanceOf(ParserResult::class, $unserialized);
49-
$this->assertInstanceOf(ResultSetMapping::class, $unserialized->getResultSetMapping());
50-
$this->assertEquals(['name' => [0]], $unserialized->getParameterMappings());
51-
$this->assertNotNull($unserialized->prepareSqlExecutor($query));
52-
}
53-
5435
/** @param Closure(ParserResult): ParserResult $toSerializedAndBack */
5536
#[DataProvider('provideToSerializedAndBack')]
5637
public function testSerializeParserResultForQueryWithSqlOutputWalker(Closure $toSerializedAndBack): void

0 commit comments

Comments
 (0)