protected function sortDependencies(array $dependencies)
    {
        if (\count($dependencies) <= 1) {
            return $dependencies;
        }

        try {
            $this->checkCircularDependencies();
        } catch (CircularProcessException $e) {
            // Skipping the sort phase, it will throw later, on runtime
            return $dependencies;
        }

        /** @var int $midOffset */
        $midOffset = \count($dependencies) / 2;
        $midTaskCode = $dependencies[$midOffset];
        $midTask = $this->getTaskConfiguration($midTaskCode);

        $previousTasks = [];
        $independentTasks = [];
        $nextTasks = [];

        foreach ($dependencies as $taskCode) {
            if ($taskCode !== $midTaskCode) {
                $task = $this->getTaskConfiguration($taskCode);

                if ($midTask->hasAncestor($task)) {
                    $previousTasks[] = $taskCode;
                } elseif ($midTask->hasDescendant($task)) {
                    $nextTasks[] = $taskCode;
                } else {
                    $independentTasks[] = $taskCode;
                }
            }
        }

        $previousTasks = $this->sortDependencies($previousTasks);
        $independentTasks = $this->sortDependencies($independentTasks);
        $nextTasks = $this->sortDependencies($nextTasks);

        return array_merge($previousTasks, [$midTaskCode], $independentTasks, $nextTasks);
    }
protected function sortDependencies(array $dependencies)
    {
        if (\count($dependencies) <= 1) {
            return $dependencies;
        }

        try {
            $this->checkCircularDependencies();
        } catch (CircularProcessException $e) {
            // Skipping the sort phase, it will throw later, on runtime
            return $dependencies;
        }

        /** @var int $midOffset */
        $midOffset = \count($dependencies) / 2;
        $midTaskCode = $dependencies[$midOffset];
        $midTask = $this->getTaskConfiguration($midTaskCode);

        $previousTasks = [];
        $independentTasks = [];
        $nextTasks = [];

        foreach ($dependencies as $taskCode) {
            if ($taskCode !== $midTaskCode) {
                $task = $this->getTaskConfiguration($taskCode);

                if ($midTask->hasAncestor($task)) {
                    $previousTasks[] = $taskCode;
                } elseif ($midTask->hasDescendant($task)) {
                    $nextTasks[] = $taskCode;
                } else {
                    $independentTasks[] = $taskCode;
                }
            }
        }

        $previousTasks = $this->sortDependencies($previousTasks);
        $independentTasks = $this->sortDependencies($independentTasks);
        $nextTasks = $this->sortDependencies($nextTasks);

        return array_merge($previousTasks, [$midTaskCode], $independentTasks, $nextTasks);
    }
protected function sortDependencies ( array $ dependencies ) { if ( \ count ( $ dependencies ) <= 1 ) { return $ dependencies ; } try { $ this -> checkCircularDependencies ( ) ; } catch ( CircularProcessException $ e ) { // Skipping the sort phase, it will throw later, on runtime return $ dependencies ; } /** @var int $midOffset */ $ midOffset = \ count ( $ dependencies ) / 2 ; $ midTaskCode = $ dependencies [ $ midOffset ] ; $ midTask = $ this -> getTaskConfiguration ( $ midTaskCode ) ; $ previousTasks = [ ] ; $ independentTasks = [ ] ; $ nextTasks = [ ] ; foreach ( $ dependencies as $ taskCode ) { if ( $ taskCode !== $ midTaskCode ) { $ task = $ this -> getTaskConfiguration ( $ taskCode ) ; if ( $ midTask -> hasAncestor ( $ task ) ) { $ previousTasks [ ] = $ taskCode ; } elseif ( $ midTask -> hasDescendant ( $ task ) ) { $ nextTasks [ ] = $ taskCode ; } else { $ independentTasks [ ] = $ taskCode ; } } } $ previousTasks = $ this -> sortDependencies ( $ previousTasks ) ; $ independentTasks = $ this -> sortDependencies ( $ independentTasks ) ; $ nextTasks = $ this -> sortDependencies ( $ nextTasks ) ; return array_merge ( $ previousTasks , [ $ midTaskCode ] , $ independentTasks , $ nextTasks ) ; }
Sort the tasks by dependencies

@param array $dependencies

@throws \CleverAge\ProcessBundle\Exception\MissingTaskConfigurationException

@return array
Sort the tasks by dependencies