You are here

class MigrateSourceMultiItems in Migrate 7.2

Same name and namespace in other branches
  1. 6.2 plugins/sources/multiitems.inc \MigrateSourceMultiItems

Implementation of MigrateSource, providing the semantics of iterating over IDs provided by a MigrateItems and retrieving data from a MigrateItems.

Hierarchy

Expanded class hierarchy of MigrateSourceMultiItems

File

plugins/sources/multiitems.inc, line 75
Support for migration from sources where data spans multiple lines (ex. xml, json) and IDs for the items are part of each item and multiple items reside in a single file.

View source
class MigrateSourceMultiItems extends MigrateSource {

  /**
   * MigrateItems object used to obtain the list of IDs and source for
   * all objects.
   *
   * @var MigrateItems
   */
  protected $itemsClass;

  /**
   * List of available source fields.
   *
   * @var array
   */
  protected $fields = array();

  /**
   * Iterator of IDs from the listing class.
   *
   * @var Iterator
   */
  protected $idIterator;

  /**
   * List of item IDs to iterate.
   *
   * @var array
   */
  protected $idsToProcess = array();

  /**
   * Simple initialization.
   */
  public function __construct(MigrateItems $items_class, $fields = array(), $options = array()) {
    parent::__construct($options);
    $this->itemsClass = $items_class;
    $this->fields = $fields;
  }

  /**
   * Return a string representing the source.
   *
   * @return string
   */
  public function __toString() {
    return (string) $this->itemsClass;
  }

  /**
   * Returns a list of fields available to be mapped from the source query.
   * Since we can't reliably figure out what "fields" are in the source,
   * it's up to the implementing Migration constructor to fill them in.
   *
   * @return array
   *  Keys: machine names of the fields (to be passed to addFieldMapping)
   *  Values: Human-friendly descriptions of the fields.
   */
  public function fields() {
    return $this->fields;
  }

  /**
   * It's the list class that knows how many records are available, so ask it.
   *
   * @return int
   */
  public function computeCount() {

    // @API: Support old count method for now.
    if (method_exists($this->itemsClass, 'computeCount')) {
      return $this->itemsClass
        ->computeCount();
    }
    else {
      return $this->itemsClass
        ->count();
    }
  }

  /**
   * Implementation of MigrateSource::performRewind().
   *
   * @return void
   */
  public function performRewind() {

    // If there isn't a specific ID list passed in, get it from the list class.
    if ($this->idList) {
      $this->idsToProcess = $this->idList;
    }
    elseif (!($this->idsToProcess = $this->itemsClass
      ->getIdList())) {
      $this->idsToProcess = array();
    }
    $this->idIterator = $this->idsToProcess instanceof Iterator ? $this->idsToProcess : new ArrayIterator($this->idsToProcess);
    $this->idIterator
      ->rewind();
  }

  /**
   * Implementation of MigrateSource::getNextRow().
   *
   * @return null|stdClass
   */
  public function getNextRow() {
    $row = NULL;
    while ($this->idIterator
      ->valid()) {
      $id = $this->idIterator
        ->current();
      $this->idIterator
        ->next();

      // Skip empty IDs
      if (empty($id)) {
        continue;
      }

      // Got a good ID, get the data and get out.
      $row = $this->itemsClass
        ->getItem($id);
      if ($row) {

        // Save the ID using the map source key - it will be used for mapping
        $sourceKey = $this->activeMap
          ->getSourceKey();
        $key_name = key($sourceKey);
        $row->{$key_name} = $id;
        break;
      }
    }
    return $row;
  }

  /**
   * Overrides MigrateSource::hash().
   */
  protected function hash($row) {

    // Let the item class override the default hash function.
    if (method_exists($this->itemsClass, 'hash')) {
      $hash = $this->itemsClass
        ->hash($row);
    }
    else {
      $hash = parent::hash($row);
    }
    return $hash;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
MigrateSource::$activeMap protected property The MigrateMap class for the current migration.
MigrateSource::$activeMigration protected property The Migration class currently invoking us, during rewind() and next().
MigrateSource::$cacheCounts protected property Whether this instance should cache the source count.
MigrateSource::$cacheKey protected property Key to use for caching counts.
MigrateSource::$currentKey protected property The primary key of the current row
MigrateSource::$currentRow protected property The current row from the quey
MigrateSource::$highwaterField protected property Information on the highwater mark for the current migration, if any.
MigrateSource::$idList protected property List of source IDs to process.
MigrateSource::$mapRowAdded protected property By default, next() will directly read the map row and add it to the data row. A source plugin implementation may do this itself (in particular, the SQL source can incorporate the map table into the query) - if so, it should set this TRUE so we…
MigrateSource::$multikeySeparator protected property Used in the case of multiple key sources that need to use idlist.
MigrateSource::$numIgnored protected property Number of rows intentionally ignored (prepareRow() returned FALSE)
MigrateSource::$numProcessed protected property Number of rows we've at least looked at. 1
MigrateSource::$originalHighwater protected property The highwater mark at the beginning of the import operation.
MigrateSource::$skipCount protected property Whether this instance should not attempt to count the source.
MigrateSource::$trackChanges protected property If TRUE, we will maintain hashed source rows to determine whether incoming data has changed.
MigrateSource::count public function Return a count of available source records, from the cache if appropriate. Returns -1 if the source is not countable.
MigrateSource::current public function Implementation of Iterator::current() - called when entering a loop iteration, returning the current row
MigrateSource::dataChanged protected function Determine whether this row has changed, and therefore whether it should be processed.
MigrateSource::getCurrentKey public function
MigrateSource::getIgnored public function
MigrateSource::getProcessed public function
MigrateSource::key public function Implementation of Iterator::key - called when entering a loop iteration, returning the key of the current row. It must be a scalar - we will serialize to fulfill the requirement, but using getCurrentKey() is preferable.
MigrateSource::next public function Implementation of Iterator::next() - subclasses of MigrateSource should implement getNextRow() to retrieve the next valid source rocord to process.
MigrateSource::prepareRow protected function Give the calling migration a shot at manipulating, and possibly rejecting, the source row.
MigrateSource::resetStats public function Reset numIgnored back to 0.
MigrateSource::rewind public function Implementation of Iterator::rewind() - subclasses of MigrateSource should implement performRewind() to do any class-specific setup for iterating source records.
MigrateSource::valid public function Implementation of Iterator::valid() - called at the top of the loop, returning TRUE to process the loop and FALSE to terminate it
MigrateSourceMultiItems::$fields protected property List of available source fields.
MigrateSourceMultiItems::$idIterator protected property Iterator of IDs from the listing class.
MigrateSourceMultiItems::$idsToProcess protected property List of item IDs to iterate.
MigrateSourceMultiItems::$itemsClass protected property MigrateItems object used to obtain the list of IDs and source for all objects.
MigrateSourceMultiItems::computeCount public function It's the list class that knows how many records are available, so ask it.
MigrateSourceMultiItems::fields public function Returns a list of fields available to be mapped from the source query. Since we can't reliably figure out what "fields" are in the source, it's up to the implementing Migration constructor to fill them in. Overrides MigrateSource::fields
MigrateSourceMultiItems::getNextRow public function Implementation of MigrateSource::getNextRow().
MigrateSourceMultiItems::hash protected function Overrides MigrateSource::hash(). Overrides MigrateSource::hash
MigrateSourceMultiItems::performRewind public function Implementation of MigrateSource::performRewind().
MigrateSourceMultiItems::__construct public function Simple initialization. Overrides MigrateSource::__construct
MigrateSourceMultiItems::__toString public function Return a string representing the source.