From d4db126bb07558408ff2d1e112ef0831191dd539 Mon Sep 17 00:00:00 2001 From: Alessandro Lai Date: Fri, 18 Aug 2017 10:17:52 +0200 Subject: [PATCH] Remove code duplication of the getAllDiscriminators method --- lib/Doctrine/ORM/Query.php | 22 ++---------- lib/Doctrine/ORM/Query/SqlWalker.php | 22 ++---------- .../HierarchyDiscriminatorResolver.php | 34 +++++++++++++++++++ 3 files changed, 38 insertions(+), 40 deletions(-) create mode 100644 lib/Doctrine/ORM/Utility/HierarchyDiscriminatorResolver.php diff --git a/lib/Doctrine/ORM/Query.php b/lib/Doctrine/ORM/Query.php index a86cf6201..222586a1f 100644 --- a/lib/Doctrine/ORM/Query.php +++ b/lib/Doctrine/ORM/Query.php @@ -27,6 +27,7 @@ use Doctrine\ORM\Query\QueryException; use Doctrine\ORM\Mapping\ClassMetadata; use Doctrine\ORM\Query\ParameterTypeInferer; use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\ORM\Utility\HierarchyDiscriminatorResolver; /** * A Query object represents a DQL query. @@ -371,25 +372,6 @@ final class Query extends AbstractQuery $this->_em->getCache()->evictEntityRegion($className); } - private function getAllDiscriminators(ClassMetadata $classMetadata) - { - // FIXME: this code is copied from SqlWalker->getAllDiscriminators() - $hierarchyClasses = $classMetadata->subClasses; - $hierarchyClasses[] = $classMetadata->name; - - $discriminators = []; - foreach ($hierarchyClasses as $class) { - $currentMetadata = $this->getEntityManager()->getClassMetadata($class); - $currentDiscriminator = $currentMetadata->discriminatorValue; - - if (null !== $currentDiscriminator) { - $discriminators[$currentDiscriminator] = null; - } - } - - return $discriminators; - } - /** * Processes query parameter mappings. * @@ -418,7 +400,7 @@ final class Query extends AbstractQuery } if (isset($rsm->discriminatorParameters[$key]) && $value instanceof ClassMetadata) { - $value = array_keys($this->getAllDiscriminators($value)); + $value = array_keys(HierarchyDiscriminatorResolver::resolveDiscriminatorsForClass($value, $this->_em)); } $value = $this->processParameterValue($value); diff --git a/lib/Doctrine/ORM/Query/SqlWalker.php b/lib/Doctrine/ORM/Query/SqlWalker.php index 3407b0a8b..186187025 100644 --- a/lib/Doctrine/ORM/Query/SqlWalker.php +++ b/lib/Doctrine/ORM/Query/SqlWalker.php @@ -25,6 +25,7 @@ use Doctrine\ORM\Mapping\ClassMetadata; use Doctrine\ORM\Mapping\ClassMetadataInfo; use Doctrine\ORM\OptimisticLockException; use Doctrine\ORM\Query; +use Doctrine\ORM\Utility\HierarchyDiscriminatorResolver; use Doctrine\ORM\Utility\PersisterHelper; /** @@ -2292,7 +2293,7 @@ class SqlWalker implements TreeWalker throw QueryException::instanceOfUnrelatedClass($parameter, $rootClass->name); } - $discriminators = $discriminators + $this->getAllDiscriminators($metadata); + $discriminators += HierarchyDiscriminatorResolver::resolveDiscriminatorsForClass($metadata, $this->em); } foreach (array_keys($discriminators) as $dis) { @@ -2301,23 +2302,4 @@ class SqlWalker implements TreeWalker return '(' . implode(', ', $sqlParameterList) . ')'; } - - private function getAllDiscriminators(ClassMetadata $classMetadata) - { - // FIXME: this code is identical to Query->getAllDiscriminators() - $hierarchyClasses = $classMetadata->subClasses; - $hierarchyClasses[] = $classMetadata->name; - - $discriminators = []; - foreach ($hierarchyClasses as $class) { - $currentMetadata = $this->em->getClassMetadata($class); - $currentDiscriminator = $currentMetadata->discriminatorValue; - - if (null !== $currentDiscriminator) { - $discriminators[$currentDiscriminator] = null; - } - } - - return $discriminators; - } } diff --git a/lib/Doctrine/ORM/Utility/HierarchyDiscriminatorResolver.php b/lib/Doctrine/ORM/Utility/HierarchyDiscriminatorResolver.php new file mode 100644 index 000000000..a8ac100a5 --- /dev/null +++ b/lib/Doctrine/ORM/Utility/HierarchyDiscriminatorResolver.php @@ -0,0 +1,34 @@ +subClasses; + $hierarchyClasses[] = $rootClassMetadata->name; + + $discriminators = []; + foreach ($hierarchyClasses as $class) { + $currentMetadata = $entityManager->getClassMetadata($class); + $currentDiscriminator = $currentMetadata->discriminatorValue; + + if (null !== $currentDiscriminator) { + $discriminators[$currentDiscriminator] = null; + } + } + + return $discriminators; + } +}