|
53 | 53 | use Doctrine\ORM\Query\AST\UpdateItem; |
54 | 54 | use Doctrine\ORM\Query\AST\UpdateStatement; |
55 | 55 | use Doctrine\ORM\Query\AST\WhereClause; |
| 56 | +use Doctrine\ORM\Query\Exec\PreparedExecutorFinalizer; |
| 57 | +use Doctrine\ORM\Query\Exec\SingleSelectSqlFinalizer; |
| 58 | +use Doctrine\ORM\Query\Exec\SqlFinalizer; |
| 59 | +use Doctrine\ORM\Query\OutputWalker; |
56 | 60 | use Doctrine\ORM\Query\Parser; |
57 | 61 | use Doctrine\ORM\Query\SqlWalker; |
58 | 62 | use LogicException; |
|
61 | 65 | /** |
62 | 66 | * @psalm-import-type QueryComponent from Parser |
63 | 67 | */ |
64 | | -class HintDrivenSqlWalker extends SqlWalker |
| 68 | +class HintDrivenSqlWalker extends SqlWalker implements OutputWalker |
65 | 69 | { |
66 | 70 |
|
67 | 71 | /** |
@@ -91,6 +95,22 @@ public function __construct( |
91 | 95 | } |
92 | 96 | } |
93 | 97 |
|
| 98 | + public function getFinalizer(DeleteStatement|UpdateStatement|SelectStatement $AST): SqlFinalizer |
| 99 | + { |
| 100 | + switch (true) { |
| 101 | + case $AST instanceof SelectStatement: |
| 102 | + return new SingleSelectSqlFinalizer($this->walkSelectStatement($AST)); |
| 103 | + |
| 104 | + case $AST instanceof UpdateStatement: |
| 105 | + return new PreparedExecutorFinalizer($this->createUpdateStatementExecutor($AST)); |
| 106 | + |
| 107 | + case $AST instanceof DeleteStatement: // @phpstan-ignore instanceof.alwaysTrue (keep it readable) |
| 108 | + return new PreparedExecutorFinalizer($this->createDeleteStatementExecutor($AST)); |
| 109 | + } |
| 110 | + |
| 111 | + throw new LogicException('Unexpected AST node type'); |
| 112 | + } |
| 113 | + |
94 | 114 | public function walkSelectStatement(SelectStatement $AST): string |
95 | 115 | { |
96 | 116 | return $this->callWalkers(SqlNode::SelectStatement, parent::walkSelectStatement($AST)); |
|
0 commit comments