/**
  * Gets the commit order for all the classes available via the provided {@see ClassMetadataFactory}
  *
  * @param ClassMetadataFactory $mdf
  *
  * @return \string[]
  */
 public static function getCommitOrderFromMetadata(ClassMetadataFactory $mdf)
 {
     $cd = $mdf->getCacheDriver();
     if ($cd->contains(self::CACHE_KEY)) {
         return $cd->fetch(self::CACHE_KEY);
     }
     $co = new self();
     /** @var ClassMetadata $class */
     foreach ($mdf->getAllMetadata() as $class) {
         $co->classes[$class->name] = $class;
         foreach ($class->associationMappings as $assoc) {
             if (!isset($assoc['reference']) || !isset($assoc['targetDoc'])) {
                 continue;
             }
             /** @var ClassMetadata $dependency */
             $dependency = $mdf->getMetadataFor($assoc['targetDoc']);
             if (!$co->hasDependency($dependency, $class)) {
                 $co->addDependency($dependency, $class);
             }
             // If the target class has mapped subclasses, these share the same dependency.
             //                if ( ! $targetClass->subClasses) {
             //                    continue;
             //                }
             //
             //                foreach ($targetClass->subClasses as $subClassName) {
             //                    $targetSubClass = $this->dm->getClassMetadata($subClassName);
             //
             //                    if ( ! $calc->hasClass($subClassName)) {
             //                        $calc->addClass($targetSubClass);
             //
             //                        $newNodes[] = $targetSubClass;
             //                    }
             //
             //                    $calc->addDependency($targetSubClass, $class);
             //                }
         }
     }
     $ordered = $co->getCommitOrder();
     $cd->save(self::CACHE_KEY, $ordered);
     return $ordered;
 }