123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- <?php
-
-
- namespace Doctrine\ORM\Internal;
-
-
- class CommitOrderCalculator
- {
- const NOT_VISITED = 1;
- const IN_PROGRESS = 2;
- const VISITED = 3;
-
- private $_nodeStates = array();
- private $_classes = array();
- private $_relatedClasses = array();
- private $_sorted = array();
-
-
-
- public function clear()
- {
- $this->_classes =
- $this->_relatedClasses = array();
- }
-
-
-
- public function getCommitOrder()
- {
-
- $nodeCount = count($this->_classes);
- if ($nodeCount == 0) {
- return array();
- } else if ($nodeCount == 1) {
- return array_values($this->_classes);
- }
-
-
- foreach ($this->_classes as $node) {
- $this->_nodeStates[$node->name] = self::NOT_VISITED;
- }
-
-
- foreach ($this->_classes as $node) {
- if ($this->_nodeStates[$node->name] == self::NOT_VISITED) {
- $this->_visitNode($node);
- }
- }
-
- $sorted = array_reverse($this->_sorted);
-
- $this->_sorted = $this->_nodeStates = array();
-
- return $sorted;
- }
-
- private function _visitNode($node)
- {
- $this->_nodeStates[$node->name] = self::IN_PROGRESS;
-
- if (isset($this->_relatedClasses[$node->name])) {
- foreach ($this->_relatedClasses[$node->name] as $relatedNode) {
- if ($this->_nodeStates[$relatedNode->name] == self::NOT_VISITED) {
- $this->_visitNode($relatedNode);
- }
- }
- }
-
- $this->_nodeStates[$node->name] = self::VISITED;
- $this->_sorted[] = $node;
- }
-
- public function addDependency($fromClass, $toClass)
- {
- $this->_relatedClasses[$fromClass->name][] = $toClass;
- }
-
- public function hasClass($className)
- {
- return isset($this->_classes[$className]);
- }
-
- public function addClass($class)
- {
- $this->_classes[$class->name] = $class;
- }
- }
|