SolrFieldManager.php in Search API Solr 8.2
File
src/SolrFieldManager.php
View source
<?php
namespace Drupal\search_api_solr;
use Drupal\Component\Utility\Unicode;
use Drupal\Core\Cache\Cache;
use Drupal\Core\Cache\CacheBackendInterface;
use Drupal\Core\Cache\UseCacheBackendTrait;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\search_api\LoggerTrait;
use Drupal\search_api\ServerInterface;
use Drupal\search_api_solr\TypedData\SolrFieldDefinition;
use Psr\Log\LoggerInterface;
class SolrFieldManager implements SolrFieldManagerInterface {
use UseCacheBackendTrait;
use StringTranslationTrait;
use LoggerTrait;
protected $fieldDefinitions;
protected $serverStorage;
public function __construct(CacheBackendInterface $cache_backend, EntityTypeManagerInterface $entityTypeManager, LoggerInterface $logger) {
$this->cacheBackend = $cache_backend;
$this->serverStorage = $entityTypeManager
->getStorage('search_api_server');
$this
->setLogger($logger);
}
public function getFieldDefinitions($server_id) {
if (!isset($this->fieldDefinitions[$server_id])) {
$cid = 'solr_field_definitions:' . $server_id;
if ($cache = $this
->cacheGet($cid)) {
$field_definitions = $cache->data;
}
else {
$server = $this->serverStorage
->load($server_id);
if ($server === NULL) {
throw new \InvalidArgumentException('The Search API server could not be loaded.');
}
$field_definitions = $server
->status() ? $this
->buildFieldDefinitions($server) : [];
$this
->cacheSet($cid, $field_definitions, Cache::PERMANENT, $server
->getCacheTagsToInvalidate());
}
$this->fieldDefinitions[$server_id] = $field_definitions;
}
return $this->fieldDefinitions[$server_id];
}
protected function buildFieldDefinitions(ServerInterface $server) {
$backend = $server
->getBackend();
if (!$backend instanceof SolrBackendInterface) {
throw new \InvalidArgumentException("The Search API server's backend must be an instance of SolrBackendInterface.");
}
$fields = [];
try {
$luke = $backend
->getSolrConnector()
->getLuke();
foreach ($luke['fields'] as $name => $definition) {
$field = new SolrFieldDefinition($definition);
$label = Unicode::ucfirst(trim(str_replace('_', ' ', $name)));
$field
->setLabel($label);
if (strpos($field
->getDataType(), 'text') !== FALSE) {
$field
->setDataType('search_api_text');
}
elseif (strpos($field
->getDataType(), 'date') !== FALSE) {
$field
->setDataType('timestamp');
}
elseif (strpos($field
->getDataType(), 'int') !== FALSE) {
$field
->setDataType('integer');
}
elseif (strpos($field
->getDataType(), 'long') !== FALSE) {
$field
->setDataType('integer');
}
elseif (strpos($field
->getDataType(), 'float') !== FALSE) {
$field
->setDataType('float');
}
elseif (strpos($field
->getDataType(), 'double') !== FALSE) {
$field
->setDataType('float');
}
elseif (strpos($field
->getDataType(), 'bool') !== FALSE) {
$field
->setDataType('boolean');
}
else {
$field
->setDataType('string');
}
$fields[$name] = $field;
}
} catch (SearchApiSolrException $e) {
$this
->getLogger()
->error('Could not connect to server %server, %message', [
'%server' => $server
->id(),
'%message' => $e
->getMessage(),
]);
}
return $fields;
}
}