Remove code duplication of the getAllDiscriminators method
This commit is contained in:
parent
c7ef9085fb
commit
d4db126bb0
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
34
lib/Doctrine/ORM/Utility/HierarchyDiscriminatorResolver.php
Normal file
34
lib/Doctrine/ORM/Utility/HierarchyDiscriminatorResolver.php
Normal file
@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
namespace Doctrine\ORM\Utility;
|
||||
|
||||
use Doctrine\Common\Persistence\Mapping\ClassMetadata;
|
||||
use Doctrine\ORM\EntityManagerInterface;
|
||||
|
||||
/**
|
||||
* Class HierarchyDiscriminatorResolver
|
||||
* @package Doctrine\ORM\Utility
|
||||
* @internal This class exists only to avoid code duplication, do not reuse it externally
|
||||
*/
|
||||
class HierarchyDiscriminatorResolver
|
||||
{
|
||||
public static function resolveDiscriminatorsForClass(
|
||||
ClassMetadata $rootClassMetadata,
|
||||
EntityManagerInterface $entityManager
|
||||
) {
|
||||
$hierarchyClasses = $rootClassMetadata->subClasses;
|
||||
$hierarchyClasses[] = $rootClassMetadata->name;
|
||||
|
||||
$discriminators = [];
|
||||
foreach ($hierarchyClasses as $class) {
|
||||
$currentMetadata = $entityManager->getClassMetadata($class);
|
||||
$currentDiscriminator = $currentMetadata->discriminatorValue;
|
||||
|
||||
if (null !== $currentDiscriminator) {
|
||||
$discriminators[$currentDiscriminator] = null;
|
||||
}
|
||||
}
|
||||
|
||||
return $discriminators;
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user