Source of file Indexes.php
Size: 6,646 Bytes - Last Modified: 2021-12-23T10:38:36+00:00
/var/www/docs.ssmods.com/process/src/src/Indexes.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 | <?php declare(strict_types = 1); // @phpcs:disable SlevomatCodingStandard.ControlStructures.EarlyExit.EarlyExitNotUsed namespace Suilven\FreeTextSearch; use SilverStripe\Core\Config\Config; /** * Class Indexes * * @package Suilven\FreeTextSearch */ class Indexes { /** @var array<string, \Suilven\FreeTextSearch\Index> */ private $indexesByName = []; /** * Get an Index object by name from the config */ public function getIndex(string $name): Index { if ($this->indexesByName === []) { $this->getIndexes(); } return $this->indexesByName[$name]; } /** * Get indexes from config * * @return array<string, \Suilven\FreeTextSearch\Index> ClassName -> Index */ public function getIndexes(): array { $indexesConfig = Config::inst()->get('Suilven\FreeTextSearch\Indexes', 'indexes') ; // reset $this->indexesByName = []; foreach ($indexesConfig as $indexConfig) { $name = $indexConfig['index']['name']; $indexAlreadyExists = isset($this->indexesByName[$name]); // get the existing index, to tweak, or create a new one $index = $indexAlreadyExists ? $this->indexesByName[$name] : new Index(); $index->setName($name); if (isset($indexConfig['index']['class'])) { $index->setClass($indexConfig['index']['class']); } if (isset($indexConfig['index']['fields'])) { foreach ($indexConfig['index']['fields'] as $fieldname) { $index->addField($fieldname); } } if (isset($indexConfig['index']['tokens'])) { foreach ($indexConfig['index']['tokens'] as $token) { $index->addToken($token); } } // has one fields $singleton = \singleton($index->getClass()); if (isset($indexConfig['index']['has_one'])) { foreach ($indexConfig['index']['has_one'] as $hasOneField) { $relationship = $hasOneField['relationship']; // @phpstan-ignore-next-line $singletonOfRel = \call_user_func(array($singleton, $relationship)); $index->addHasOneField($hasOneField['name'], [ 'relationship' => $relationship, 'field' => $hasOneField['field'], 'class' => $singletonOfRel->ClassName, ]); } } // has many fields // NB many many may need to be treated as bipartisan has many if (isset($indexConfig['index']['has_many'])) { foreach ($indexConfig['index']['has_many'] as $hasOneField) { $relationship = $hasOneField['relationship']; // @phpstan-ignore-next-line $singletonOfRel = \call_user_func(array($singleton, $relationship)); $index->addHasManyField($hasOneField['name'], [ 'relationship' => $relationship, 'field' => $hasOneField['field'], 'class' => $singletonOfRel->dataClass(), ]); } } // fields that will be used for highlighting if (isset($indexConfig['index']['highlighted_fields'])) { foreach ($indexConfig['index']['highlighted_fields'] as $highlightedField) { $index->addHighlightedField($highlightedField); } } // fields that will be used for storage, but not indexed if (isset($indexConfig['index']['stored_fields'])) { foreach ($indexConfig['index']['stored_fields'] as $storedField) { $index->addStoredField($storedField); } } // tokenizer if (isset($indexConfig['index']['tokenizer'])) { $index->setTokenizer($indexConfig['index']['tokenizer']); } $this->indexesByName[$index->getName()] = $index; } return $this->indexesByName; } /** @return array<string> An array of facet fields, such as ['ISO', 'Aperture', 'ShutterSpeed'] */ public function getFacetFields(string $indexName): array { $indexesConfig = Config::inst()->get('Suilven\FreeTextSearch\Indexes', 'indexes'); $result = []; foreach ($indexesConfig as $indexConfig) { $name = ($indexConfig['index']['name']); if ($name !== $indexName) { continue; } if (isset($indexConfig['index']['tokens'])) { foreach ($indexConfig['index']['tokens'] as $token) { $result[] = $token; } } if (isset($indexConfig['index']['has_one'])) { foreach ($indexConfig['index']['has_one'] as $hasOneField) { $result[] = $hasOneField['name']; } } } return $result; } /** @return array<string> */ public function getHasOneFields(string $indexName): array { $indexesConfig = Config::inst()->get('Suilven\FreeTextSearch\Indexes', 'indexes'); $result = []; foreach ($indexesConfig as $indexConfig) { $name = ($indexConfig['index']['name']); if ($name !== $indexName) { continue; } if (isset($indexConfig['index']['has_one'])) { foreach ($indexConfig['index']['has_one'] as $hasOne) { $result[] = $hasOne; } } } return $result; } /** @return array<int,array<string,string>> */ public function getHasManyFields(string $indexName): array { $indexesConfig = Config::inst()->get('Suilven\FreeTextSearch\Indexes', 'indexes'); $result = []; foreach ($indexesConfig as $indexConfig) { $name = ($indexConfig['index']['name']); if ($name !== $indexName) { continue; } if (isset($indexConfig['index']['has_many'])) { /** @var array<string,string> $hasManyField */ foreach ($indexConfig['index']['has_many'] as $hasManyField) { $result[] = $hasManyField; } } } return $result; } } |