You are here

class SolrDocument in Search API Solr 4.x

Same name in this branch
  1. 4.x src/Plugin/DataType/SolrDocument.php \Drupal\search_api_solr\Plugin\DataType\SolrDocument
  2. 4.x src/Plugin/search_api/datasource/SolrDocument.php \Drupal\search_api_solr\Plugin\search_api\datasource\SolrDocument
Same name and namespace in other branches
  1. 8.3 src/Plugin/DataType/SolrDocument.php \Drupal\search_api_solr\Plugin\DataType\SolrDocument
  2. 8.2 src/Plugin/DataType/SolrDocument.php \Drupal\search_api_solr\Plugin\DataType\SolrDocument

Defines the "Solr document" data type.

Instances of this class wrap Search API Item objects and allow to deal with items based upon the Typed Data API.

Plugin annotation


@DataType(
  id = "solr_document",
  label = @Translation("Solr document"),
  description = @Translation("Records from a Solr index."),
  deriver = "\Drupal\search_api_solr\Plugin\DataType\Deriver\SolrDocumentDeriver",
  definition_class = "\Drupal\search_api_solr\TypedData\SolrDocumentDefinition"
)

Hierarchy

Expanded class hierarchy of SolrDocument

File

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

Namespace

Drupal\search_api_solr\Plugin\DataType
View source
class SolrDocument extends TypedData implements \IteratorAggregate, ComplexDataInterface {

  /**
   * Field name.
   *
   * @var string
   */
  protected $solrField = 'solr_field';

  /**
   * Document name.
   *
   * @var string
   */
  protected $solrDocument = 'solr_document';

  /**
   * The wrapped Search API Item.
   *
   * @var \Drupal\search_api\Item\ItemInterface|null
   */
  protected $item;

  /**
   * Creates an instance wrapping the given Item.
   *
   * @param \Drupal\search_api\Item\ItemInterface|null $item
   *   The Item object to wrap.
   *
   * @return static
   */
  public static function createFromItem(ItemInterface $item) {
    $definition = SolrDocumentDefinition::create($item
      ->getIndex()
      ->id());
    $instance = new static($definition);
    $instance
      ->setValue($item);
    return $instance;
  }

  /**
   * {@inheritdoc}
   */
  public function getValue() {
    return $this->item;
  }

  /**
   * {@inheritdoc}
   */
  public function setValue($item, $notify = TRUE) {
    $this->item = $item;
  }

  /**
   * {@inheritdoc}
   *
   * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
   * @throws \Drupal\Core\TypedData\Exception\ReadOnlyException
   */
  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;
  }

  /**
   * {@inheritdoc}
   */
  public function set($property_name, $value, $notify = TRUE) {

    // Do nothing because we treat Solr documents as read-only.
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function getProperties($include_computed = FALSE) {

    // @todo Implement this.
  }

  /**
   * {@inheritdoc}
   */
  public function toArray() {

    // @todo Implement this.
  }

  /**
   * {@inheritdoc}
   */
  public function isEmpty() {
    return !isset($this->item);
  }

  /**
   * {@inheritdoc}
   */
  public function onChange($name) {

    // Do nothing.  Unlike content entities, Items don't need to be notified of
    // changes.
  }

  /**
   * {@inheritdoc}
   */
  public function getIterator() {
    return isset($this->item) ? $this->item
      ->getIterator() : new \ArrayIterator([]);
  }

}

Members

Namesort descending Modifiers Type Description Overrides
DependencySerializationTrait::$_entityStorages protected property
DependencySerializationTrait::$_serviceIds protected property
DependencySerializationTrait::__sleep public function 2
DependencySerializationTrait::__wakeup public function 2
SolrDocument::$item protected property The wrapped Search API Item.
SolrDocument::$solrDocument protected property Document name. 1
SolrDocument::$solrField protected property Field name. 1
SolrDocument::createFromItem public static function Creates an instance wrapping the given Item.
SolrDocument::get public function Overrides ComplexDataInterface::get
SolrDocument::getIterator public function
SolrDocument::getProperties public function Gets an array of property objects. Overrides ComplexDataInterface::getProperties
SolrDocument::getValue public function Gets the data value. Overrides TypedData::getValue
SolrDocument::isEmpty public function Determines whether the data structure is empty. Overrides ComplexDataInterface::isEmpty
SolrDocument::onChange public function React to changes to a child property or item. Overrides TraversableTypedDataInterface::onChange
SolrDocument::set public function Sets a property value. Overrides ComplexDataInterface::set
SolrDocument::setValue public function Sets the data value. Overrides TypedData::setValue
SolrDocument::toArray public function Returns an array of all property values. Overrides ComplexDataInterface::toArray
StringTranslationTrait::$stringTranslation protected property The string translation service. 4
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.
TypedData::$definition protected property The data definition. 1
TypedData::$name protected property The property name.
TypedData::$parent protected property The parent typed data object.
TypedData::applyDefaultValue public function Applies the default value. Overrides TypedDataInterface::applyDefaultValue 3
TypedData::createInstance public static function Constructs a TypedData object given its definition and context. Overrides TypedDataInterface::createInstance
TypedData::getConstraints public function Gets a list of validation constraints. Overrides TypedDataInterface::getConstraints 9
TypedData::getDataDefinition public function Gets the data definition. Overrides TypedDataInterface::getDataDefinition
TypedData::getName public function Returns the name of a property or item. Overrides TypedDataInterface::getName
TypedData::getParent public function Returns the parent data structure; i.e. either complex data or a list. Overrides TypedDataInterface::getParent
TypedData::getPluginDefinition public function Gets the definition of the plugin implementation. Overrides PluginInspectionInterface::getPluginDefinition
TypedData::getPluginId public function Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface::getPluginId
TypedData::getPropertyPath public function Returns the property path of the data. Overrides TypedDataInterface::getPropertyPath
TypedData::getRoot public function Returns the root of the typed data tree. Overrides TypedDataInterface::getRoot
TypedData::getString public function Returns a string representation of the data. Overrides TypedDataInterface::getString 6
TypedData::setContext public function Sets the context of a property or item via a context aware parent. Overrides TypedDataInterface::setContext
TypedData::validate public function Validates the currently set data value. Overrides TypedDataInterface::validate
TypedData::__construct public function Constructs a TypedData object given its definition and context. 3
TypedDataTrait::$typedDataManager protected property The typed data manager used for creating the data types.
TypedDataTrait::getTypedDataManager public function Gets the typed data manager. 2
TypedDataTrait::setTypedDataManager public function Sets the typed data manager. 2