1
0
mirror of synced 2025-02-02 21:41:45 +03:00

Remove code duplication of the getAllDiscriminators method

This commit is contained in:
Alessandro Lai 2017-08-18 10:17:52 +02:00
parent c7ef9085fb
commit d4db126bb0
No known key found for this signature in database
GPG Key ID: 5D9C513BE4F5798D
3 changed files with 38 additions and 40 deletions

View File

@ -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);

View File

@ -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;
}
}

View 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;
}
}