Source of file ElasticaService.php
Size: 2,971 Bytes - Last Modified: 2021-12-23T10:27:01+00:00
/var/www/docs.ssmods.com/process/src/src/Services/ElasticaService.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 | <?php namespace TheWebmen\FacetFilters\Services; use SilverStripe\Core\ClassInfo; use SilverStripe\Core\Extensible; use SilverStripe\Core\Injector\Injectable; use SilverStripe\Core\Config\Configurable; use SilverStripe\ORM\DataObject; use TheWebmen\FacetFilters\Extensions\FilterIndexItemExtension; use Translatable; class ElasticaService { use Extensible; use Injectable; use Configurable; /** * @var \Elastica\Index */ protected $index; public function __construct() { $config = self::config()->get('client_config'); $client = new \Elastica\Client($config ? $config : []); $this->index = $client->getIndex(self::config()->get('index_name')); } public function getIndex() { return $this->index; } /** * @param FilterIndexItemExtension $record */ public function add($record) { $type = $this->index->getType($record->getElasticaType()); $type->addDocument($record->getElasticaDocument()); } /** * @param FilterIndexItemExtension $record */ public function delete($record) { $type = $this->index->getType($record->getElasticaType()); $type->deleteDocument($record->getElasticaDocument()); } public function reindex() { if ($this->index->exists()) { $this->index->delete(); } $this->index->create(); $documents = []; foreach ($this->getIndexedClasses() as $class) { /** @var FilterIndexItemExtension $instance */ $instance = $class::singleton(); $type = $this->index->getType($instance->getElasticaType()); $mapping = $instance->getElasticaMapping(); $mapping->setType($type); $mapping->send(); if (class_exists('Translatable')) { foreach (Translatable::get_allowed_locales() as $locale) { Translatable::set_current_locale($locale); /** @var FilterIndexItemExtension $record */ foreach ($class::get() as $record) { $documents[] = $record->getElasticaDocument(); } } } else { /** @var FilterIndexItemExtension $record */ foreach ($class::get() as $record) { $documents[] = $record->getElasticaDocument(); } } } $this->index->addDocuments($documents); } public function search(\Elastica\Query $query) { return $this->index->search($query); } public function getIndexedClasses() { $classes = []; foreach (ClassInfo::subclassesFor(DataObject::class) as $candidate) { if (singleton($candidate)->hasExtension(FilterIndexItemExtension::class)) { $classes[] = $candidate; } } return $classes; } } |