Skip to content

Commit

Permalink
Add assertions based on joinColumns access
Browse files Browse the repository at this point in the history
  • Loading branch information
greg0ire committed May 23, 2023
1 parent d4915a8 commit 6ce0cf4
Show file tree
Hide file tree
Showing 10 changed files with 43 additions and 23 deletions.
1 change: 1 addition & 0 deletions lib/Doctrine/ORM/Cache/DefaultCacheFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ public function buildCachedCollectionPersister(
CollectionPersister $persister,
AssociationMapping $mapping,
): CachedCollectionPersister {
assert(isset($mapping->cache));
$usage = $mapping->cache['usage'];
$region = $this->getRegion($mapping->cache);

Expand Down
1 change: 1 addition & 0 deletions lib/Doctrine/ORM/Cache/DefaultEntityHydrator.php
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ public function buildCacheEntry(ClassMetadata $metadata, EntityCacheKey $key, ob

foreach ($associationIds as $fieldName => $fieldValue) {
if (isset($targetClassMetadata->fieldMappings[$fieldName])) {
assert($owningAssociation->isToOneOwningSide());
$fieldMapping = $targetClassMetadata->fieldMappings[$fieldName];

$data[$owningAssociation->targetToSourceKeyColumns[$fieldMapping->columnName]] = $fieldValue;
Expand Down
4 changes: 2 additions & 2 deletions lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php
Original file line number Diff line number Diff line change
Expand Up @@ -519,14 +519,14 @@ protected function registerManaged(ClassMetadata $class, object $entity, array $
$id = [];

foreach ($class->identifier as $fieldName) {
$id[$fieldName] = isset($class->associationMappings[$fieldName])
$id[$fieldName] = isset($class->associationMappings[$fieldName]) && $class->associationMappings[$fieldName]->isToOneOwningSide()
? $data[$class->associationMappings[$fieldName]->joinColumns[0]['name']]
: $data[$fieldName];
}
} else {
$fieldName = $class->identifier[0];
$id = [
$fieldName => isset($class->associationMappings[$fieldName])
$fieldName => isset($class->associationMappings[$fieldName]) && $class->associationMappings[$fieldName]->isToOneOwningSide()
? $data[$class->associationMappings[$fieldName]->joinColumns[0]['name']]
: $data[$fieldName],
];
Expand Down
7 changes: 5 additions & 2 deletions lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,7 @@ private function getEntityFromIdentityMap(string $className, array $data): objec
array_map(
/** @return mixed */
static function (string $fieldName) use ($data, $class) {
return isset($class->associationMappings[$fieldName])
return isset($class->associationMappings[$fieldName]) && assert($class->associationMappings[$fieldName]->isToOneOwningSide())
? $data[$class->associationMappings[$fieldName]->joinColumns[0]['name']]
: $data[$fieldName];
},
Expand All @@ -289,7 +289,10 @@ static function (string $fieldName) use ($data, $class) {

return $this->uow->tryGetByIdHash(ltrim($idHash), $class->rootEntityName);
} elseif (isset($class->associationMappings[$class->identifier[0]])) {
return $this->uow->tryGetByIdHash($data[$class->associationMappings[$class->identifier[0]]->joinColumns[0]['name']], $class->rootEntityName);
$association = $class->associationMappings[$class->identifier[0]];
assert($association->isToOneOwningSide());

return $this->uow->tryGetByIdHash($data[$association->joinColumns[0]['name']], $class->rootEntityName);
}

return $this->uow->tryGetByIdHash($data[$class->identifier[0]], $class->rootEntityName);
Expand Down
22 changes: 18 additions & 4 deletions lib/Doctrine/ORM/Mapping/ClassMetadata.php
Original file line number Diff line number Diff line change
Expand Up @@ -1524,6 +1524,7 @@ public function getIdentifierColumnNames(): array
}

// Association defined as Id field
assert($this->associationMappings[$idProperty]->isToOneOwningSide());
$joinColumns = $this->associationMappings[$idProperty]->joinColumns;
$assocColumnNames = array_map(static fn (JoinColumnMapping $joinColumn): string => $joinColumn['name'], $joinColumns);

Expand Down Expand Up @@ -2259,7 +2260,7 @@ public function isAssociationWithSingleJoinColumn(string $fieldName): bool
{
return isset($this->associationMappings[$fieldName])
&& isset($this->associationMappings[$fieldName]->joinColumns[0])
&& ! isset($this->associationMappings[$fieldName]['joinColumns'][1]);
&& ! isset($this->associationMappings[$fieldName]->joinColumns[1]);
}

/**
Expand All @@ -2273,7 +2274,11 @@ public function getSingleAssociationJoinColumnName(string $fieldName): string
throw MappingException::noSingleAssociationJoinColumnFound($this->name, $fieldName);
}

return $this->associationMappings[$fieldName]->joinColumns[0]['name'];
$assoc = $this->associationMappings[$fieldName];

assert($assoc->isToOneOwningSide());

return $assoc->joinColumns[0]['name'];
}

/**
Expand All @@ -2287,7 +2292,11 @@ public function getSingleAssociationReferencedJoinColumnName(string $fieldName):
throw MappingException::noSingleAssociationJoinColumnFound($this->name, $fieldName);
}

return $this->associationMappings[$fieldName]->joinColumns[0]['referencedColumnName'];
$assoc = $this->associationMappings[$fieldName];

assert($assoc->isToOneOwningSide());

return $assoc->joinColumns[0]['referencedColumnName'];
}

/**
Expand All @@ -2306,6 +2315,7 @@ public function getFieldForColumn(string $columnName): string
foreach ($this->associationMappings as $assocName => $mapping) {
if (
$this->isAssociationWithSingleJoinColumn($assocName) &&
assert($this->associationMappings[$assocName]->isToOneOwningSide()) &&
$this->associationMappings[$assocName]->joinColumns[0]['name'] === $columnName
) {
return $assocName;
Expand Down Expand Up @@ -2471,7 +2481,11 @@ public function isAssociationInverseSide(string $assocName): bool

public function getAssociationMappedByTargetField(string $assocName): string
{
return $this->associationMappings[$assocName]->mappedBy;
$assoc = $this->associationMappings[$assocName];

assert($assoc instanceof InverseSideMapping);

return $assoc->mappedBy;
}

/**
Expand Down
5 changes: 4 additions & 1 deletion lib/Doctrine/ORM/Mapping/DefaultQuoteStrategy.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

use function array_map;
use function array_merge;
use function assert;
use function is_numeric;
use function preg_replace;
use function substr;
Expand Down Expand Up @@ -107,7 +108,9 @@ public function getIdentifierColumnNames(ClassMetadata $class, AbstractPlatform
}

// Association defined as Id field
$joinColumns = $class->associationMappings[$fieldName]->joinColumns;
$assoc = $class->associationMappings[$fieldName];
assert($assoc->isToOneOwningSide());
$joinColumns = $assoc->joinColumns;
$assocQuotedColumnNames = array_map(
static fn (JoinColumnMapping $joinColumn) => isset($joinColumn['quoted'])
? $platform->quoteIdentifier($joinColumn['name'])
Expand Down
5 changes: 4 additions & 1 deletion lib/Doctrine/ORM/Tools/Pagination/CountOutputWalker.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

use function array_diff;
use function array_keys;
use function assert;
use function count;
use function implode;
use function reset;
Expand Down Expand Up @@ -95,7 +96,9 @@ public function walkSelectStatement(SelectStatement $selectStatement): string
}

if (isset($rootClass->associationMappings[$property])) {
$joinColumn = $rootClass->associationMappings[$property]->joinColumns[0]['name'];
$association = $rootClass->associationMappings[$property];
assert($association->isToOneOwningSide());
$joinColumn = $association->joinColumns[0]['name'];

foreach (array_keys($this->rsm->metaMappings, $joinColumn, true) as $alias) {
if ($this->rsm->columnOwnerMap[$alias] === $rootAlias) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -498,7 +498,9 @@ private function getSQLIdentifier(SelectStatement $AST): array
}

if (isset($rootClass->associationMappings[$property])) {
$joinColumn = $rootClass->associationMappings[$property]->joinColumns[0]['name'];
$association = $rootClass->associationMappings[$property];
assert($association->isToOneOwningSide());
$joinColumn = $association->joinColumns[0]['name'];

foreach (array_keys($this->rsm->metaMappings, $joinColumn, true) as $alias) {
if ($this->rsm->columnOwnerMap[$alias] === $rootAlias) {
Expand Down
6 changes: 5 additions & 1 deletion lib/Doctrine/ORM/Tools/SchemaTool.php
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,9 @@ private function getIndexColumns(ClassMetadata $class, array $indexData): array
if ($class->hasField($fieldName)) {
$columns[] = $this->quoteStrategy->getColumnName($fieldName, $class, $this->platform);
} elseif ($class->hasAssociation($fieldName)) {
foreach ($class->getAssociationMapping($fieldName)->joinColumns as $joinColumn) {
$assoc = $class->getAssociationMapping($fieldName);
assert($assoc->isToOneOwningSide());
foreach ($assoc->joinColumns as $joinColumn) {
$columns[] = $this->quoteStrategy->getJoinColumnName($joinColumn, $class, $this->platform);
}
}
Expand Down Expand Up @@ -247,6 +249,7 @@ public function getSchemaFromMetadata(array $classes): Schema

if (isset($class->associationMappings[$identifierField]->inherited)) {
$idMapping = $class->associationMappings[$identifierField];
assert($idMapping->isToOneOwningSide());

$targetEntity = current(
array_filter(
Expand Down Expand Up @@ -299,6 +302,7 @@ public function getSchemaFromMetadata(array $classes): Schema
$pkColumns[] = $this->quoteStrategy->getColumnName($identifierField, $class, $this->platform);
} elseif (isset($class->associationMappings[$identifierField])) {
$assoc = $class->associationMappings[$identifierField];
assert($assoc->isToOneOwningSide());

foreach ($assoc->joinColumns as $joinColumn) {
$pkColumns[] = $this->quoteStrategy->getJoinColumnName($joinColumn, $class, $this->platform);
Expand Down
11 changes: 0 additions & 11 deletions psalm-baseline.xml
Original file line number Diff line number Diff line change
Expand Up @@ -324,12 +324,10 @@
<LessSpecificReturnStatement>
<code>$className</code>
<code>$className</code>
<code>$columnNames</code>
<code><![CDATA[$this->namespace . '\\' . $className]]></code>
</LessSpecificReturnStatement>
<MoreSpecificReturnType>
<code>class-string|null</code>
<code><![CDATA[list<string>]]></code>
</MoreSpecificReturnType>
<NullableReturnStatement>
<code><![CDATA[$this->reflClass]]></code>
Expand Down Expand Up @@ -425,14 +423,6 @@
<code><![CDATA[strrpos($className, '\\')]]></code>
</PossiblyFalseOperand>
</file>
<file src="lib/Doctrine/ORM/Mapping/DefaultQuoteStrategy.php">
<LessSpecificReturnStatement>
<code>$quotedColumnNames</code>
</LessSpecificReturnStatement>
<MoreSpecificReturnType>
<code>array</code>
</MoreSpecificReturnType>
</file>
<file src="lib/Doctrine/ORM/Mapping/DefaultTypedFieldMapper.php">
<LessSpecificReturnStatement>
<code>$mapping</code>
Expand Down Expand Up @@ -720,7 +710,6 @@
<code><![CDATA[$collection->getOwner()]]></code>
<code><![CDATA[$collection->getOwner()]]></code>
</PossiblyNullArgument>
<UndefinedPropertyFetch/>
</file>
<file src="lib/Doctrine/ORM/Persisters/Entity/BasicEntityPersister.php">
<DocblockTypeContradiction>
Expand Down

0 comments on commit 6ce0cf4

Please sign in to comment.