MongoIndexHelper   A
last analyzed

Complexity

Total Complexity 8

Size/Duplication

Total Lines 78
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 1

Test Coverage

Coverage 0%

Importance

Changes 0
Metric Value
dl 0
loc 78
ccs 0
cts 39
cp 0
rs 10
c 0
b 0
f 0
wmc 8
lcom 0
cbo 1

2 Methods

Rating   Name   Duplication   Size   Complexity  
A createIndexes() 0 16 2
B dropIndexes() 0 23 6
1
<?php
2
declare(strict_types=1);
3
/**
4
 * Minotaur
5
 *
6
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
7
 * use this file except in compliance with the License. You may obtain a copy of
8
 * the License at
9
 *
10
 * http://www.apache.org/licenses/LICENSE-2.0
11
 *
12
 * Unless required by applicable law or agreed to in writing, software
13
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
14
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
15
 * License for the specific language governing permissions and limitations under
16
 * the License.
17
 *
18
 * @copyright 2015-2017 Appertly
19
 * @license   Apache-2.0
20
 */
21
namespace Minotaur\Db;
22
23
use MongoDB\Driver\ReadPreference;
24
use MongoDB\Operation\CreateIndexes;
25
use MongoDB\Operation\DropIndexes;
26
use MongoDB\Operation\ListIndexes;
27
28
/**
29
 * Creates indexes or anything like that at deploy time.
30
 *
31
 * Requires the `mongodb/mongodb` composer package to be installed.
32
 */
33
trait MongoIndexHelper
34
{
35
    use MongoHelper;
36
37
    /**
38
     * Creates some indexes in a collection.
39
     *
40
     * @param $manager - The MongoDB manager
41
     * @param $db - The database name
42
     * @param $collection - The collection name
43
     * @param array<MongoIndex> The indexes to create
44
     * @return array<string> The names of the created indexes
45
     * @see https://docs.mongodb.com/manual/reference/command/createIndexes/
46
     * @throws \Caridea\Dao\Exception\Unreachable If the connection fails
47
     * @throws \Caridea\Dao\Exception\Unretrievable If the document doesn't exist
48
     * @throws \Caridea\Dao\Exception\Violating If a constraint is violated
49
     * @throws \Caridea\Dao\Exception\Inoperable If an API is used incorrectly
50
     * @throws \Caridea\Dao\Exception\Generic If any other database problem occurs
51
     */
52
    protected function createIndexes(\MongoDB\Driver\Manager $manager, string $db, string $collection, array $indexes): array
53
    {
54
        $operation = new CreateIndexes(
55
            $db,
56
            $collection,
57
            array_map(function ($a) {
58
                return $a->toArray();
59
            }, $indexes)
60
        );
61
        try {
62
            $server = $manager->selectServer(new ReadPreference(ReadPreference::RP_PRIMARY));
63
            return $operation->execute($server);
64
        } catch (\Exception $e) {
65
            throw \Caridea\Dao\Exception\Translator\MongoDb::translate($e);
66
        }
67
    }
68
69
    /**
70
     * Deletes some indexes in a collection.
71
     *
72
     * This method will first check for the existence of the supplied indexes
73
     * and if found, will drop them.
74
     *
75
     * @param $manager - The MongoDB manager
76
     * @param $db - The database name
77
     * @param $collection - The collection name
78
     * @param array<string> $names The indexes to delete
79
     * @return array<string> The names of the created indexes
80
     * @see https://docs.mongodb.com/manual/reference/command/dropIndexes/
81
     * @throws \Caridea\Dao\Exception\Unreachable If the connection fails
82
     * @throws \Caridea\Dao\Exception\Unretrievable If the document doesn't exist
83
     * @throws \Caridea\Dao\Exception\Violating If a constraint is violated
84
     * @throws \Caridea\Dao\Exception\Inoperable If an API is used incorrectly
85
     * @throws \Caridea\Dao\Exception\Generic If any other database problem occurs
86
     */
87
    protected function dropIndexes(\MongoDB\Driver\Manager $manager, string $db, string $collection, array $names): array
88
    {
89
        try {
90
            $results = [];
91
            $server = $manager->selectServer(new ReadPreference(ReadPreference::RP_PRIMARY));
92
            $op = new ListIndexes($db, $collection);
93
            $delete = [];
94
            foreach ($op->execute($server) as $k => $v) {
95
                if (in_array($v->getName(), $names)) {
96
                    $delete[$v->getName()] = true;
97
                }
98
            }
99
            if (count($delete) > 0) {
100
                foreach ($delete as $name => $_) {
101
                    $operation = new DropIndexes($db, $collection, $name);
102
                    $results[] = $operation->execute($server);
103
                }
104
            }
105
            return $results;
106
        } catch (\Exception $e) {
107
            throw \Caridea\Dao\Exception\Translator\MongoDb::translate($e);
108
        }
109
    }
110
}
111