You are here

public function SolrDocument::get in Search API Solr 4.x

Same name and namespace in other branches
  1. 8.3 src/Plugin/DataType/SolrDocument.php \Drupal\search_api_solr\Plugin\DataType\SolrDocument::get()
  2. 8.2 src/Plugin/DataType/SolrDocument.php \Drupal\search_api_solr\Plugin\DataType\SolrDocument::get()

Throws

\Drupal\Component\Plugin\Exception\PluginNotFoundException

\Drupal\Core\TypedData\Exception\ReadOnlyException

Overrides ComplexDataInterface::get

File

src/Plugin/DataType/SolrDocument.php, line 84

Class

SolrDocument
Defines the "Solr document" data type.

Namespace

Drupal\search_api_solr\Plugin\DataType

Code

public function get($property_name) {
  if (!isset($this->item)) {
    throw new MissingDataException("Unable to get Solr field {$property_name} as no item has been provided.");
  }

  // First, verify that this field actually exists in the Solr server. If we
  // can't get a definition for it, it doesn't exist.

  /** @var \Drupal\search_api_solr\Plugin\DataType\SolrField $plugin */
  $plugin = \Drupal::typedDataManager()
    ->getDefinition($this->solrField)['class'];
  $field_manager = \Drupal::getContainer()
    ->get($this->solrField . '.manager');
  $fields = $field_manager
    ->getFieldDefinitions($this->item
    ->getIndex());
  if (empty($fields[$property_name])) {
    throw new \InvalidArgumentException("The Solr field {$property_name} could not be found on the server.");
  }

  // Create a new typed data object from the item's field data.
  $property = $plugin::createInstance($fields[$property_name], $property_name, $this);

  // Now that we have the property, try to find its values. We first look at
  // the field values contained in the result item.
  $found = FALSE;
  foreach ($this->item
    ->getFields(FALSE) as $field) {
    if ($field
      ->getDatasourceId() === $this->solrDocument && $field
      ->getPropertyPath() === $property_name) {
      $property
        ->setValue($field
        ->getValues());
      $found = TRUE;
      break;
    }
  }
  if (!$found) {

    // If that didn't work, maybe we can get the field from the Solr document?
    $document = $this->item
      ->getExtraData('search_api_solr_document');
    if ($document instanceof DocumentInterface && isset($document[$property_name])) {
      $property
        ->setValue($document[$property_name]);
    }
  }
  return $property;
}