Skip to content

Commit 16ab390

Browse files
authored
Add support for new SqlOutputWalker class in the ORM
1 parent 950d7c0 commit 16ab390

File tree

6 files changed

+199
-13
lines changed

6 files changed

+199
-13
lines changed

phpstan-baseline.neon

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,11 @@ parameters:
440440
count: 1
441441
path: src/Timestampable/Mapping/Driver/Yaml.php
442442

443+
-
444+
message: "#^Call to an undefined static method Doctrine\\\\ORM\\\\Query\\\\SqlWalker\\:\\:getFinalizer\\(\\)\\.$#"
445+
count: 2
446+
path: src/Tool/ORM/Walker/CompatSqlOutputWalker.php
447+
443448
-
444449
message: "#^Call to an undefined method Doctrine\\\\Persistence\\\\ObjectManager\\:\\:getUnitOfWork\\(\\)\\.$#"
445450
count: 1

src/SoftDeleteable/Query/TreeWalker/SoftDeleteableWalker.php

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,14 @@
1818
use Doctrine\ORM\Query\AST\SelectStatement;
1919
use Doctrine\ORM\Query\AST\UpdateStatement;
2020
use Doctrine\ORM\Query\Exec\AbstractSqlExecutor;
21+
use Doctrine\ORM\Query\Exec\PreparedExecutorFinalizer;
2122
use Doctrine\ORM\Query\Exec\SingleTableDeleteUpdateExecutor;
22-
use Doctrine\ORM\Query\SqlWalker;
23+
use Doctrine\ORM\Query\Exec\SqlFinalizer;
2324
use Gedmo\Exception\RuntimeException;
2425
use Gedmo\Exception\UnexpectedValueException;
2526
use Gedmo\SoftDeleteable\Query\TreeWalker\Exec\MultiTableDeleteExecutor;
2627
use Gedmo\SoftDeleteable\SoftDeleteableListener;
28+
use Gedmo\Tool\ORM\Walker\CompatSqlOutputWalker;
2729
use Gedmo\Tool\ORM\Walker\SqlWalkerCompat;
2830

2931
/**
@@ -36,7 +38,7 @@
3638
*
3739
* @final since gedmo/doctrine-extensions 3.11
3840
*/
39-
class SoftDeleteableWalker extends SqlWalker
41+
class SoftDeleteableWalker extends CompatSqlOutputWalker
4042
{
4143
use SqlWalkerCompat;
4244

@@ -99,21 +101,43 @@ public function __construct($query, $parserResult, array $queryComponents)
99101
* @param SelectStatement|UpdateStatement|DeleteStatement $statement
100102
*
101103
* @throws UnexpectedValueException when an unsupported AST statement is given
104+
*
105+
* @phpstan-assert DeleteStatement $statement
102106
*/
103107
protected function doGetExecutorWithCompat($statement): AbstractSqlExecutor
104108
{
105-
switch (true) {
106-
case $statement instanceof DeleteStatement:
107-
assert(class_exists($statement->deleteClause->abstractSchemaName));
109+
if (!$statement instanceof DeleteStatement) {
110+
throw new UnexpectedValueException('SoftDeleteable walker should be used only on delete statement');
111+
}
108112

109-
$primaryClass = $this->getEntityManager()->getClassMetadata($statement->deleteClause->abstractSchemaName);
113+
return $this->createDeleteStatementExecutor($statement);
114+
}
110115

111-
return $primaryClass->isInheritanceTypeJoined()
112-
? new MultiTableDeleteExecutor($statement, $this, $this->meta, $this->getConnection()->getDatabasePlatform(), $this->configuration)
113-
: new SingleTableDeleteUpdateExecutor($statement, $this);
114-
default:
115-
throw new UnexpectedValueException('SoftDeleteable walker should be used only on delete statement');
116+
/**
117+
* @param DeleteStatement|UpdateStatement|SelectStatement $AST
118+
*
119+
* @throws UnexpectedValueException when an unsupported AST statement is given
120+
*
121+
* @phpstan-assert DeleteStatement $AST
122+
*/
123+
protected function doGetFinalizerWithCompat($AST): SqlFinalizer
124+
{
125+
if (!$AST instanceof DeleteStatement) {
126+
throw new UnexpectedValueException('SoftDeleteable walker should be used only on delete statement');
116127
}
128+
129+
return new PreparedExecutorFinalizer($this->createDeleteStatementExecutor($AST));
130+
}
131+
132+
protected function createDeleteStatementExecutor(DeleteStatement $AST): AbstractSqlExecutor
133+
{
134+
assert(class_exists($AST->deleteClause->abstractSchemaName));
135+
136+
$primaryClass = $this->getEntityManager()->getClassMetadata($AST->deleteClause->abstractSchemaName);
137+
138+
return $primaryClass->isInheritanceTypeJoined()
139+
? new MultiTableDeleteExecutor($AST, $this, $this->meta, $this->getConnection()->getDatabasePlatform(), $this->configuration)
140+
: new SingleTableDeleteUpdateExecutor($AST, $this);
117141
}
118142

119143
/**
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Doctrine Behavioral Extensions package.
5+
* (c) Gediminas Morkevicius <[email protected]> http://www.gediminasm.org
6+
* For the full copyright and license information, please view the LICENSE
7+
* file that was distributed with this source code.
8+
*/
9+
10+
namespace Gedmo\Tool\ORM\Walker;
11+
12+
use Doctrine\ORM\Query\SqlOutputWalker;
13+
use Doctrine\ORM\Query\SqlWalker;
14+
15+
if (class_exists(SqlOutputWalker::class)) {
16+
if ((new \ReflectionClass(SqlWalker::class))->getMethod('getExecutor')->hasReturnType()) {
17+
/**
18+
* Helper trait to address compatibility issues between ORM 2.x and 3.x.
19+
*
20+
* @internal
21+
*/
22+
abstract class CompatSqlOutputWalker extends SqlOutputWalker
23+
{
24+
use CompatSqlOutputWalkerForOrm3;
25+
}
26+
} else {
27+
/**
28+
* Helper trait to address compatibility issues between ORM 2.x and 3.x.
29+
*
30+
* @internal
31+
*/
32+
abstract class CompatSqlOutputWalker extends SqlOutputWalker
33+
{
34+
use CompatSqlOutputWalkerForOrm2;
35+
}
36+
}
37+
} else {
38+
if ((new \ReflectionClass(SqlWalker::class))->getMethod('getExecutor')->hasReturnType()) {
39+
/**
40+
* Helper trait to address compatibility issues between ORM 2.x and 3.x.
41+
*
42+
* @internal
43+
*/
44+
abstract class CompatSqlOutputWalker extends SqlWalker
45+
{
46+
use CompatSqlOutputWalkerForOrm3;
47+
}
48+
} else {
49+
/**
50+
* Helper trait to address compatibility issues between ORM 2.x and 3.x.
51+
*
52+
* @internal
53+
*/
54+
abstract class CompatSqlOutputWalker extends SqlWalker
55+
{
56+
use CompatSqlOutputWalkerForOrm2;
57+
}
58+
}
59+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Doctrine Behavioral Extensions package.
5+
* (c) Gediminas Morkevicius <[email protected]> http://www.gediminasm.org
6+
* For the full copyright and license information, please view the LICENSE
7+
* file that was distributed with this source code.
8+
*/
9+
10+
namespace Gedmo\Tool\ORM\Walker;
11+
12+
use Doctrine\ORM\Query\AST\DeleteStatement;
13+
use Doctrine\ORM\Query\AST\SelectStatement;
14+
use Doctrine\ORM\Query\AST\UpdateStatement;
15+
use Doctrine\ORM\Query\Exec\SqlFinalizer;
16+
use Doctrine\ORM\Query\SqlOutputWalker;
17+
18+
/**
19+
* Helper trait to address compatibility issues between ORM 2.x and 3.x.
20+
*
21+
* @mixin SqlOutputWalker
22+
*
23+
* @internal
24+
*/
25+
trait CompatSqlOutputWalkerForOrm2
26+
{
27+
/**
28+
* @param DeleteStatement|UpdateStatement|SelectStatement $AST
29+
*/
30+
public function getFinalizer($AST): SqlFinalizer
31+
{
32+
return $this->doGetFinalizerWithCompat($AST);
33+
}
34+
35+
/**
36+
* @param DeleteStatement|UpdateStatement|SelectStatement $AST
37+
*/
38+
protected function doGetFinalizerWithCompat($AST): SqlFinalizer
39+
{
40+
return parent::getFinalizer($AST);
41+
}
42+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Doctrine Behavioral Extensions package.
5+
* (c) Gediminas Morkevicius <[email protected]> http://www.gediminasm.org
6+
* For the full copyright and license information, please view the LICENSE
7+
* file that was distributed with this source code.
8+
*/
9+
10+
namespace Gedmo\Tool\ORM\Walker;
11+
12+
use Doctrine\ORM\Query\AST\DeleteStatement;
13+
use Doctrine\ORM\Query\AST\SelectStatement;
14+
use Doctrine\ORM\Query\AST\UpdateStatement;
15+
use Doctrine\ORM\Query\Exec\SqlFinalizer;
16+
use Doctrine\ORM\Query\SqlOutputWalker;
17+
18+
/**
19+
* Helper trait to address compatibility issues between ORM 2.x and 3.x.
20+
*
21+
* @mixin SqlOutputWalker
22+
*
23+
* @internal
24+
*/
25+
trait CompatSqlOutputWalkerForOrm3
26+
{
27+
public function getFinalizer(DeleteStatement|UpdateStatement|SelectStatement $AST): SqlFinalizer
28+
{
29+
return $this->doGetFinalizerWithCompat($AST);
30+
}
31+
32+
/**
33+
* @param DeleteStatement|UpdateStatement|SelectStatement $AST
34+
*/
35+
protected function doGetFinalizerWithCompat($AST): SqlFinalizer
36+
{
37+
return parent::getFinalizer($AST);
38+
}
39+
}

src/Translatable/Query/TreeWalker/TranslationWalker.php

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,10 @@
3232
use Doctrine\ORM\Query\AST\WhereClause;
3333
use Doctrine\ORM\Query\Exec\AbstractSqlExecutor;
3434
use Doctrine\ORM\Query\Exec\SingleSelectExecutor;
35-
use Doctrine\ORM\Query\SqlWalker;
35+
use Doctrine\ORM\Query\Exec\SingleSelectSqlFinalizer;
36+
use Doctrine\ORM\Query\Exec\SqlFinalizer;
3637
use Gedmo\Exception\RuntimeException;
38+
use Gedmo\Tool\ORM\Walker\CompatSqlOutputWalker;
3739
use Gedmo\Tool\ORM\Walker\SqlWalkerCompat;
3840
use Gedmo\Translatable\Hydrator\ORM\ObjectHydrator;
3941
use Gedmo\Translatable\Hydrator\ORM\SimpleObjectHydrator;
@@ -54,7 +56,7 @@
5456
*
5557
* @final since gedmo/doctrine-extensions 3.11
5658
*/
57-
class TranslationWalker extends SqlWalker
59+
class TranslationWalker extends CompatSqlOutputWalker
5860
{
5961
use SqlWalkerCompat;
6062

@@ -141,6 +143,21 @@ protected function doGetExecutorWithCompat($statement): AbstractSqlExecutor
141143
return new SingleSelectExecutor($statement, $this);
142144
}
143145

146+
/**
147+
* @param DeleteStatement|UpdateStatement|SelectStatement $AST
148+
*/
149+
protected function doGetFinalizerWithCompat($AST): SqlFinalizer
150+
{
151+
// If it's not a Select, the TreeWalker ought to skip it, and just return the parent.
152+
// @see https://github.com/doctrine-extensions/DoctrineExtensions/issues/2013
153+
if (!$AST instanceof SelectStatement) {
154+
return parent::getFinalizer($AST);
155+
}
156+
$this->prepareTranslatedComponents();
157+
158+
return new SingleSelectSqlFinalizer($this->walkSelectStatement($AST));
159+
}
160+
144161
protected function doWalkSelectStatementWithCompat(SelectStatement $selectStatement): string
145162
{
146163
$result = parent::walkSelectStatement($selectStatement);

0 commit comments

Comments
 (0)