BaseLineResultsComparator   A
last analyzed

Complexity

Total Complexity 8

Size/Duplication

Total Lines 49
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 8
eloc 17
dl 0
loc 49
rs 10
c 1
b 0
f 0

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 11 3
A isInBaseLine() 0 21 5
1
<?php
2
3
/**
4
 * Static Analysis Results Baseliner (sarb).
5
 *
6
 * (c) Dave Liddament
7
 *
8
 * For the full copyright and licence information please view the LICENSE file distributed with this source code.
9
 */
10
11
declare(strict_types=1);
12
13
namespace DaveLiddament\StaticAnalysisResultsBaseliner\Domain\Analyser\internal;
14
15
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\BaseLiner\BaseLineAnalysisResult;
16
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\BaseLiner\BaseLineAnalysisResults;
17
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\Common\Location;
18
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\Common\PreviousLocation;
19
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\Common\Type;
20
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\ResultsParser\AnalysisResult;
21
22
/**
23
 * Checks if an AnalysisResult is in the baseline set of results.
24
 */
25
final class BaseLineResultsComparator
26
{
27
    /**
28
     * Stores base line results. With file name as key.
29
     *
30
     * @var array
31
     *
32
     * @psalm-var array<string, array<int,BaseLineAnalysisResult>>
33
     */
34
    private $baseLine;
35
36
    public function __construct(BaseLineAnalysisResults $baseLineAnalysisResults)
37
    {
38
        $this->baseLine = [];
39
40
        // For performance reasons put results into an array with the file name as the key
41
        foreach ($baseLineAnalysisResults->getBaseLineAnalysisResults() as $baseLineAnalysisResult) {
42
            $fileNameAsString = $baseLineAnalysisResult->getFileName()->getFileName();
43
            if (!array_key_exists($fileNameAsString, $this->baseLine)) {
44
                $this->baseLine[$fileNameAsString] = [];
45
            }
46
            $this->baseLine[$fileNameAsString][] = $baseLineAnalysisResult;
47
        }
48
    }
49
50
    /**
51
     * Returns true if an AnalysisResult of the same Type and Location exists in the BaseLine.
52
     */
53
    public function isInBaseLine(PreviousLocation $previousLocation, Type $type): bool
54
    {
55
        // Analysis result refers to a Location not in the BaseLine, then this is not an historic analysis result.
56
        if ($previousLocation->isNoPreviousLocation()) {
57
            return false;
58
        }
59
60
        // Now check through to history AnalysisResults to see if there is an exact match.
61
        // Check if file is in baseline
62
        $fileNameAsString = $previousLocation->getRelativeFileName()->getFileName();
63
        if (!array_key_exists($fileNameAsString, $this->baseLine)) {
64
            return false;
65
        }
66
67
        foreach ($this->baseLine[$fileNameAsString] as $baseLineResult) {
68
            if ($baseLineResult->isMatch($previousLocation, $type)) {
69
                return true;
70
            }
71
        }
72
73
        return false;
74
    }
75
}
76