Passed
Pull Request — master (#147)
by Mozammil
03:02
created

AlgoliaEngine::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 1
dl 0
loc 3
ccs 2
cts 2
cp 1
crap 1
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
/**
6
 * This file is part of Scout Extended.
7
 *
8
 * (c) Algolia Team <[email protected]>
9
 *
10
 *  For the full copyright and license information, please view the LICENSE
11
 *  file that was distributed with this source code.
12
 */
13
14
namespace Algolia\ScoutExtended\Engines;
15
16
use function is_array;
17
use Laravel\Scout\Builder;
18
use Illuminate\Support\Arr;
19
use Illuminate\Support\Str;
20
use Algolia\AlgoliaSearch\SearchClient;
21
use Algolia\ScoutExtended\Jobs\DeleteJob;
22
use Algolia\ScoutExtended\Jobs\UpdateJob;
23
use Algolia\ScoutExtended\Searchable\ModelsResolver;
24
use Algolia\ScoutExtended\Searchable\ObjectIdEncrypter;
25
use Laravel\Scout\Engines\AlgoliaEngine as BaseAlgoliaEngine;
26
27
class AlgoliaEngine extends BaseAlgoliaEngine
28
{
29
    /**
30
     * The Algolia client.
31
     *
32
     * @var \Algolia\AlgoliaSearch\SearchClient
33
     */
34
    protected $algolia;
35
36
    /**
37
     * Create a new engine instance.
38
     *
39
     * @param  \Algolia\AlgoliaSearch\SearchClient $algolia
40
     * @return void
41
     */
42 50
    public function __construct(SearchClient $algolia)
43
    {
44 50
        $this->algolia = $algolia;
45 50
    }
46
47
    /**
48
     * @param \Algolia\AlgoliaSearch\SearchClient $algolia
49
     *
50
     * @return void
51
     */
52 44
    public function setClient($algolia): void
53
    {
54 44
        $this->algolia = $algolia;
55 44
    }
56
57
    /**
58
     * Get the client.
59
     *
60
     * @return \Algolia\AlgoliaSearch\SearchClient $algolia
61
     */
62 49
    public function getClient(): SearchClient
63
    {
64 49
        return $this->algolia;
65
    }
66
67
    /**
68
     * {@inheritdoc}
69
     */
70 15
    public function update($searchables)
71
    {
72 15
        dispatch_now(new UpdateJob($searchables));
73 15
    }
74
75
    /**
76
     * {@inheritdoc}
77
     */
78 6
    public function delete($searchables)
79
    {
80 6
        dispatch_now(new DeleteJob($searchables));
81 6
    }
82
83
    /**
84
     * {@inheritdoc}
85
     */
86 15
    public function map(Builder $builder, $results, $searchable)
87
    {
88 15
        if (count($results['hits']) === 0) {
89 11
            return $searchable->newCollection();
90
        }
91
92 4
        $hits = collect($results['hits'])->keyBy('objectID');
93 4
        $ids = $hits->pluck('objectID')->all();
94
95 4
        $models = resolve(ModelsResolver::class)->from($builder, $searchable, $ids);
96
97
        return $models->map(function ($model) use ($hits) {
98 3
            if ($hit = $hits->get(ObjectIdEncrypter::encrypt($model))) {
99 2
                foreach (Arr::only($hit, ['_highlightResult', '_rankingInfo']) as $key => $value) {
100
                    $model->withScoutMetadata($key, $value);
101
                }
102
            }
103
104 3
            return $model;
105 3
        });
106
    }
107
108
    /**
109
     * {@inheritdoc}
110
     */
111 2
    public function flush($model)
112
    {
113 2
        $index = $this->algolia->initIndex($model->searchableAs());
114
115 2
        $index->clearObjects();
116 2
    }
117
118
    /**
119
     * {@inheritdoc}
120
     */
121 16
    protected function filters(Builder $builder): array
122
    {
123 16
        $operators = ['<', '<=', '=', '!=', '>=', '>', ':'];
124
125
        return collect($builder->wheres)->map(function ($value, $key) use ($operators) {
126 8
            if (! is_array($value)) {
127 7
                if (Str::endsWith($key, $operators) || Str::startsWith($value, $operators)) {
128 5
                    return $key.' '.$value;
129
                }
130
131 2
                return $key.'='.$value;
132
            }
133
134 2
            return $value;
135 16
        })->values()->all();
136
    }
137
}
138