Skip to content

Commit

Permalink
Add templating for getOwningSide
Browse files Browse the repository at this point in the history
It allows to remove many assertions.
  • Loading branch information
greg0ire committed May 11, 2023
1 parent e5eaf9b commit 1c8b518
Show file tree
Hide file tree
Showing 5 changed files with 36 additions and 20 deletions.
19 changes: 18 additions & 1 deletion lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,24 @@ public function setEntityManager(EntityManagerInterface $em): void
$this->em = $em;
}

/**
* @param A $maybeOwningSide
*
* @return (A is ManyToManyAssociationMapping ? ManyToManyOwningSideMapping : (
* A is OneToOneAssociationMapping ? OneToOneOwningSideMapping : (
* A is OneToManyAssociationMapping ? ManyToOneAssociationMapping : (
* A is ManyToOneAssociationMapping ? ManyToOneAssociationMapping : OwningSideMapping
* ))))
*
* @template A of AssociationMapping
*/
final public function getOwningSide(AssociationMapping $maybeOwningSide): OwningSideMapping
{
if ($maybeOwningSide instanceof OwningSideMapping) {
assert($maybeOwningSide instanceof ManyToManyOwningSideMapping ||
$maybeOwningSide instanceof OneToOneOwningSideMapping ||
$maybeOwningSide instanceof ManyToOneAssociationMapping);

return $maybeOwningSide;
}

Expand All @@ -72,7 +87,9 @@ final public function getOwningSide(AssociationMapping $maybeOwningSide): Owning
$owningSide = $this->getMetadataFor($maybeOwningSide->targetEntity)
->associationMappings[$maybeOwningSide->mappedBy];

assert($owningSide instanceof OwningSideMapping);
assert($owningSide instanceof ManyToManyOwningSideMapping ||
$owningSide instanceof OneToOneOwningSideMapping ||
$owningSide instanceof ManyToOneAssociationMapping);

return $owningSide;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,8 +114,6 @@ public function count(PersistentCollection $collection): int
$sourceClass = $this->em->getClassMetadata($mapping->sourceEntity);
$association = $this->em->getMetadataFactory()->getOwningSide($mapping);

assert($association->isManyToManyOwningSide());

$joinTableName = $this->quoteStrategy->getJoinTableName($association, $sourceClass, $this->platform);
$joinColumns = ! $mapping->isOwningSide()
? $association->joinTable['inverseJoinColumns']
Expand Down Expand Up @@ -346,9 +344,6 @@ protected function generateFilterConditionSQL(ClassMetadata $targetEntity, strin
protected function getOnConditionSQL(AssociationMapping $mapping): array
{
$association = $this->em->getMetadataFactory()->getOwningSide($mapping);

assert($association->isManyToManyOwningSide());

$joinColumns = $mapping->isOwningSide()
? $association->joinTable['inverseJoinColumns']
: $association->joinTable['joinColumns'];
Expand Down Expand Up @@ -680,7 +675,6 @@ private function getJoinTableRestrictions(
$params = [];
$types = [];

assert($mapping->isManyToManyOwningSide());
foreach ($mapping->joinTableColumns as $joinTableColumn) {
$whereClauses[] = ($addFilters ? 't.' : '') . $joinTableColumn . ' = ?';

Expand Down
20 changes: 7 additions & 13 deletions lib/Doctrine/ORM/Persisters/Entity/BasicEntityPersister.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
use Doctrine\ORM\Mapping\ClassMetadata;
use Doctrine\ORM\Mapping\InverseSideMapping;
use Doctrine\ORM\Mapping\JoinColumnMapping;
use Doctrine\ORM\Mapping\ManyToManyAssociationMapping;
use Doctrine\ORM\Mapping\MappingException;
use Doctrine\ORM\Mapping\OneToManyAssociationMapping;
use Doctrine\ORM\Mapping\QuoteStrategy;
Expand Down Expand Up @@ -518,9 +519,6 @@ protected function deleteJoinTableRecords(array $identifier, array $types): void
}

$association = $this->em->getMetadataFactory()->getOwningSide($association);

assert($association->isManyToManyOwningSide());

$joinColumns = $mapping->isOwningSide()
? $association->joinTable['joinColumns']
: $association->joinTable['inverseJoinColumns'];
Expand Down Expand Up @@ -902,6 +900,7 @@ public function getManyToManyCollection(
int|null $offset = null,
int|null $limit = null,
): array {
assert($assoc->isManyToMany());
$this->switchPersisterContext($offset, $limit);

$stmt = $this->getManyToManyStatement($assoc, $sourceEntity, $offset, $limit);
Expand Down Expand Up @@ -956,14 +955,15 @@ private function loadCollectionFromStatement(
*/
public function loadManyToManyCollection(AssociationMapping $assoc, object $sourceEntity, PersistentCollection $collection): array
{
assert($assoc->isManyToMany());
$stmt = $this->getManyToManyStatement($assoc, $sourceEntity);

return $this->loadCollectionFromStatement($assoc, $stmt, $collection);
}

/** @throws MappingException */
private function getManyToManyStatement(
AssociationMapping $assoc,
AssociationMapping&ManyToManyAssociationMapping $assoc,
object $sourceEntity,
int|null $offset = null,
int|null $limit = null,
Expand All @@ -977,14 +977,10 @@ private function getManyToManyStatement(
$parameters = [];

if (! $assoc->isOwningSide()) {
assert(isset($assoc->mappedBy));
$class = $this->em->getClassMetadata($assoc->targetEntity);
}

$association = $this->em->getMetadataFactory()->getOwningSide($assoc);

assert($association->isManyToManyOwningSide());

$joinColumns = $assoc->isOwningSide()
? $association->joinTable['joinColumns']
: $association->joinTable['inverseJoinColumns'];
Expand Down Expand Up @@ -1331,15 +1327,13 @@ protected function getSelectColumnAssociationSQL(
* Gets the SQL join fragment used when selecting entities from a
* many-to-many association.
*/
protected function getSelectManyToManyJoinSQL(AssociationMapping $manyToMany): string
protected function getSelectManyToManyJoinSQL(AssociationMapping&ManyToManyAssociationMapping $manyToMany): string
{
$conditions = [];
$association = $manyToMany;
$sourceTableAlias = $this->getSQLTableAlias($this->class->name);

$association = $this->em->getMetadataFactory()->getOwningSide($manyToMany);
assert($association->isManyToManyOwningSide());

$association = $this->em->getMetadataFactory()->getOwningSide($manyToMany);
$joinTableName = $this->quoteStrategy->getJoinTableName($association, $this->class, $this->platform);
$joinColumns = $manyToMany->isOwningSide()
? $association->joinTable['inverseJoinColumns']
Expand Down Expand Up @@ -1861,7 +1855,7 @@ private function getTypes(string $field, mixed $value, ClassMetadata $class): ar
if ($assoc->isManyToManyOwningSide()) {
$columns = $assoc->relationToTargetKeyColumns;
} else {
assert($assoc->isToOneOwningSide() || $assoc->isManyToOne());
assert($assoc->isToOneOwningSide());
$columns = $assoc->sourceToTargetKeyColumns;
}

Expand Down
6 changes: 6 additions & 0 deletions phpstan.neon
Original file line number Diff line number Diff line change
Expand Up @@ -45,3 +45,9 @@ parameters:
- lib/Doctrine/ORM/Persisters/Entity/JoinedSubclassPersister.php
- lib/Doctrine/ORM/Query/SqlWalker.php
- lib/Doctrine/ORM/Tools/SchemaValidator.php

-
message: '#^.*Doctrine\\ORM\\Mapping\\AssociationMapping&Doctrine\\ORM\\Mapping\\ManyToManyAssociationMapping, Doctrine\\ORM\\Mapping\\AssociationMapping given\.#'
paths:
- lib/Doctrine/ORM/Persisters/Entity/BasicEntityPersister.php
- lib/Doctrine/ORM/Persisters/Entity/JoinedSubclassPersister.php
5 changes: 5 additions & 0 deletions psalm-baseline.xml
Original file line number Diff line number Diff line change
Expand Up @@ -407,6 +407,11 @@
<code><![CDATA[$parent->generatorType]]></code>
<code><![CDATA[$parent->idGenerator]]></code>
</RedundantCondition>
<RedundantConditionGivenDocblockType>
<code>assert($owningSide instanceof ManyToManyOwningSideMapping ||
$owningSide instanceof OneToOneOwningSideMapping ||
$owningSide instanceof ManyToOneAssociationMapping)</code>
</RedundantConditionGivenDocblockType>
</file>
<file src="lib/Doctrine/ORM/Mapping/DefaultEntityListenerResolver.php">
<InvalidStringClass>
Expand Down

0 comments on commit 1c8b518

Please sign in to comment.