Skip to content

Commit aec4f6c

Browse files
committed
Bump ORM requirements, fix translation walker handling of paginated queries
1 parent 910c4ba commit aec4f6c

File tree

11 files changed

+50
-175
lines changed

11 files changed

+50
-175
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@ a release.
1818
---
1919

2020
## [Unreleased]
21+
### Changed
22+
- Updated minimum versions for `doctrine/orm` to ^2.20 || ^3.3
23+
24+
### Fixed
25+
- Regression with `doctrine/orm` ^2.20 || ^3.3 that caused the translation walker to produce queries with duplicated LIMIT clauses (issue #2917)
2126

2227
## [3.18.0] - 2025-02-01
2328
### Added

composer.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@
5757
"doctrine/dbal": "^3.7 || ^4.0",
5858
"doctrine/doctrine-bundle": "^2.3",
5959
"doctrine/mongodb-odm": "^2.3",
60-
"doctrine/orm": "^2.14.0 || ^3.0",
60+
"doctrine/orm": "^2.20 || ^3.3",
6161
"friendsofphp/php-cs-fixer": "^3.14.0",
6262
"nesbot/carbon": "^2.71 || ^3.0",
6363
"phpstan/phpstan": "^2.1.1",
@@ -76,7 +76,7 @@
7676
"doctrine/common": "<2.13 || >=4.0",
7777
"doctrine/dbal": "<3.7 || >=5.0",
7878
"doctrine/mongodb-odm": "<2.3 || >=3.0",
79-
"doctrine/orm": "<2.14.0 || 2.16.0 || 2.16.1 || >=4.0"
79+
"doctrine/orm": "<2.20 || >=3.0,<3.3 || >=4.0"
8080
},
8181
"suggest": {
8282
"doctrine/mongodb-odm": "to use the extensions with the MongoDB ODM",

phpstan-baseline.neon

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -540,12 +540,6 @@ parameters:
540540
count: 1
541541
path: src/Timestampable/Mapping/Driver/Yaml.php
542542

543-
-
544-
message: '#^Call to an undefined static method Doctrine\\ORM\\Query\\SqlWalker\:\:getFinalizer\(\)\.$#'
545-
identifier: staticMethod.notFound
546-
count: 2
547-
path: src/Tool/ORM/Walker/CompatSqlOutputWalker.php
548-
549543
-
550544
message: '#^Access to an undefined property ProxyManager\\Proxy\\GhostObjectInterface&TObject of object\:\:\$identifier\.$#'
551545
identifier: property.notFound

src/SoftDeleteable/Query/TreeWalker/SoftDeleteableWalker.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@
2121
use Doctrine\ORM\Query\Exec\PreparedExecutorFinalizer;
2222
use Doctrine\ORM\Query\Exec\SingleTableDeleteUpdateExecutor;
2323
use Doctrine\ORM\Query\Exec\SqlFinalizer;
24+
use Doctrine\ORM\Query\SqlOutputWalker;
2425
use Gedmo\Exception\RuntimeException;
2526
use Gedmo\Exception\UnexpectedValueException;
2627
use Gedmo\SoftDeleteable\Query\TreeWalker\Exec\MultiTableDeleteExecutor;
2728
use Gedmo\SoftDeleteable\SoftDeleteableListener;
28-
use Gedmo\Tool\ORM\Walker\CompatSqlOutputWalker;
2929
use Gedmo\Tool\ORM\Walker\SqlWalkerCompat;
3030

3131
/**
@@ -38,7 +38,7 @@
3838
*
3939
* @final since gedmo/doctrine-extensions 3.11
4040
*/
41-
class SoftDeleteableWalker extends CompatSqlOutputWalker
41+
class SoftDeleteableWalker extends SqlOutputWalker
4242
{
4343
use SqlWalkerCompat;
4444

src/Tool/ORM/Walker/CompatSqlOutputWalker.php

Lines changed: 0 additions & 59 deletions
This file was deleted.

src/Tool/ORM/Walker/CompatSqlOutputWalkerForOrm2.php

Lines changed: 0 additions & 42 deletions
This file was deleted.

src/Tool/ORM/Walker/CompatSqlOutputWalkerForOrm3.php

Lines changed: 0 additions & 39 deletions
This file was deleted.

src/Tool/ORM/Walker/SqlWalkerCompatForOrm2.php

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99

1010
namespace Gedmo\Tool\ORM\Walker;
1111

12-
use Doctrine\ORM\Query\AST;
1312
use Doctrine\ORM\Query\AST\DeleteClause;
13+
use Doctrine\ORM\Query\AST\DeleteStatement;
1414
use Doctrine\ORM\Query\AST\FromClause;
1515
use Doctrine\ORM\Query\AST\GroupByClause;
1616
use Doctrine\ORM\Query\AST\HavingClause;
@@ -19,8 +19,10 @@
1919
use Doctrine\ORM\Query\AST\SelectStatement;
2020
use Doctrine\ORM\Query\AST\SimpleSelectClause;
2121
use Doctrine\ORM\Query\AST\SubselectFromClause;
22+
use Doctrine\ORM\Query\AST\UpdateStatement;
2223
use Doctrine\ORM\Query\AST\WhereClause;
2324
use Doctrine\ORM\Query\Exec\AbstractSqlExecutor;
25+
use Doctrine\ORM\Query\Exec\SqlFinalizer;
2426
use Doctrine\ORM\Query\SqlWalker;
2527

2628
/**
@@ -35,7 +37,7 @@ trait SqlWalkerCompatForOrm2
3537
/**
3638
* Gets an executor that can be used to execute the result of this walker.
3739
*
38-
* @param SelectStatement|AST\UpdateStatement|AST\DeleteStatement $statement
40+
* @param SelectStatement|UpdateStatement|DeleteStatement $statement
3941
*
4042
* @return AbstractSqlExecutor
4143
*/
@@ -45,15 +47,11 @@ public function getExecutor($statement)
4547
}
4648

4749
/**
48-
* Walks down a SelectStatement AST node, thereby generating the appropriate SQL.
49-
*
50-
* @param SelectStatement $selectStatement
51-
*
52-
* @return string
50+
* @param DeleteStatement|UpdateStatement|SelectStatement $AST
5351
*/
54-
public function walkSelectStatement($selectStatement)
52+
public function getFinalizer($AST): SqlFinalizer
5553
{
56-
return $this->doWalkSelectStatementWithCompat($selectStatement);
54+
return $this->doGetFinalizerWithCompat($AST);
5755
}
5856

5957
/**
@@ -169,16 +167,19 @@ public function walkWhereClause($whereClause)
169167
/**
170168
* Gets an executor that can be used to execute the result of this walker.
171169
*
172-
* @param SelectStatement|AST\UpdateStatement|AST\DeleteStatement $statement
170+
* @param SelectStatement|UpdateStatement|DeleteStatement $statement
173171
*/
174172
protected function doGetExecutorWithCompat($statement): AbstractSqlExecutor
175173
{
176174
return parent::getExecutor($statement);
177175
}
178176

179-
protected function doWalkSelectStatementWithCompat(SelectStatement $selectStatement): string
177+
/**
178+
* @param DeleteStatement|UpdateStatement|SelectStatement $AST
179+
*/
180+
protected function doGetFinalizerWithCompat($AST): SqlFinalizer
180181
{
181-
return parent::walkSelectStatement($selectStatement);
182+
return parent::getFinalizer($AST);
182183
}
183184

184185
protected function doWalkSelectClauseWithCompat(SelectClause $selectClause): string

src/Tool/ORM/Walker/SqlWalkerCompatForOrm3.php

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99

1010
namespace Gedmo\Tool\ORM\Walker;
1111

12-
use Doctrine\ORM\Query\AST;
1312
use Doctrine\ORM\Query\AST\DeleteClause;
1413
use Doctrine\ORM\Query\AST\DeleteStatement;
1514
use Doctrine\ORM\Query\AST\FromClause;
@@ -23,6 +22,7 @@
2322
use Doctrine\ORM\Query\AST\UpdateStatement;
2423
use Doctrine\ORM\Query\AST\WhereClause;
2524
use Doctrine\ORM\Query\Exec\AbstractSqlExecutor;
25+
use Doctrine\ORM\Query\Exec\SqlFinalizer;
2626
use Doctrine\ORM\Query\SqlWalker;
2727

2828
/**
@@ -42,12 +42,9 @@ public function getExecutor(SelectStatement|UpdateStatement|DeleteStatement $sta
4242
return $this->doGetExecutorWithCompat($statement);
4343
}
4444

45-
/**
46-
* Walks down a SelectStatement AST node, thereby generating the appropriate SQL.
47-
*/
48-
public function walkSelectStatement(SelectStatement $selectStatement): string
45+
public function getFinalizer(DeleteStatement|UpdateStatement|SelectStatement $AST): SqlFinalizer
4946
{
50-
return $this->doWalkSelectStatementWithCompat($selectStatement);
47+
return $this->doGetFinalizerWithCompat($AST);
5148
}
5249

5350
/**
@@ -134,9 +131,12 @@ protected function doGetExecutorWithCompat($statement): AbstractSqlExecutor
134131
return parent::getExecutor($statement);
135132
}
136133

137-
protected function doWalkSelectStatementWithCompat(SelectStatement $selectStatement): string
134+
/**
135+
* @param DeleteStatement|UpdateStatement|SelectStatement $AST
136+
*/
137+
protected function doGetFinalizerWithCompat($AST): SqlFinalizer
138138
{
139-
return parent::walkSelectStatement($selectStatement);
139+
return parent::getFinalizer($AST);
140140
}
141141

142142
protected function doWalkSelectClauseWithCompat(SelectClause $selectClause): string

src/Translatable/Query/TreeWalker/TranslationWalker.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@
3434
use Doctrine\ORM\Query\Exec\SingleSelectExecutor;
3535
use Doctrine\ORM\Query\Exec\SingleSelectSqlFinalizer;
3636
use Doctrine\ORM\Query\Exec\SqlFinalizer;
37+
use Doctrine\ORM\Query\SqlOutputWalker;
3738
use Gedmo\Exception\RuntimeException;
38-
use Gedmo\Tool\ORM\Walker\CompatSqlOutputWalker;
3939
use Gedmo\Tool\ORM\Walker\SqlWalkerCompat;
4040
use Gedmo\Translatable\Hydrator\ORM\ObjectHydrator;
4141
use Gedmo\Translatable\Hydrator\ORM\SimpleObjectHydrator;
@@ -56,7 +56,7 @@
5656
*
5757
* @final since gedmo/doctrine-extensions 3.11
5858
*/
59-
class TranslationWalker extends CompatSqlOutputWalker
59+
class TranslationWalker extends SqlOutputWalker
6060
{
6161
use SqlWalkerCompat;
6262

@@ -155,12 +155,12 @@ protected function doGetFinalizerWithCompat($AST): SqlFinalizer
155155
}
156156
$this->prepareTranslatedComponents();
157157

158-
return new SingleSelectSqlFinalizer($this->walkSelectStatement($AST));
158+
return new SingleSelectSqlFinalizer($this->createSqlForFinalizer($AST));
159159
}
160160

161-
protected function doWalkSelectStatementWithCompat(SelectStatement $selectStatement): string
161+
protected function createSqlForFinalizer(SelectStatement $selectStatement): string
162162
{
163-
$result = parent::walkSelectStatement($selectStatement);
163+
$result = parent::createSqlForFinalizer($selectStatement);
164164
if ([] === $this->translatedComponents) {
165165
return $result;
166166
}

tests/Gedmo/Translatable/TranslationQueryWalkerTest.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,21 @@ public function testJoinedWithStatements(): void
125125
static::assertSame('good', $comments[0]['subject']);
126126
}
127127

128+
/**
129+
* @doesNotPerformAssertions
130+
*/
131+
public function testPaginatedQuery(): void
132+
{
133+
$this->populateMore();
134+
135+
$dql = 'SELECT a FROM '.Article::class.' a';
136+
$q = $this->em->createQuery($dql);
137+
$q->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, TranslationWalker::class);
138+
$q->setFirstResult(0);
139+
$q->setMaxResults(1);
140+
$q->getResult(Query::HYDRATE_SIMPLEOBJECT);
141+
}
142+
128143
public function testShouldSelectWithTranslationFallbackOnSimpleObjectHydration(): void
129144
{
130145
$this->em->getConfiguration()->addCustomHydrationMode(

0 commit comments

Comments
 (0)