Passed
Push — feature/initial-implementation ( 77fab8...e556a2 )
by Fike
01:48
created

TypeEnum::initialize()   B

Complexity

Conditions 6
Paths 13

Size

Total Lines 18
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 18
c 0
b 0
f 0
rs 8.8571
cc 6
eloc 11
nc 13
nop 0
1
<?php
2
3
namespace AmaTeam\ElasticSearch\Mapping;
4
5
use BadMethodCallException;
6
7
class TypeEnum
8
{
9
    /**
10
     * @var string[][]
11
     */
12
    private static $parameters = [];
13
    /**
14
     * @var bool
15
     */
16
    private static $initialized = false;
17
18
    private static function initialize(): void
19
    {
20
        if (self::$initialized) {
21
            return;
22
        }
23
        foreach (self::INVERTED_INDEX as $type => $constant) {
24
            $name = sprintf('%s::%s_PARAMETERS', TypeEnum::class, $constant);
25
            if (defined($name)) {
26
                self::$parameters[$type] = constant($name);
27
            }
28
        }
29
        foreach (self::RANGE as $type) {
30
            self::$parameters[$type] = self::RANGE_PARAMETERS;
31
        }
32
        foreach (self::NUMERIC as $type) {
33
            self::$parameters[$type] = self::NUMERIC_PARAMETERS;
34
        }
35
        self::$initialized = true;
36
    }
37
38
    /**
39
     * Returns names of specific type parameters
40
     *
41
     * @param string $type
42
     * @return string[]
43
     */
44
    public static function getParameters(string $type): array
45
    {
46
        self::initialize();
47
        if (isset(self::$parameters[$type])) {
48
            return self::$parameters[$type];
49
        }
50
        throw new BadMethodCallException("Unknown mapping type `$type`");
51
    }
52
53
    const INVERTED_INDEX = [
54
        self::ROOT => 'ROOT',
55
        self::BINARY => 'BINARY',
56
        self::INTEGER_RANGE => 'INTEGER_RANGE',
57
        self::LONG_RANGE => 'LONG_RANGE',
58
        self::FLOAT_RANGE => 'FLOAT_RANGE',
59
        self::DOUBLE_RANGE => 'DOUBLE_RANGE',
60
        self::DATE_RANGE => 'DATE_RANGE',
61
        self::IP_RANGE => 'IP_RANGE',
62
        self::BOOLEAN => 'BOOLEAN',
63
        self::DATE => 'DATE',
64
        self::GEO_POINT => 'GEO_POINT',
65
        self::GEO_SHAPE => 'GEO_SHAPE',
66
        self::IP => 'IP',
67
        self::KEYWORD => 'KEYWORD',
68
        self::NESTED => 'NESTED',
69
        self::SHORT => 'SHORT',
70
        self::INTEGER => 'INTEGER',
71
        self::LONG => 'LONG',
72
        self::HALF_FLOAT => 'HALF_FLOAT',
73
        self::FLOAT => 'FLOAT',
74
        self::DOUBLE => 'DOUBLE',
75
        self::SCALED_FLOAT => 'SCALED_FLOAT',
76
        self::OBJECT => 'OBJECT',
77
        self::TEXT => 'TEXT',
78
        self::TOKEN_COUNT => 'TOKEN_COUNT',
79
        self::PERCOLATOR => 'PERCOLATOR',
80
        self::JOIN => 'JOIN'
81
    ];
82
83
    const NUMERIC = [
84
        self::SHORT,
85
        self::INTEGER,
86
        self::LONG,
87
        self::HALF_FLOAT,
88
        self::FLOAT,
89
        self::DOUBLE,
90
        self::SCALED_FLOAT,
91
    ];
92
93
    const RANGE = [
94
        self::INTEGER_RANGE,
95
        self::LONG_RANGE,
96
        self::FLOAT_RANGE,
97
        self::DOUBLE_RANGE,
98
        self::DATE_RANGE,
99
        self::IP_RANGE,
100
    ];
101
102
    const ROOT = 'root';
103
    const ROOT_PARAMETERS = [
104
        ParameterEnum::DYNAMIC,
105
        ParameterEnum::ENABLED,
106
        ParameterEnum::PROPERTIES,
107
        ParameterEnum::SOURCE
108
    ];
109
110
    const BINARY = 'binary';
111
    const BINARY_PARAMETERS = [ParameterEnum::DOC_VALUES, ParameterEnum::STORE];
112
113
    const INTEGER_RANGE = 'integer_range';
114
    const LONG_RANGE = 'long_range';
115
    const FLOAT_RANGE = 'float_range';
116
    const DOUBLE_RANGE = 'double_range';
117
    const DATE_RANGE = 'date_range';
118
    const IP_RANGE = 'ip_range';
119
    const RANGE_PARAMETERS = [ParameterEnum::INDEX, ParameterEnum::STORE, ParameterEnum::COERCE];
120
121
    const BOOLEAN = 'boolean';
122
    const BOOLEAN_PARAMETERS = [
123
        ParameterEnum::DOC_VALUES,
124
        ParameterEnum::INDEX,
125
        ParameterEnum::NULL_VALUE,
126
        ParameterEnum::STORE
127
    ];
128
129
    const DATE = 'date';
130
    const DATE_PARAMETERS = [
131
        ParameterEnum::DOC_VALUES,
132
        ParameterEnum::FORMAT,
133
        ParameterEnum::LOCALE,
134
        ParameterEnum::IGNORE_MALFORMED,
135
        ParameterEnum::INDEX,
136
        ParameterEnum::NULL_VALUE,
137
        ParameterEnum::STORE
138
    ];
139
140
    const GEO_POINT = 'geoPoint';
141
    const GEO_POINT_PARAMETERS = [ParameterEnum::IGNORE_MALFORMED];
142
143
    const GEO_SHAPE = 'geoShape';
144
    // TODO: add geo shape fields
145
    const GEO_SHAPE_PARAMETERS = [];
146
147
    const IP = 'ip';
148
    const IP_PARAMETERS = [
149
        ParameterEnum::DOC_VALUES,
150
        ParameterEnum::INDEX,
151
        ParameterEnum::NULL_VALUE,
152
        ParameterEnum::STORE
153
    ];
154
155
    const KEYWORD = 'keyword';
156
    const KEYWORD_PARAMETERS = [
157
        ParameterEnum::DOC_VALUES,
158
        ParameterEnum::EAGER_GLOBAL_ORDINALS,
159
        // TODO: add `fields` field
160
        ParameterEnum::IGNORE_ABOVE,
161
        ParameterEnum::INDEX,
162
        ParameterEnum::INDEX_OPTIONS,
163
        ParameterEnum::NORMS,
164
        ParameterEnum::NULL_VALUE,
165
        ParameterEnum::STORE,
166
        ParameterEnum::SIMILARITY,
167
        ParameterEnum::NORMALIZER,
168
    ];
169
170
    const NESTED = 'nested';
171
    const NESTED_PARAMETERS = [
172
        ParameterEnum::DYNAMIC,
173
        ParameterEnum::PROPERTIES
174
    ];
175
176
    const LONG = 'long';
177
    const INTEGER = 'integer';
178
    const SHORT = 'short';
179
    const BYTE = 'byte';
180
    const DOUBLE = 'double';
181
    const FLOAT = 'float';
182
    const HALF_FLOAT = 'halfFloat';
183
    const SCALED_FLOAT = 'scaledFloat';
184
    const NUMERIC_PARAMETERS = [
185
        ParameterEnum::COERCE,
186
        ParameterEnum::DOC_VALUES,
187
        ParameterEnum::IGNORE_MALFORMED,
188
        ParameterEnum::INDEX,
189
        ParameterEnum::NULL_VALUE,
190
        ParameterEnum::STORE
191
        // TODO: add scaling_factor for scaled_float
192
    ];
193
194
    const OBJECT = 'object';
195
    const OBJECT_PARAMETERS = [
196
        ParameterEnum::DYNAMIC,
197
        ParameterEnum::ENABLED,
198
        ParameterEnum::PROPERTIES
199
    ];
200
201
    const TEXT = 'text';
202
    const TEXT_PARAMETERS = [
203
        ParameterEnum::ANALYZER,
204
        ParameterEnum::EAGER_GLOBAL_ORDINALS,
205
        ParameterEnum::FIELD_DATA,
206
        // TODO: fielddata_frequency_filter
207
        // TODO: fields
208
        ParameterEnum::INDEX,
209
        ParameterEnum::INDEX_OPTIONS,
210
        ParameterEnum::NORMS,
211
        ParameterEnum::POSITION_INCREMENT_GAP,
212
        ParameterEnum::STORE,
213
        ParameterEnum::SEARCH_ANALYZER,
214
        // TODO: search_quote_analyzer
215
        ParameterEnum::SIMILARITY,
216
        ParameterEnum::TERM_VECTOR
217
    ];
218
    
219
    const TOKEN_COUNT = 'tokenCount';
220
    const TOKEN_COUNT_PARAMETERS = [
221
        ParameterEnum::ANALYZER,
222
        // TODO: enable_position_increments
223
        ParameterEnum::DOC_VALUES,
224
        ParameterEnum::INDEX,
225
        ParameterEnum::NULL_VALUE,
226
        ParameterEnum::STORE,
227
    ];
228
229
    const PERCOLATOR = 'percolator';
230
    const PERCOLATOR_PARAMETERS = [];
231
232
    const JOIN = 'join';
233
    const JOIN_PARAMETERS = [ParameterEnum::RELATIONS];
234
}
235