Passed
Push — feature/initial-implementation ( 69714c...aa3ce7 )
by Fike
02:16
created

Registry::getInstance()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 6
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 3
nc 2
nop 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace AmaTeam\ElasticSearch\Mapping\Type\Parameter\Infrastructure;
6
7
use AmaTeam\ElasticSearch\API\Mapping\Type\ParameterInterface;
8
use AmaTeam\ElasticSearch\Mapping\Type\Parameter\AnalyzerParameter;
9
use AmaTeam\ElasticSearch\Mapping\Type\Parameter\CoerceParameter;
10
use AmaTeam\ElasticSearch\Mapping\Type\Parameter\CopyToParameter;
11
use AmaTeam\ElasticSearch\Mapping\Type\Parameter\DistanceErrorPctParameter;
12
use AmaTeam\ElasticSearch\Mapping\Type\Parameter\DocValuesParameter;
13
use AmaTeam\ElasticSearch\Mapping\Type\Parameter\DynamicParameter;
14
use AmaTeam\ElasticSearch\Mapping\Type\Parameter\EagerGlobalOrdinalsParameter;
15
use AmaTeam\ElasticSearch\Mapping\Type\Parameter\EnabledParameter;
16
use AmaTeam\ElasticSearch\Mapping\Type\Parameter\EnablePositionIncrementsParameter;
17
use AmaTeam\ElasticSearch\Mapping\Type\Parameter\FieldDataFrequencyFilterParameter;
18
use AmaTeam\ElasticSearch\Mapping\Type\Parameter\FieldDataParameter;
19
use AmaTeam\ElasticSearch\Mapping\Type\Parameter\FieldsParameter;
20
use AmaTeam\ElasticSearch\Mapping\Type\Parameter\FormatParameter;
21
use AmaTeam\ElasticSearch\Mapping\Type\Parameter\IgnoreAboveParameter;
22
use AmaTeam\ElasticSearch\Mapping\Type\Parameter\IgnoreMalformedParameter;
23
use AmaTeam\ElasticSearch\Mapping\Type\Parameter\IndexOptionsParameter;
24
use AmaTeam\ElasticSearch\Mapping\Type\Parameter\IndexParameter;
25
use AmaTeam\ElasticSearch\Mapping\Type\Parameter\LocaleParameter;
26
use AmaTeam\ElasticSearch\Mapping\Type\Parameter\NormalizerParameter;
27
use AmaTeam\ElasticSearch\Mapping\Type\Parameter\NormsParameter;
28
use AmaTeam\ElasticSearch\Mapping\Type\Parameter\NullValueParameter;
29
use AmaTeam\ElasticSearch\Mapping\Type\Parameter\OrientationParameter;
30
use AmaTeam\ElasticSearch\Mapping\Type\Parameter\PointsOnlyParameter;
31
use AmaTeam\ElasticSearch\Mapping\Type\Parameter\PositionIncrementGapParameter;
32
use AmaTeam\ElasticSearch\Mapping\Type\Parameter\PrecisionParameter;
33
use AmaTeam\ElasticSearch\Mapping\Type\Parameter\PropertiesParameter;
34
use AmaTeam\ElasticSearch\Mapping\Type\Parameter\RelationsParameter;
35
use AmaTeam\ElasticSearch\Mapping\Type\Parameter\ScalingFactorParameter;
36
use AmaTeam\ElasticSearch\Mapping\Type\Parameter\SearchAnalyzerParameter;
37
use AmaTeam\ElasticSearch\Mapping\Type\Parameter\SearchQuoteAnalyzerParameter;
38
use AmaTeam\ElasticSearch\Mapping\Type\Parameter\SimilarityParameter;
39
use AmaTeam\ElasticSearch\Mapping\Type\Parameter\SourceParameter;
40
use AmaTeam\ElasticSearch\Mapping\Type\Parameter\StoreParameter;
41
use AmaTeam\ElasticSearch\Mapping\Type\Parameter\StrategyParameter;
42
use AmaTeam\ElasticSearch\Mapping\Type\Parameter\TermVectorParameter;
43
use AmaTeam\ElasticSearch\Mapping\Type\Parameter\TreeLevelsParameter;
44
use AmaTeam\ElasticSearch\Mapping\Type\Parameter\TreeParameter;
45
46
/**
47
 * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
48
 */
49
class Registry
50
{
51
    /**
52
     * @var ParameterInterface[]
53
     */
54
    private $idIndex = [];
55
    /**
56
     * @var ParameterInterface[]
57
     */
58
    private $friendlyIdIndex = [];
59
60
    public function register(ParameterInterface $parameter): Registry
61
    {
62
        $this->idIndex[$parameter->getId()] = $parameter;
63
        $this->friendlyIdIndex[$parameter->getFriendlyId()] = $parameter;
64
        return $this;
65
    }
66
67
    public function getAll()
68
    {
69
        return array_values($this->idIndex);
70
    }
71
72
    public function find(string $id): ?ParameterInterface
73
    {
74
        if (isset($this->idIndex[$id])) {
75
            return $this->idIndex[$id];
76
        }
77
        if (isset($this->friendlyIdIndex[$id])) {
78
            return $this->friendlyIdIndex[$id];
79
        }
80
        return null;
81
    }
82
83
    public function withDefaultParameters(): Registry
84
    {
85
        // TODO: use code generation
86
        /** @var ParameterInterface[] $parameters */
87
        $parameters = [
88
            AnalyzerParameter::getInstance(),
89
            CoerceParameter::getInstance(),
90
            CopyToParameter::getInstance(),
91
            DocValuesParameter::getInstance(),
92
            DynamicParameter::getInstance(),
93
            EagerGlobalOrdinalsParameter::getInstance(),
94
            EnabledParameter::getInstance(),
95
            EnablePositionIncrementsParameter::getInstance(),
96
            FieldDataFrequencyFilterParameter::getInstance(),
97
            FieldDataParameter::getInstance(),
98
            FieldsParameter::getInstance(),
99
            FormatParameter::getInstance(),
100
            IgnoreAboveParameter::getInstance(),
101
            IgnoreMalformedParameter::getInstance(),
102
            IndexOptionsParameter::getInstance(),
103
            IndexParameter::getInstance(),
104
            LocaleParameter::getInstance(),
105
            NormalizerParameter::getInstance(),
106
            NormsParameter::getInstance(),
107
            NullValueParameter::getInstance(),
108
            PositionIncrementGapParameter::getInstance(),
109
            PropertiesParameter::getInstance(),
110
            RelationsParameter::getInstance(),
111
            ScalingFactorParameter::getInstance(),
112
            SearchAnalyzerParameter::getInstance(),
113
            SearchQuoteAnalyzerParameter::getInstance(),
114
            SimilarityParameter::getInstance(),
115
            SourceParameter::getInstance(),
116
            StoreParameter::getInstance(),
117
            TermVectorParameter::getInstance(),
118
            DistanceErrorPctParameter::getInstance(),
119
            OrientationParameter::getInstance(),
120
            PointsOnlyParameter::getInstance(),
121
            PrecisionParameter::getInstance(),
122
            StrategyParameter::getInstance(),
123
            TreeParameter::getInstance(),
124
            TreeLevelsParameter::getInstance(),
125
        ];
126
        foreach ($parameters as $parameter) {
127
            $this->register($parameter);
128
        }
129
        return $this;
130
    }
131
132
    public static function createDefault(): Registry
133
    {
134
        return (new Registry())->withDefaultParameters();
135
    }
136
137
    private static $instance;
138
139
    public static function getInstance(): Registry
140
    {
141
        if (!isset(static::$instance)) {
0 ignored issues
show
Bug introduced by
Since $instance is declared private, accessing it with static will lead to errors in possible sub-classes; you can either use self, or increase the visibility of $instance to at least protected.
Loading history...
142
            static::$instance = static::createDefault();
143
        }
144
        return static::$instance;
145
    }
146
}
147