This algorithm have a linear running time based on nodes (V) and dependency between the nodes (E), resulting in a computational complexity of O(V + E).
Author: Guilherme Blanco (guilhermeblanco@hotmail.com)
Author: Roman Borschel (roman@code-factory.org)
 public function testFailureSortMissingDependency()
 {
     $node1 = new Mock\Node(1);
     $this->sorter->addNode('1', $node1);
     $this->sorter->addDependency('1', '2');
     $this->expectException(\RuntimeException::class);
     $this->sorter->sort();
 }
 public function testFailureSortMissingDependency()
 {
     $sorter = new TopologicalSorter();
     $node1 = new ClassMetadata(1);
     $sorter->addNode('1', $node1);
     $sorter->addDependency('1', '2');
     $this->expectException(\RuntimeException::class);
     $sorter->sort();
 }
Exemplo n.º 3
0
 /**
  * @param EntityManagerInterface $em
  * @param ClassMetadata[]        $classes
  *
  * @return ClassMetadata[]
  */
 private function getCommitOrder(EntityManagerInterface $em, array $classes)
 {
     $sorter = new TopologicalSorter();
     foreach ($classes as $class) {
         if (!$sorter->hasNode($class->name)) {
             $sorter->addNode($class->name, $class);
         }
         // $class before its parents
         foreach ($class->parentClasses as $parentClass) {
             $parentClass = $em->getClassMetadata($parentClass);
             $parentClassName = $parentClass->getName();
             if (!$sorter->hasNode($parentClassName)) {
                 $sorter->addNode($parentClassName, $parentClass);
             }
             $sorter->addDependency($class->name, $parentClassName);
         }
         foreach ($class->associationMappings as $assoc) {
             if ($assoc['isOwningSide']) {
                 /* @var $targetClass ClassMetadata */
                 $targetClass = $em->getClassMetadata($assoc['targetEntity']);
                 $targetClassName = $targetClass->getName();
                 if (!$sorter->hasNode($targetClassName)) {
                     $sorter->addNode($targetClassName, $targetClass);
                 }
                 // add dependency ($targetClass before $class)
                 $sorter->addDependency($targetClassName, $class->name);
                 // parents of $targetClass before $class, too
                 foreach ($targetClass->parentClasses as $parentClass) {
                     $parentClass = $em->getClassMetadata($parentClass);
                     $parentClassName = $parentClass->getName();
                     if (!$sorter->hasNode($parentClassName)) {
                         $sorter->addNode($parentClassName, $parentClass);
                     }
                     $sorter->addDependency($parentClassName, $class->name);
                 }
             }
         }
     }
     return array_reverse($sorter->sort());
 }