Bulk   A
last analyzed

Complexity

Total Complexity 11

Size/Duplication

Total Lines 90
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 3
Bugs 0 Features 0
Metric Value
eloc 45
c 3
b 0
f 0
dl 0
loc 90
ccs 40
cts 40
cp 1
rs 10
wmc 11

3 Methods

Rating   Name   Duplication   Size   Complexity  
A index() 0 8 3
A delete() 0 8 3
A toArray() 0 46 5
1
<?php
2
3
namespace Matchish\ScoutElasticSearch\ElasticSearch\Params;
4
5
/**
6
 * @internal
7
 */
8
final class Bulk
9
{
10
    /**
11
     * @var array
12
     */
13
    private $indexDocs = [];
14
15
    /**
16
     * @var array
17
     */
18
    private $deleteDocs = [];
19
20
    /**
21
     * @param array|object $docs
22
     */
23 3
    public function delete($docs): void
24
    {
25 3
        if (is_iterable($docs)) {
26 1
            foreach ($docs as $doc) {
27 1
                $this->delete($doc);
28
            }
29
        } else {
30 3
            $this->deleteDocs[$docs->getScoutKey()] = $docs;
31
        }
32 3
    }
33
34
    /**
35
     * TODO: Add ability to extend payload without modifying the class.
36
     *
37
     * @return array
38
     */
39 26
    public function toArray(): array
40
    {
41 26
        $payload = ['body' => []];
42 26
        $payload = collect($this->indexDocs)->reduce(
43
            function ($payload, $model) {
44 24
                if ($model::usesSoftDelete() && config('scout.soft_delete', false)) {
45 3
                    $model->pushSoftDeleteMetadata();
46
                }
47 24
                $routing = $model->routing;
48 24
                $scoutKey = $model->getScoutKey();
49 24
                $payload['body'][] = [
50
                    'index' => [
51 24
                        '_index' => $model->searchableAs(),
52 24
                        '_id' => $scoutKey,
53 24
                        '_type' => '_doc',
54 24
                        'routing' => false === empty($routing) ? $routing : $scoutKey,
55
                    ],
56
                ];
57
58 24
                $payload['body'][] = array_merge(
59 24
                    $model->toSearchableArray(),
60 24
                    $model->scoutMetadata(),
61
                    [
62 24
                        '__class_name' => get_class($model),
63
                    ]
64
                );
65
66 24
                return $payload;
67 26
            }, $payload);
68 26
        $payload = collect($this->deleteDocs)->reduce(
69
            function ($payload, $model) {
70 3
                $routing = $model->routing;
71 3
                $scoutKey = $model->getScoutKey();
72 3
                $payload['body'][] = [
73
                    'delete' => [
74 3
                        '_index' => $model->searchableAs(),
75 3
                        '_id' => $scoutKey,
76 3
                        '_type' => '_doc',
77 3
                        'routing' => false === empty($routing) ? $routing : $scoutKey,
78
                    ],
79
                ];
80
81 3
                return $payload;
82 26
            }, $payload);
83
84 26
        return $payload;
85
    }
86
87
    /**
88
     * @param array|object $docs
89
     */
90 24
    public function index($docs): void
91
    {
92 24
        if (is_iterable($docs)) {
93 21
            foreach ($docs as $doc) {
94 21
                $this->index($doc);
95
            }
96
        } else {
97 24
            $this->indexDocs[$docs->getScoutKey()] = $docs;
98
        }
99 24
    }
100
}
101