/**
* Returns true if there is any entity with reference to the passed one.
*
* @param $entityName
* @param $entityId
* @return bool
*/
private function existsSomeEntityWithReferenceTo($entityName, $entityId)
{
$entityNames = $this->dbSchemaInfo->getAllEntityNames();
foreach ($entityNames as $otherEntityName) {
$otherEntityInfo = $this->dbSchemaInfo->getEntityInfo($otherEntityName);
$otherEntityReferences = $otherEntityInfo->references;
$otherEntityMnReferences = $otherEntityInfo->mnReferences;
$otherEntityValueReferences = $otherEntityInfo->valueReferences;
$allReferences = array_merge($otherEntityReferences, $otherEntityMnReferences, $otherEntityValueReferences);
foreach ($allReferences as $reference => $referencedEntity) {
// if the target is dynamic, check it anyway - just to be sure
if ($referencedEntity !== $entityName && $referencedEntity[0] !== '@') {
continue;
}
$otherEntityStorage = $this->storageFactory->getStorage($otherEntityName);
$possiblyReferencingEntities = $otherEntityStorage->loadAll();
if (isset($otherEntityReferences[$reference])) {
// 1:N reference
$vpReference = "vp_{$reference}";
foreach ($possiblyReferencingEntities as $possiblyReferencingEntity) {
if (isset($possiblyReferencingEntity[$vpReference])) {
$referencedVpidsString = $possiblyReferencingEntity[$vpReference];
preg_match_all(IdUtil::getRegexMatchingId(), $referencedVpidsString, $matches);
if (ArrayUtils::any($matches[0], Comparators::equals($entityId))) {
return true;
}
}
}
} elseif (isset($otherEntityMnReferences[$reference])) {
// M:N reference
$vpReference = "vp_{$otherEntityName}";
foreach ($possiblyReferencingEntities as $possiblyReferencingEntity) {
if (isset($possiblyReferencingEntity[$vpReference]) && array_search($entityId, $possiblyReferencingEntity[$vpReference]) !== false) {
return true;
}
}
} elseif (isset($otherEntityValueReferences[$reference])) {
// Value reference
list($sourceColumn, $sourceValue, $valueColumn, $pathInStructure) = array_values(ReferenceUtils::getValueReferenceDetails($reference));
foreach ($possiblyReferencingEntities as $possiblyReferencingEntity) {
if (isset($possiblyReferencingEntity[$sourceColumn]) && ($possiblyReferencingEntity[$sourceColumn] === $sourceValue || ReferenceUtils::valueMatchesWildcard($sourceValue, $possiblyReferencingEntity[$sourceColumn])) && isset($possiblyReferencingEntity[$valueColumn])) {
if (is_numeric($possiblyReferencingEntity[$valueColumn]) && intval($possiblyReferencingEntity[$valueColumn]) === 0 || $possiblyReferencingEntity[$valueColumn] === '') {
continue;
}
if ($pathInStructure) {
$possiblyReferencingEntity[$valueColumn] = unserialize($possiblyReferencingEntity[$valueColumn]);
$paths = ReferenceUtils::getMatchingPaths($possiblyReferencingEntity[$valueColumn], $pathInStructure);
} else {
$paths = [[]];
// root = the value itself
}
/** @var Cursor[] $cursors */
$cursors = array_map(function ($path) use(&$possiblyReferencingEntity, $valueColumn) {
return new Cursor($possiblyReferencingEntity[$valueColumn], $path);
}, $paths);
foreach ($cursors as $cursor) {
$vpidsString = $cursor->getValue();
preg_match_all(IdUtil::getRegexMatchingId(), $vpidsString, $matches);
if (ArrayUtils::any($matches[0], Comparators::equals($entityId))) {
return true;
}
}
}
}
}
}
}
return false;
}