GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Completed
Push — master ( 647edc...edf045 )
by joseph
18s queued 16s
created

MappingHelper   B

Complexity

Total Complexity 37

Size/Duplication

Total Lines 473
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 37
dl 0
loc 473
ccs 140
cts 140
cp 1
rs 8.6
c 0
b 0
f 0

14 Methods

Rating   Name   Duplication   Size   Complexity  
A getSingularForFqn() 0 5 1
A backticks() 0 3 1
A getTableNameForEntityFqn() 0 14 2
A getPluralForFqn() 0 5 1
A getColumnNameForField() 0 3 1
A getShortNameForFqn() 0 3 1
B setSimpleTextFields() 0 23 4
B setSimpleIntegerFields() 0 26 4
B setSimpleStringFields() 0 30 4
B setSimpleBooleanFields() 0 24 4
B setSimpleFloatFields() 0 26 4
B setSimpleDecimalFields() 0 26 4
A setSimpleFields() 0 5 2
B setSimpleDatetimeFields() 0 28 4
1
<?php declare(strict_types=1);
2
3
namespace EdmondsCommerce\DoctrineStaticMeta;
4
5
use Doctrine\Common\Util\Inflector;
6
use Doctrine\DBAL\Types\Type;
7
use Doctrine\ORM\Mapping\Builder\ClassMetadataBuilder;
8
use Doctrine\ORM\Mapping\Builder\FieldBuilder;
9
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\NamespaceHelper;
10
use EdmondsCommerce\DoctrineStaticMeta\Schema\Database;
11
12
/**
13
 * Class MappingHelper
14
 *
15
 * Helper functions to assist with setting up Doctrine mapping meta data
16
 *
17
 * @package EdmondsCommerce\DoctrineStaticMeta
18
 *
19
 * @SuppressWarnings(PHPMD.StaticAccess)
20
 */
21
class MappingHelper
22
{
23
24
    /**
25
     * @see https://stackoverflow.com/a/34275878
26
     */
27
    public const DATETIME_DEFAULT_CURRENT_TIME_STAMP = 0;
28
29
    /**
30
     * Quick accessors for common types that are supported by methods in this helper
31
     */
32
    public const TYPE_STRING   = Type::STRING;
33
    public const TYPE_DATETIME = Type::DATETIME;
34
    public const TYPE_FLOAT    = Type::FLOAT;
35
    public const TYPE_DECIMAL  = Type::DECIMAL;
36
    public const TYPE_INTEGER  = Type::INTEGER;
37
    public const TYPE_TEXT     = Type::TEXT;
38
    public const TYPE_BOOLEAN  = Type::BOOLEAN;
39
40
    /**
41
     * This is the list of common types, listed above
42
     */
43
    public const COMMON_TYPES = [
44
        self::TYPE_STRING,
45
        self::TYPE_DATETIME,
46
        self::TYPE_FLOAT,
47
        self::TYPE_DECIMAL,
48
        self::TYPE_INTEGER,
49
        self::TYPE_TEXT,
50
        self::TYPE_BOOLEAN,
51
    ];
52
53
    /**
54
     * Which types do we support marking as unique
55
     */
56
    public const UNIQUEABLE_TYPES = [
57
        self::TYPE_STRING,
58
        self::TYPE_INTEGER,
59
    ];
60
61
    public const PHP_TYPE_STRING   = 'string';
62
    public const PHP_TYPE_DATETIME = '\\'.\DateTime::class;
63
    public const PHP_TYPE_FLOAT    = 'float';
64
    public const PHP_TYPE_DECIMAL  = 'string';
65
    public const PHP_TYPE_INTEGER  = 'int';
66
    public const PHP_TYPE_TEXT     = 'string';
67
    public const PHP_TYPE_BOOLEAN  = 'bool';
68
69
    public const PHP_TYPES = [
70
        self::PHP_TYPE_STRING,
71
        self::PHP_TYPE_DATETIME,
72
        self::PHP_TYPE_FLOAT,
73
        self::PHP_TYPE_DECIMAL,
74
        self::PHP_TYPE_INTEGER,
75
        self::PHP_TYPE_TEXT,
76
        self::PHP_TYPE_BOOLEAN,
77
    ];
78
79
    /**
80
     * The PHP type associated with the mapping type
81
     */
82
    public const COMMON_TYPES_TO_PHP_TYPES = [
83
        self::TYPE_STRING   => self::PHP_TYPE_STRING,
84
        self::TYPE_DATETIME => self::PHP_TYPE_DATETIME,
85
        self::TYPE_FLOAT    => self::PHP_TYPE_FLOAT,
86
        self::TYPE_DECIMAL  => self::PHP_TYPE_DECIMAL,
87
        self::TYPE_INTEGER  => self::PHP_TYPE_INTEGER,
88
        self::TYPE_TEXT     => self::PHP_TYPE_TEXT,
89
        self::TYPE_BOOLEAN  => self::PHP_TYPE_BOOLEAN,
90
    ];
91
92
    /**
93
     * This is the full list of mapping types
94
     *
95
     * @see \Doctrine\DBAL\Types\Type
96
     */
97
    public const ALL_DBAL_TYPES = [
98
        Type::TARRAY,
99
        Type::SIMPLE_ARRAY,
100
        Type::JSON,
101
        Type::BIGINT,
102
        Type::BOOLEAN,
103
        Type::DATETIME,
104
        Type::DATETIME_IMMUTABLE,
105
        Type::DATETIMETZ,
106
        Type::DATETIMETZ_IMMUTABLE,
107
        Type::DATE,
108
        Type::DATE_IMMUTABLE,
109
        Type::TIME,
110
        Type::TIME_IMMUTABLE,
111
        Type::DECIMAL,
112
        Type::INTEGER,
113
        Type::OBJECT,
114
        Type::SMALLINT,
115
        Type::STRING,
116
        Type::TEXT,
117
        Type::BINARY,
118
        Type::BLOB,
119
        Type::FLOAT,
120
        Type::GUID,
121
        Type::DATEINTERVAL,
122
    ];
123
124
    public const MIXED_TYPES = [
125
        // Doctrine hydrates decimal values as strings.
126
        // However, setting these using an int or float is also valid.
127
        Type::DECIMAL,
128
    ];
129
130
    /**
131
     * @param string $entityFqn
132
     *
133
     * @return string
134
     */
135 89
    public static function getPluralForFqn(string $entityFqn): string
136
    {
137 89
        $singular = self::getSingularForFqn($entityFqn);
138
139 89
        return Inflector::pluralize($singular);
140
    }
141
142
    /**
143
     * @param string $entityFqn
144
     *
145
     * @return string
146
     */
147 89
    public static function getSingularForFqn(string $entityFqn): string
148
    {
149 89
        $shortName = self::getShortNameForFqn($entityFqn);
150
151 89
        return lcfirst(Inflector::singularize($shortName));
152
    }
153
154
    /**
155
     * @param string $entityFqn
156
     *
157
     * @return string
158
     */
159 89
    public static function getShortNameForFqn(string $entityFqn): string
160
    {
161 89
        return substr($entityFqn, strrpos($entityFqn, '\\') + 1);
162
    }
163
164
    /**
165
     * Get the properly backticked and formatted column name for a field
166
     *
167
     * @param string $field
168
     *
169
     * @return string
170
     */
171 16
    public static function getColumnNameForField(string $field): string
172
    {
173 16
        return self::backticks(Inflector::tableize($field));
174
    }
175
176
    /**
177
     * @param string $entityFqn
178
     *
179
     * @return string
180
     */
181 25
    public static function getTableNameForEntityFqn(
182
        string $entityFqn
183
    ): string {
184 25
        $namespaceHelper = new NamespaceHelper();
185 25
        $subFqn          = $namespaceHelper->getEntitySubNamespace(
186 25
            $entityFqn
187
        );
188 25
        $tableName       = \str_replace('\\', '', $subFqn);
189 25
        $tableName       = self::backticks(Inflector::tableize($tableName));
190 25
        if (\strlen($tableName) > Database::MAX_IDENTIFIER_LENGTH) {
191 1
            $tableName = substr($tableName, -Database::MAX_IDENTIFIER_LENGTH);
192
        }
193
194 25
        return $tableName;
195
    }
196
197
    /**
198
     * Wrap the name in backticks
199
     *
200
     * @param string $name
201
     *
202
     * @return string
203
     */
204 26
    public static function backticks(string $name): string
205
    {
206 26
        return '`'.$name.'`';
207
    }
208
209
    /**
210
     * Set bog standard string fields quickly in bulk
211
     *
212
     * @param array                $fields
213
     * @param ClassMetadataBuilder $builder
214
     * @param mixed                $default
215
     * @param bool                 $isUnique
216
     * In this case the boolean argument is simply data
217
     * @SuppressWarnings(PHPMD.BooleanArgumentFlag)
218
     */
219 7
    public static function setSimpleStringFields(
220
        array $fields,
221
        ClassMetadataBuilder $builder,
222
        $default = null,
223
        bool $isUnique = false
224
    ): void {
225 7
        if (null !== $default && !\is_string($default)) {
226 1
            throw new \InvalidArgumentException(
227 1
                'Invalid default value '.$default
228 1
                .' with type '.gettype($default)
229
            );
230
        }
231 6
        foreach ($fields as $field) {
232 6
            $fieldBuilder = new FieldBuilder(
233 6
                $builder,
234
                [
235 6
                    'fieldName' => $field,
236 6
                    'type'      => Type::STRING,
237 6
                    'default'   => $default,
238
                ]
239
            );
240
            $fieldBuilder
241 6
                ->columnName(self::getColumnNameForField($field))
242 6
                ->nullable(null === $default)
243 6
                ->unique($isUnique)
244
                // see https://github.com/symfony/symfony-docs/issues/639
245
                // basically, if we are using utf8mb4 then the max col
246
                // length on strings is no longer 255.
247 6
                ->length(190)
248 6
                ->build();
249
        }
250 6
    }
251
252
    /**
253
     * Set bog standard text fields quickly in bulk
254
     *
255
     * @param array                $fields
256
     * @param ClassMetadataBuilder $builder
257
     * @param mixed                $default
258
     * In this case the boolean argument is simply data
259
     * @SuppressWarnings(PHPMD.BooleanArgumentFlag)
260
     */
261 3
    public static function setSimpleTextFields(
262
        array $fields,
263
        ClassMetadataBuilder $builder,
264
        $default = null
265
    ): void {
266 3
        if (null !== $default && !\is_string($default)) {
267 1
            throw new \InvalidArgumentException(
268 1
                'Invalid default value '.$default
269 1
                .' with type '.gettype($default)
270
            );
271
        }
272 2
        foreach ($fields as $field) {
273 2
            $fieldBuilder = new FieldBuilder(
274 2
                $builder,
275
                [
276 2
                    'fieldName' => $field,
277 2
                    'type'      => Type::TEXT,
278 2
                    'default'   => $default,
279
                ]
280
            );
281 2
            $fieldBuilder->columnName(self::getColumnNameForField($field))
282 2
                         ->nullable(null === $default)
283 2
                         ->build();
284
        }
285 2
    }
286
287
288
    /**
289
     * Set bog standard float fields quickly in bulk
290
     *
291
     * @param array                $fields
292
     * @param ClassMetadataBuilder $builder
293
     * @param mixed                $default
294
     * In this case the boolean argument is simply data
295
     * @SuppressWarnings(PHPMD.BooleanArgumentFlag)
296
     */
297 3
    public static function setSimpleFloatFields(
298
        array $fields,
299
        ClassMetadataBuilder $builder,
300
        $default = null
301
    ): void {
302 3
        if (null !== $default && !\is_float($default)) {
303 1
            throw new \InvalidArgumentException(
304 1
                'Invalid default value '.$default
305 1
                .' with type '.gettype($default)
306
            );
307
        }
308 2
        foreach ($fields as $field) {
309 2
            $fieldBuilder = new FieldBuilder(
310 2
                $builder,
311
                [
312 2
                    'fieldName' => $field,
313 2
                    'type'      => Type::FLOAT,
314 2
                    'default'   => $default,
315
                ]
316
            );
317
            $fieldBuilder
318 2
                ->columnName(self::getColumnNameForField($field))
319 2
                ->nullable(null === $default)
320 2
                ->precision(15)
321 2
                ->scale(2)
322 2
                ->build();
323
        }
324 2
    }
325
326
    /**
327
     * Set bog standard decimal fields quickly in bulk
328
     *
329
     * @param array                $fields
330
     * @param ClassMetadataBuilder $builder
331
     * @param mixed                $default
332
     * In this case the boolean argument is simply data
333
     * @SuppressWarnings(PHPMD.BooleanArgumentFlag)
334
     */
335 4
    public static function setSimpleDecimalFields(
336
        array $fields,
337
        ClassMetadataBuilder $builder,
338
        $default = null
339
    ): void {
340 4
        if (null !== $default && !\is_float($default)) {
341 1
            throw new \InvalidArgumentException(
342 1
                'Invalid default value '.$default
343 1
                .' with type '.gettype($default)
344
            );
345
        }
346 3
        foreach ($fields as $field) {
347 3
            $fieldBuilder = new FieldBuilder(
348 3
                $builder,
349
                [
350 3
                    'fieldName' => $field,
351 3
                    'type'      => Type::DECIMAL,
352 3
                    'default'   => $default,
353
                ]
354
            );
355
            $fieldBuilder
356 3
                ->columnName(self::getColumnNameForField($field))
357 3
                ->nullable(null === $default)
358 3
                ->precision(18)
359 3
                ->scale(12)
360 3
                ->build();
361
        }
362 3
    }
363
364
    /**
365
     * Set bog standard dateTime fields quickly in bulk
366
     *
367
     * @param array                $fields
368
     * @param ClassMetadataBuilder $builder
369
     * @param mixed                $default
370
     * In this case the boolean argument is simply data
371
     * @SuppressWarnings(PHPMD.BooleanArgumentFlag)
372
     */
373 8
    public static function setSimpleDatetimeFields(
374
        array $fields,
375
        ClassMetadataBuilder $builder,
376
        $default = null
377
    ): void {
378 8
        if (null !== $default
379 8
            && self::DATETIME_DEFAULT_CURRENT_TIME_STAMP !== $default
380
        ) {
381 1
            throw new \InvalidArgumentException(
382 1
                'Invalid default '.$default
383 1
                .' This must be one of:'
384 1
                ."\n - null"
385 1
                ."\n - \EdmondsCommerce\DoctrineStaticMeta\MappingHelper::DATETIME_DEFAULT_CURRENT_TIME_STAMP"
386
            );
387
        }
388 7
        foreach ($fields as $field) {
389 7
            $fieldBuilder = new FieldBuilder(
390 7
                $builder,
391
                [
392 7
                    'fieldName' => $field,
393 7
                    'type'      => Type::DATETIME,
394 7
                    'default'   => $default,
395
                ]
396
            );
397
            $fieldBuilder
398 7
                ->columnName(self::getColumnNameForField($field))
399 7
                ->nullable(null === $default)
400 7
                ->build();
401
        }
402 7
    }
403
404
    /**
405
     * Set bog standard integer fields quickly in bulk
406
     *
407
     * @param array                $fields
408
     * @param ClassMetadataBuilder $builder
409
     * @param mixed                $default
410
     * @param bool                 $isUnique
411
     * In this case the boolean argument is simply data
412
     * @SuppressWarnings(PHPMD.BooleanArgumentFlag)
413
     */
414 4
    public static function setSimpleIntegerFields(
415
        array $fields,
416
        ClassMetadataBuilder $builder,
417
        $default = null,
418
        bool $isUnique = false
419
    ): void {
420 4
        if (null !== $default && !\is_int($default)) {
421 1
            throw new \InvalidArgumentException(
422 1
                'Invalid default value '.$default
423 1
                .' with type '.gettype($default)
424
            );
425
        }
426 3
        foreach ($fields as $field) {
427 3
            $fieldBuilder = new FieldBuilder(
428 3
                $builder,
429
                [
430 3
                    'fieldName' => $field,
431 3
                    'type'      => Type::INTEGER,
432 3
                    'default'   => $default,
433
                ]
434
            );
435
            $fieldBuilder
436 3
                ->columnName(self::getColumnNameForField($field))
437 3
                ->nullable(null === $default)
438 3
                ->unique($isUnique)
439 3
                ->build();
440
        }
441 3
    }
442
443
    /**
444
     * Set bog standard boolean fields quickly in bulk
445
     *
446
     * @param array                $fields
447
     * @param ClassMetadataBuilder $builder
448
     * @param mixed                $default
449
     * In this case the boolean argument is simply data
450
     * @SuppressWarnings(PHPMD.BooleanArgumentFlag)
451
     */
452 3
    public static function setSimpleBooleanFields(
453
        array $fields,
454
        ClassMetadataBuilder $builder,
455
        $default = null
456
    ): void {
457 3
        if (null !== $default && !\is_bool($default)) {
458 1
            throw new \InvalidArgumentException(
459 1
                'Invalid default value '.$default
460 1
                .' with type '.gettype($default)
461
            );
462
        }
463 2
        foreach ($fields as $field) {
464 2
            $fieldBuilder = new FieldBuilder(
465 2
                $builder,
466
                [
467 2
                    'fieldName' => $field,
468 2
                    'type'      => Type::BOOLEAN,
469 2
                    'default'   => $default,
470
                ]
471
            );
472
            $fieldBuilder
473 2
                ->columnName(self::getColumnNameForField($field))
474 2
                ->nullable(null === $default)
475 2
                ->build();
476
        }
477 2
    }
478
479
    /**
480
     * Bulk create multiple fields of different simple types
481
     *
482
     * Only allows creating of fields with default options
483
     *
484
     * @param array                $fieldToType [
485
     *                                          'fieldName'=>'fieldSimpleType'
486
     *                                          ]
487
     * @param ClassMetadataBuilder $builder
488
     */
489 1
    public static function setSimpleFields(array $fieldToType, ClassMetadataBuilder $builder): void
490
    {
491 1
        foreach ($fieldToType as $field => $type) {
492 1
            $method = "setSimple$type".'fields';
493 1
            static::$method([$field], $builder);
494
        }
495 1
    }
496
}
497