MongoQuerySerializer   A
last analyzed

Complexity

Total Complexity 12

Size/Duplication

Total Lines 63
Duplicated Lines 0 %

Test Coverage

Coverage 92.31%

Importance

Changes 2
Bugs 0 Features 1
Metric Value
eloc 23
dl 0
loc 63
ccs 24
cts 26
cp 0.9231
rs 10
c 2
b 0
f 1
wmc 12

3 Methods

Rating   Name   Duplication   Size   Complexity  
A prepareUnserializableData() 0 12 3
B prepareItemData() 0 27 8
A serialize() 0 5 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Facile\MongoDbBundle\DataCollector;
6
7
use Facile\MongoDbBundle\Models\Query;
8
use MongoDB\BSON\Serializable;
9
10
/**
11
 * Class MongoQuerySerializer
12
 *
13
 * @internal
14
 */
15
final class MongoQuerySerializer
16
{
17 6
    /**
18
     * @param Query $query
19 6
     */
20 6
    public static function serialize(Query $query)
21 6
    {
22 6
        $query->setFilters(self::prepareUnserializableData($query->getFilters()));
23
        $query->setData(self::prepareUnserializableData($query->getData()));
24
        $query->setOptions(self::prepareUnserializableData($query->getOptions()));
25
    }
26
27
    /**
28
     * @param array|object $data
29 7
     *
30
     * @return array|object
31 7
     */
32 1
    private static function prepareUnserializableData($data)
33
    {
34
        if ($data instanceof Serializable) {
35 7
            $data = $data->bsonSerialize();
36 7
        }
37 7
38
        $newData = [];
39
        foreach ($data as $key => $item) {
40 7
            $newData[$key] = self::prepareItemData($item);
41
        }
42
43
        return $newData;
44
    }
45
46
    /**
47
     * @param mixed $item
48 7
     *
49
     * @return mixed
50 7
     */
51 4
    public static function prepareItemData($item)
52
    {
53
        if (\is_string($item)) {
54 6
            return $item;
55 3
        }
56
57
        if (method_exists($item, 'getArrayCopy')) {
58 4
            return self::prepareUnserializableData($item->getArrayCopy());
59 1
        }
60
61
        if (method_exists($item, 'toDateTime')) {
62 3
            return 'ISODate("' . $item->toDateTime()->format('c') . '")';
63
        }
64
65
        if (method_exists($item, '__toString')) {
66 3
            return $item->__toString();
67
        }
68
69
        if ($item instanceof Serializable) {
70 3
            return $item->bsonSerialize();
71 2
        }
72
73
        if (\is_array($item) || \is_object($item)) {
74 2
            return self::prepareUnserializableData((array) $item);
75
        }
76
77
        return $item;
78
    }
79
}
80