From 11c84c7b20ac9c327a3843ac53a56795c79c01f6 Mon Sep 17 00:00:00 2001 From: Alessandro Lai Date: Wed, 3 May 2017 11:00:26 +0200 Subject: [PATCH] Split SqlWalker::walkInstanceOfExpression method --- lib/Doctrine/ORM/Query/SqlWalker.php | 94 +++++++++++++++------------- 1 file changed, 51 insertions(+), 43 deletions(-) diff --git a/lib/Doctrine/ORM/Query/SqlWalker.php b/lib/Doctrine/ORM/Query/SqlWalker.php index 62350c389..e308b7de7 100644 --- a/lib/Doctrine/ORM/Query/SqlWalker.php +++ b/lib/Doctrine/ORM/Query/SqlWalker.php @@ -37,7 +37,6 @@ use Doctrine\ORM\Utility\PersisterHelper; * @author Alexander * @author Fabio B. Silva * @since 2.0 - * @todo Rename: SQLWalker */ class SqlWalker implements TreeWalker { @@ -2020,6 +2019,7 @@ class SqlWalker implements TreeWalker /** * {@inheritdoc} + * @throws \Doctrine\ORM\Query\QueryException */ public function walkInstanceOfExpression($instanceOfExpr) { @@ -2037,48 +2037,7 @@ class SqlWalker implements TreeWalker } $sql .= $class->discriminatorColumn['name'] . ($instanceOfExpr->not ? ' NOT IN ' : ' IN '); - - $knownSubclasses = array_flip($discrClass->subClasses); - - $sqlParameterList = []; - $discriminators = []; - foreach ($instanceOfExpr->value as $parameter) { - if ($parameter instanceof AST\InputParameter) { - $this->rsm->addMetadataParameterMapping($parameter->name, 'discriminatorValue'); - - $sqlParameterList[] = $this->walkInputParameter($parameter); - - continue; - } - - // Trim first backslash - $parameter = ltrim($parameter, '\\'); - - // Check parameter is really in the hierarchy - if ($parameter !== $discrClass->name && ! array_key_exists($parameter, $knownSubclasses)) { - throw QueryException::instanceOfUnrelatedClass($parameter, $discrClass->name); - } - - // Include discriminators for parameter class and its subclass - $metadata = $this->em->getClassMetadata($parameter); - $hierarchyClasses = $metadata->subClasses; - $hierarchyClasses[] = $metadata->name; - - foreach ($hierarchyClasses as $class) { - $currentMetadata = $this->em->getClassMetadata($class); - $currentDiscriminator = $currentMetadata->discriminatorValue; - - if (is_string($currentDiscriminator) && ! array_key_exists($currentDiscriminator, $discriminators)) { - $discriminators[$currentDiscriminator] = true; - } - } - } - - foreach (array_keys($discriminators) as $dis) { - $sqlParameterList[] = $this->conn->quote($dis); - } - - $sql .= '(' . implode(', ', $sqlParameterList) . ')'; + $sql .= $this->getChildDiscriminatorsFromClassMetadata($discrClass, $instanceOfExpr); return $sql; } @@ -2312,4 +2271,53 @@ class SqlWalker implements TreeWalker return $resultAlias; } + + /** + * @param ClassMetadataInfo $discrClass + * @param AST\InstanceOfExpression $instanceOfExpr + * @return string The list in parentheses of valid child discriminators from the given class + * @throws QueryException + */ + private function getChildDiscriminatorsFromClassMetadata(ClassMetadataInfo $discrClass, AST\InstanceOfExpression $instanceOfExpr) + { + $knownSubclasses = array_flip($discrClass->subClasses); + $sqlParameterList = []; + $discriminators = []; + foreach ($instanceOfExpr->value as $parameter) { + if ($parameter instanceof AST\InputParameter) { + $this->rsm->addMetadataParameterMapping($parameter->name, 'discriminatorValue'); + + $sqlParameterList[] = $this->walkInputParameter($parameter); + + continue; + } + + // Trim first backslash + $parameter = ltrim($parameter, '\\'); + + if ($parameter !== $discrClass->name && ! array_key_exists($parameter, $knownSubclasses)) { + throw QueryException::instanceOfUnrelatedClass($parameter, $discrClass->name); + } + + // Include discriminators for parameter class and its subclass + $metadata = $this->em->getClassMetadata($parameter); + $hierarchyClasses = $metadata->subClasses; + $hierarchyClasses[] = $metadata->name; + + foreach ($hierarchyClasses as $class) { + $currentMetadata = $this->em->getClassMetadata($class); + $currentDiscriminator = $currentMetadata->discriminatorValue; + + if (is_string($currentDiscriminator) && ! array_key_exists($currentDiscriminator, $discriminators)) { + $discriminators[$currentDiscriminator] = true; + } + } + } + + foreach (array_keys($discriminators) as $dis) { + $sqlParameterList[] = $this->conn->quote($dis); + } + + return '(' . implode(', ', $sqlParameterList) . ')'; + } }