Implemented draft for TreeSourceService

This commit is contained in:
Kevin Frantz
2018-11-16 20:44:54 +01:00
parent 2168eb2a1e
commit c993a1864c
5 changed files with 152 additions and 0 deletions

View File

@@ -0,0 +1,98 @@
<?php
namespace App\Domain\SourceManagement;
use App\Entity\Source\Collection\TreeCollectionSourceInterface;
use App\Entity\Source\Collection\TreeCollectionSource;
use Doctrine\Common\Collections\Collection;
use Doctrine\Common\Collections\ArrayCollection;
use App\Entity\Source\SourceInterface;
/**
*
* Allows to iterate over a tree
* @author kevinfrantz
* @todo Maybe lazy loading would be helpfull for performance
*/
class TreeSourceService extends AbstractSourceService implements TreeSourceServiceInterface
{
/**
* @var TreeCollectionSourceInterface
*/
private $source;
/**
* Containes all branches of the actual level of the tree
* @var Collection
*/
private $branches;
/**
* Containes all leaves of the actual level of the tree
* @var Collection
*/
private $leaves;
public function __construct(TreeCollectionSource $source){
$this->source = $source;
$this->branches = new ArrayCollection();
$this->leaves = new ArrayCollection();
}
private function sortMember(SourceInterface $member):bool{
if($member instanceof TreeCollectionSource){
return $this->branches->add($member);
}
return $this->leaves->add($member);
}
private function basicSort():void{
foreach($this->source->getCollection() as $member){
$this->sortMember($member);
}
}
public function getBranches(): Collection
{
return $this->branches;
}
/**
* @todo Remove the optional parameter and put the logic in a private funtion.
* @todo Remove the getAllBranches use inside the function.
* {@inheritDoc}
* @see \App\Domain\SourceManagement\TreeSourceServiceInterface::getAllBranches()
*/
public function getAllBranches(?ArrayCollection $excludedBranches=null): Collection
{
if(!$excludedBranches){
$excludedBranches = new ArrayCollection();
}
$branches = new ArrayCollection($this->branches->toArray());
foreach($this->branches->toArray() as $branch){
if(!$excludedBranches->contains($branch)){
foreach((new TreeSourceService($branch))->getAllBranches($excludedBranches) as $branchBranch){
$branches->add($branchBranch);
}
}
}
return $branches;
}
public function getLeaves(): Collection
{
return $this->leaves;
}
public function getAllLeaves(): Collection
{
$leaves = new ArrayCollection();
foreach ($this->getAllBranches()->toArray() as $branch){
foreach ((new TreeSourceService($branch))->getLeaves() as $leave){
if(!$leaves->contains($leave)){
$leaves->add($leave);
}
}
}
}
}