Passed
Push — master ( 2bdf01...3bb585 )
by Mr
07:19
created

Elasticsearch7Migration::reindexWithMapping()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 4
nc 1
nop 3
dl 0
loc 6
ccs 0
cts 6
cp 0
crap 2
rs 10
c 1
b 0
f 0
1
<?php declare(strict_types=1);
2
/**
3
 * This file is part of the daikon-cqrs/elasticsearch7-adapter project.
4
 *
5
 * For the full copyright and license information, please view the LICENSE
6
 * file that was distributed with this source code.
7
 */
8
9
namespace Daikon\Elasticsearch7\Migration;
10
11
use Daikon\Dbal\Exception\DbalException;
12
use Daikon\Dbal\Migration\Migration;
13
use Elasticsearch\Common\Exceptions\Missing404Exception;
14
15
abstract class Elasticsearch7Migration extends Migration
16
{
17
    protected function createIndex(string $index, array $settings = []): void
18
    {
19
        $indices = $this->connector->getConnection()->indices();
20
21
        if ($this->indexExists($index)) {
22
            throw new DbalException("Cannot create already existing index '$index'.");
23
        }
24
25
        $indices->create(['index' => $index, 'body' => $settings]);
26
    }
27
28
    protected function createAlias(string $index, string $alias): void
29
    {
30
        $indices = $this->connector->getConnection()->indices();
31
        $indices->updateAliases([
32
            'body' => [
33
                'actions' => [['add' => ['index' => $index, 'alias' => $alias]]]
34
            ]
35
        ]);
36
    }
37
38
    protected function reassignAlias(string $index, string $alias): void
39
    {
40
        $currentIndices = $this->getIndicesWithAlias($alias);
41
        if (count($currentIndices) !== 1) {
42
            throw new DbalException(
43
                "Cannot reassign alias '$alias' since it is not assigned to exactly one index."
44
            );
45
        }
46
47
        $indices = $this->connector->getConnection()->indices();
48
        $indices->updateAliases([
49
            'body' => [
50
                'actions' => [
51
                    ['remove' => ['index' => current($currentIndices), 'alias' => $alias]],
52
                    ['add' => ['index' => $index, 'alias' => $alias]]
53
                ]
54
            ]
55
        ]);
56
    }
57
58
    protected function deleteIndex(string $index): void
59
    {
60
        $indices = $this->connector->getConnection()->indices();
61
62
        if (!$this->indexExists($index)) {
63
            throw new DbalException("Cannot delete non-existing index '$index'.");
64
        }
65
66
        $indices->delete(['index' => $index]);
67
    }
68
69
    protected function putMapping(string $index, array $mapping): void
70
    {
71
        $indices = $this->connector->getConnection()->indices();
72
        $indices->putMapping(['index' => $index, 'body' => $mapping]);
73
    }
74
75
    protected function reindexWithMapping(string $source, string $dest, array $mapping): void
76
    {
77
        $settings = $this->getIndexSettings($source);
78
        $mappings['mappings'] = $mapping;
0 ignored issues
show
Comprehensibility Best Practice introduced by
$mappings was never initialized. Although not strictly required by PHP, it is generally a good practice to add $mappings = array(); before regardless.
Loading history...
79
        $this->createIndex($dest, array_merge($settings, $mappings));
80
        $this->reindex($source, $dest);
81
    }
82
83
    protected function reindex(string $source, string $dest): void
84
    {
85
        $client = $this->connector->getConnection();
86
        $client->reindex([
87
           'body' => [
88
               'source' => ['index' => $source],
89
               'dest' => ['index' => $dest, 'version_type' => 'external']
90
           ]
91
        ]);
92
    }
93
94
    protected function getIndexSettings(string $index): array
95
    {
96
        $indices = $this->connector->getConnection()->indices();
97
        $settings = current($indices->getSettings(['index' => $index]));
98
        // have to remove info settings to create new index..
99
        unset($settings['settings']['index']['uuid']);
100
        unset($settings['settings']['index']['version']);
101
        unset($settings['settings']['index']['creation_date']);
102
        unset($settings['settings']['index']['provided_name']);
103
        return $settings;
104
    }
105
106
    protected function getIndicesWithAlias(string $alias): array
107
    {
108
        $indices = $this->connector->getConnection()->indices();
109
110
        try {
111
            $indexNames = array_keys($indices->getAlias(['name' => $alias]));
112
        } catch (Missing404Exception $error) {
0 ignored issues
show
Coding Style Comprehensibility introduced by
Consider adding a comment why this CATCH block is empty.
Loading history...
113
        }
114
115
        return $indexNames ?? [];
116
    }
117
118
    protected function indexExists(string $index): bool
119
    {
120
        $indices = $this->connector->getConnection()->indices();
121
        return $indices->exists(['index' => $index]);
122
    }
123
124
    protected function getIndexPrefix(): string
125
    {
126
        return $this->connector->getSettings()['index_prefix'];
127
    }
128
}
129