Completed
Push — master ( 77f170...166d1e )
by Arne
03:02
created

Index::isSubsetOf()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 21
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 21
rs 9.0534
c 0
b 0
f 0
cc 4
eloc 8
nc 4
nop 1
1
<?php
2
3
namespace Archivr;
4
5
use Archivr\Exception\Exception;
6
use Ramsey\Uuid\Uuid;
7
8
class Index implements \Countable, \IteratorAggregate
9
{
10
    /**
11
     * @var IndexObject[]
12
     */
13
    protected $pathMap = [];
14
15
    public function addObject(IndexObject $indexObject): Index
16
    {
17
        // ensure existence of containing directory
18
        if (substr_count($indexObject->getRelativePath(), DIRECTORY_SEPARATOR))
19
        {
20
            $parent = $this->getObjectByPath(dirname($indexObject->getRelativePath()));
21
22
            if ($parent === null)
23
            {
24
                throw new Exception();
25
            }
26
            elseif (!$parent->isDirectory())
27
            {
28
                throw new Exception();
29
            }
30
        }
31
32
        $this->pathMap[$indexObject->getRelativePath()] = $indexObject;
33
34
        return $this;
35
    }
36
37
    public function getObjectByPath(string $path)
38
    {
39
        return isset($this->pathMap[$path]) ? $this->pathMap[$path] : null;
40
    }
41
42
    public function getObjectByBlobId(string $blobId)
43
    {
44
        foreach ($this->pathMap as $object)
45
        {
46
            if ($object->getBlobId() === $blobId)
47
            {
48
                return $object;
49
            }
50
        }
51
52
        return null;
53
    }
54
55
    public function count(): int
56
    {
57
        return count($this->pathMap);
58
    }
59
60
    public function getIterator(): \Traversable
61
    {
62
        return new \ArrayIterator($this->pathMap);
63
    }
64
65
    public function generateNewBlobId(): string
66
    {
67
        do
68
        {
69
            $blobId = Uuid::uuid4()->toString();
70
        }
71
        while ($this->getObjectByBlobId($blobId) !== null);
72
73
        return $blobId;
74
    }
75
76
    public function equals(Index $other = null): bool
77
    {
78
        if ($other === null)
79
        {
80
            return false;
81
        }
82
83
        return $this->isSubsetOf($other) && $other->isSubsetOf($this);
84
    }
85
86
    public function isSubsetOf(Index $other): bool
87
    {
88
        foreach ($this as $indexObject)
89
        {
90
            /** @var IndexObject $indexObject */
91
92
            $otherIndexObject = $other->getObjectByPath($indexObject->getRelativePath());
93
94
            if ($otherIndexObject === null)
95
            {
96
                return false;
97
            }
98
99
            if (!$otherIndexObject->equals($indexObject))
100
            {
101
                return false;
102
            }
103
        }
104
105
        return true;
106
    }
107
}
108