You are here

public function SolrDocument::get in Search API Solr 8.2

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

Gets a property object.

Parameters

$property_name: The name of the property to get; e.g., 'title' or 'name'.

Return value

\Drupal\Core\TypedData\TypedDataInterface The property object.

Throws

\InvalidArgumentException If an invalid property name is given.

\Drupal\Core\TypedData\Exception\MissingDataException If the complex data structure is unset and no property can be created.

Overrides ComplexDataInterface::get

File

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

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('solr_field')['class'];
  $field_manager = \Drupal::getContainer()
    ->get('solr_field.manager');
  $server_id = $this->item
    ->getIndex()
    ->getServerInstance()
    ->id();
  $fields = $field_manager
    ->getFieldDefinitions($server_id);
  if (empty($fields[$property_name])) {
    throw new \InvalidArgumentException("The Solr field {$property_name} could not be found on the {$server_id} 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() === 'solr_document' && $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 AbstractDocument && isset($document[$property_name])) {
      $property
        ->setValue($document[$property_name]);
    }
  }
  return $property;
}