You are here

public function SolrFieldTypeListBuilder::load in Search API Solr 8.2

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

Loads entities of this type from storage for listing.

This allows the implementation to manipulate the listing, like filtering or sorting the loaded entities.

Return value

\Drupal\Core\Entity\EntityInterface[] An array of entities implementing \Drupal\Core\Entity\EntityInterface indexed by their IDs. Returns an empty array if no matching entities are found.

Overrides ConfigEntityListBuilder::load

4 calls to SolrFieldTypeListBuilder::load()
SolrFieldTypeListBuilder::getConfigFiles in src/Controller/SolrFieldTypeListBuilder.php
SolrFieldTypeListBuilder::getSchemaExtraFieldsXml in src/Controller/SolrFieldTypeListBuilder.php
SolrFieldTypeListBuilder::getSchemaExtraTypesXml in src/Controller/SolrFieldTypeListBuilder.php
SolrFieldTypeListBuilder::getSolrconfigExtraXml in src/Controller/SolrFieldTypeListBuilder.php

File

src/Controller/SolrFieldTypeListBuilder.php, line 76

Class

SolrFieldTypeListBuilder
Provides a listing of SolrFieldType.

Namespace

Drupal\search_api_solr\Controller

Code

public function load() {
  static $entities;
  if (!$entities) {
    $solr_version = '9999.0.0';
    $operator = '>=';
    $domain = 'generic';
    $multilingual = FALSE;
    $warning = FALSE;
    try {

      /** @var \Drupal\search_api_solr\SolrBackendInterface $backend */
      $backend = $this
        ->getBackend();
      $domain = $backend
        ->getDomain();
      $multilingual = $backend instanceof SolrMultilingualBackendInterface;
      $solr_version = $backend
        ->getSolrConnector()
        ->getSolrVersion();
      if (version_compare($solr_version, '0.0.0', '==')) {
        $solr_version = '9999.0.0';
        throw new SearchApiSolrException();
      }
    } catch (SearchApiSolrException $e) {
      $operator = '<=';
      $warning = TRUE;
    }

    // We need the whole list to work on
    $this->limit = FALSE;
    $entity_ids = $this
      ->getEntityIds();

    /** @var \Drupal\Core\Config\Entity\ConfigEntityStorageInterface $storage */
    $storage = $this
      ->getStorage();
    $entities = $storage
      ->loadMultipleOverrideFree($entity_ids);

    // We filter to those field types that are relevant for the current server.
    // There are multiple entities having the same field_type.name but different
    // values for managed_schema, minimum_solr_version and domains.
    $selection = [];
    foreach ($entities as $key => $solr_field_type) {
      if ($multilingual || 'und' == $solr_field_type
        ->getFieldTypeLanguageCode()) {

        /** @var \Drupal\search_api_solr\SolrFieldTypeInterface $solr_field_type */
        $version = $solr_field_type
          ->getMinimumSolrVersion();
        $domains = $solr_field_type
          ->getDomains();
        if ($solr_field_type
          ->isManagedSchema() != $this
          ->getBackend()
          ->isManagedSchema() || version_compare($version, $solr_version, '>') || !in_array($domain, $domains) && !in_array('generic', $domains)) {
          unset($entities[$key]);
        }
        else {
          $name = $solr_field_type
            ->getFieldTypeName();
          if (isset($selection[$name])) {

            // The more specific domain has precedence over a newer version.
            if ('generic' != $domain && 'generic' == $selection[$name]['domain'] && in_array($domain, $domains) || version_compare($version, $selection[$name]['version'], $operator) && in_array($selection[$name]['domain'], $domains)) {
              unset($entities[$selection[$name]['key']]);
              $selection[$name] = [
                'version' => $version,
                'key' => $key,
                'domain' => in_array($domain, $domains) ? $domain : 'generic',
              ];
            }
            else {
              unset($entities[$key]);
            }
          }
          else {
            $selection[$name] = [
              'version' => $version,
              'key' => $key,
              'domain' => in_array($domain, $domains) ? $domain : 'generic',
            ];
          }
        }
      }
      else {
        unset($entities[$key]);
      }
    }
    if ($warning) {
      $this->assumed_minimum_version = array_reduce($selection, function ($version, $item) {
        if (version_compare($item['version'], $version, '<')) {
          return $item['version'];
        }
        return $version;
      }, $solr_version);
      \Drupal::messenger()
        ->addWarning($this
        ->t('Unable to reach the Solr server (yet). Therefore the lowest supported Solr version %version is assumed.' . ' Once the connection works and the real Solr version could be detected it might be necessary to deploy an adjusted config to the server to get the best search results.' . ' If the server does not start using the downloadable config, you should edit the server and manually set the Solr version override temporarily that fits your server best and download the config again. But it is recommended to remove this override once the server is running.', [
        '%version' => $this->assumed_minimum_version,
      ]));
    }

    // Sort the entities using the entity class's sort() method.
    // See \Drupal\Core\Config\Entity\ConfigEntityBase::sort().
    uasort($entities, [
      $this->entityType
        ->getClass(),
      'sort',
    ]);
  }
  return $entities;
}