1
0
mirror of synced 2025-02-09 08:49:26 +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\Mapping\ClassMetadata;
use Doctrine\ORM\Query\ParameterTypeInferer; use Doctrine\ORM\Query\ParameterTypeInferer;
use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Utility\HierarchyDiscriminatorResolver;
/** /**
* A Query object represents a DQL query. * A Query object represents a DQL query.
@ -371,25 +372,6 @@ final class Query extends AbstractQuery
$this->_em->getCache()->evictEntityRegion($className); $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. * Processes query parameter mappings.
* *
@ -418,7 +400,7 @@ final class Query extends AbstractQuery
} }
if (isset($rsm->discriminatorParameters[$key]) && $value instanceof ClassMetadata) { 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); $value = $this->processParameterValue($value);

View File

@ -25,6 +25,7 @@ use Doctrine\ORM\Mapping\ClassMetadata;
use Doctrine\ORM\Mapping\ClassMetadataInfo; use Doctrine\ORM\Mapping\ClassMetadataInfo;
use Doctrine\ORM\OptimisticLockException; use Doctrine\ORM\OptimisticLockException;
use Doctrine\ORM\Query; use Doctrine\ORM\Query;
use Doctrine\ORM\Utility\HierarchyDiscriminatorResolver;
use Doctrine\ORM\Utility\PersisterHelper; use Doctrine\ORM\Utility\PersisterHelper;
/** /**
@ -2292,7 +2293,7 @@ class SqlWalker implements TreeWalker
throw QueryException::instanceOfUnrelatedClass($parameter, $rootClass->name); throw QueryException::instanceOfUnrelatedClass($parameter, $rootClass->name);
} }
$discriminators = $discriminators + $this->getAllDiscriminators($metadata); $discriminators += HierarchyDiscriminatorResolver::resolveDiscriminatorsForClass($metadata, $this->em);
} }
foreach (array_keys($discriminators) as $dis) { foreach (array_keys($discriminators) as $dis) {
@ -2301,23 +2302,4 @@ class SqlWalker implements TreeWalker
return '(' . implode(', ', $sqlParameterList) . ')'; 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;
}
}