You are here

protected function SolrFieldManager::buildFieldDefinitions in Search API Solr 8.2

Same name and namespace in other branches
  1. 8.3 src/SolrFieldManager.php \Drupal\search_api_solr\SolrFieldManager::buildFieldDefinitions()
  2. 4.x src/SolrFieldManager.php \Drupal\search_api_solr\SolrFieldManager::buildFieldDefinitions()

Builds the field definitions for a Solr server from its Luke handler.

Parameters

\Drupal\search_api\ServerInterface $server: The server from which we are retrieving field information.

Return value

\Drupal\search_api_solr\TypedData\SolrFieldDefinitionInterface[] The array of field definitions for the server, keyed by field name.

Throws

\InvalidArgumentException

1 call to SolrFieldManager::buildFieldDefinitions()
SolrFieldManager::getFieldDefinitions in src/SolrFieldManager.php
Gets the field definitions for a Solr server.

File

src/SolrFieldManager.php, line 95

Class

SolrFieldManager
Manages the discovery of Solr fields.

Namespace

Drupal\search_api_solr

Code

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);

      // The Search API can't deal with arbitrary item types. To make things
      // easier, just use one of those known to the Search API.
      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;
}