private function addDependencies(ClassMetadataProxy $class, CommitOrderCalculator $calc)
 {
     foreach ($class->origFieldMappings as $mapping) {
         $isOwningReference = isset($mapping['reference']) && $mapping['isOwningSide'];
         $isAssociation = isset($mapping['embedded']) || $isOwningReference;
         if (!$isAssociation || !isset($mapping['targetDocument'])) {
             continue;
         }
         $targetClass = $this->objectManager->getClassMetadata($mapping['targetDocument']);
         if (!$calc->hasClass($targetClass->name)) {
             $calc->addClass($targetClass);
         }
         $calc->addDependency($targetClass, $class);
         // If the target class has mapped subclasses, these share the same dependency.
         if (!$targetClass->subClasses) {
             continue;
         }
         $newNodes = array();
         foreach ($targetClass->subClasses as $subClassName) {
             $targetSubClass = $this->objectManager->getClassMetadata($subClassName);
             if (!$calc->hasClass($subClassName)) {
                 $calc->addClass($targetSubClass);
                 $newNodes[] = $targetSubClass;
             }
             $calc->addDependency($targetSubClass, $class);
         }
         // avoid infinite recursion
         if ($class !== $targetClass) {
             $this->addDependencies($targetClass, $calc);
         }
     }
 }
Beispiel #2
0
 /**
  * Clears the UnitOfWork.
  */
 public function clear()
 {
     $this->identityMap = $this->documentIdentifiers = $this->originalDocumentData = $this->documentChangeSets = $this->documentStates = $this->scheduledForDirtyCheck = $this->documentInsertions = $this->documentUpdates = $this->documentDeletions = $this->collectionUpdates = $this->collectionDeletions = $this->extraUpdates = $this->parentAssociations = $this->orphanRemovals = array();
     if ($this->commitOrderCalculator !== null) {
         $this->commitOrderCalculator->clear();
     }
 }
Beispiel #3
0
 /**
  * Add dependencies recursively through embedded documents. Embedded documents
  * may have references to other documents so those need to be saved first.
  *
  * @param ClassMetadata $class
  * @param CommitOrderCalculator $calc
  */
 private function addDependencies(ClassMetadata $class, $calc)
 {
     foreach ($class->fieldMappings as $mapping) {
         if ($mapping['isOwningSide'] && isset($mapping['reference']) && isset($mapping['targetDocument'])) {
             $targetClass = $this->dm->getClassMetadata($mapping['targetDocument']);
             if (!$calc->hasClass($targetClass->name)) {
                 $calc->addClass($targetClass);
             }
             if (!$calc->hasDependency($targetClass, $class)) {
                 $calc->addDependency($targetClass, $class);
             }
         }
         if (isset($mapping['embedded']) && isset($mapping['targetDocument'])) {
             $targetClass = $this->dm->getClassMetadata($mapping['targetDocument']);
             if (!$calc->hasClass($targetClass->name)) {
                 $calc->addClass($targetClass);
             }
             if (!$calc->hasDependency($targetClass, $class)) {
                 $calc->addDependency($targetClass, $class);
             }
             // avoid infinite recursion
             if ($class != $targetClass) {
                 $this->addDependencies($targetClass, $calc);
             }
         }
     }
 }
Beispiel #4
0
 /**
  * Clears the UnitOfWork.
  *
  * @param string $documentName if given, only documents of this type will get detached
  */
 public function clear($documentName = null)
 {
     if ($documentName === null) {
         $this->identityMap = $this->documentIdentifiers = $this->originalDocumentData = $this->documentChangeSets = $this->documentStates = $this->scheduledForDirtyCheck = $this->documentInsertions = $this->documentUpdates = $this->documentDeletions = $this->collectionUpdates = $this->collectionDeletions = $this->extraUpdates = $this->parentAssociations = $this->orphanRemovals = array();
         if ($this->commitOrderCalculator !== null) {
             $this->commitOrderCalculator->clear();
         }
     } else {
         $visited = array();
         foreach ($this->identityMap as $className => $documents) {
             if ($className === $documentName) {
                 foreach ($documents as $document) {
                     $this->doDetach($document, $visited, true);
                 }
             }
         }
     }
     if ($this->evm->hasListeners(Events::onClear)) {
         $this->evm->dispatchEvent(Events::onClear, new Event\OnClearEventArgs($this->dm, $documentName));
     }
 }
 /**
  * Add dependencies recursively through embedded documents. Embedded documents
  * may have references to other documents so those need to be saved first.
  *
  * @param ClassMetadata $class
  * @param CommitOrderCalculator $calc
  */
 private function _addDependencies($class, $calc)
 {
     foreach ($class->fieldMappings as $mapping) {
         if (isset($mapping['reference'])) {
             $targetClass = $this->_dm->getClassMetadata($mapping['targetDocument']);
             if (!$calc->hasClass($targetClass->name)) {
                 $calc->addClass($targetClass);
             }
             if (!$calc->hasDependency($targetClass, $class)) {
                 $calc->addDependency($targetClass, $class);
             }
         }
         if (isset($mapping['embedded'])) {
             $targetClass = $this->_dm->getClassMetadata($mapping['targetDocument']);
             if (!$calc->hasClass($targetClass->name)) {
                 $calc->addClass($targetClass);
             }
             if (!$calc->hasDependency($targetClass, $class)) {
                 $calc->addDependency($targetClass, $class);
             }
             $this->_addDependencies($targetClass, $calc);
         }
     }
 }
 /**
  * Clears the UnitOfWork.
  */
 public function clear()
 {
     $this->_identityMap = $this->_documentIdentifiers = $this->_originalDocumentData = $this->_documentChangeSets = $this->_documentStates = $this->_scheduledForDirtyCheck = $this->_documentInsertions = $this->_documentUpdates = $this->_documentDeletions = $this->_orphanRemovals = array();
     if ($this->_commitOrderCalculator !== null) {
         $this->_commitOrderCalculator->clear();
     }
 }