Source of file AlgoliaQuerier.php
Size: 2,859 Bytes - Last Modified: 2021-12-23T10:59:37+00:00
/var/www/docs.ssmods.com/process/src/src/Service/AlgoliaQuerier.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 | <?php namespace Wilr\SilverStripe\Algolia\Service; use Exception; use Psr\Log\LoggerInterface; use SilverStripe\Core\Injector\Injector; use SilverStripe\ORM\ArrayList; use SilverStripe\ORM\PaginatedList; /** * Wraps the Algolia SDK to return Silverstripe ORM records */ class AlgoliaQuerier { /** * @var array|null $lastResult */ protected $lastResult = null; /** * @param string $selectedIndex * @param string $query * @param array $searchParameters * * @return PaginatedList */ public function fetchResults($selectedIndex = null, $query = '', $searchParameters = []) { $service = Injector::inst()->get(AlgoliaService::class); $results = false; if (!$selectedIndex) { if (!function_exists('array_key_first')) { function array_key_first(array $arr) { foreach ($arr as $key => $unused) { return $key; } return null; } } $selectedIndex = array_key_first($service->indexes); } try { $selectedIndex = $service->environmentizeIndex($selectedIndex); $index = $service->getClient()->initIndex($selectedIndex); $results = $index->search($query, $searchParameters); } catch (Exception $e) { Injector::inst()->get(LoggerInterface::class)->error($e); } $records = ArrayList::create(); if ($results && isset($results['hits'])) { foreach ($results['hits'] as $hit) { $className = isset($hit['objectClassName']) ? $hit['objectClassName'] : null; $id = isset($hit['objectSilverstripeID']) ? $hit['objectSilverstripeID'] : null; if (!$id || !$className) { continue; } try { $record = $className::get()->byId($id); if ($record && $record->canView()) { $records->push($record); } } catch (Exception $e) { Injector::inst()->get(LoggerInterface::class)->notice($e); } } } $this->lastResult = $results; $output = PaginatedList::create($records); if ($results) { $output = $output->setCurrentPage($results['page'] + 1) ->setTotalItems($results['nbHits']) ->setLimitItems(false) ->setPageStart($results['page'] * $results['hitsPerPage']) ->setPageLength($results['hitsPerPage']); } return $output; } /** * @return array|null */ public function getLastResult() { return $this->lastResult; } } |