Mercurial > hg > isophonics-drupal-site
diff core/modules/migrate/src/Row.php @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children | 1fec387a4317 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/modules/migrate/src/Row.php Wed Nov 29 16:09:58 2017 +0000 @@ -0,0 +1,367 @@ +<?php + +namespace Drupal\migrate; + +use Drupal\Component\Utility\NestedArray; +use Drupal\migrate\Plugin\MigrateIdMapInterface; + +/** + * Stores a row. + */ +class Row { + + /** + * The actual values of the source row. + * + * @var array + */ + protected $source = []; + + /** + * The source identifiers. + * + * @var array + */ + protected $sourceIds = []; + + /** + * The destination values. + * + * @var array + */ + protected $destination = []; + + /** + * Level separator of destination and source properties. + */ + const PROPERTY_SEPARATOR = '/'; + + /** + * The mapping between source and destination identifiers. + * + * @var array + */ + protected $idMap = [ + 'original_hash' => '', + 'hash' => '', + 'source_row_status' => MigrateIdMapInterface::STATUS_NEEDS_UPDATE, + ]; + + /** + * Whether the source has been frozen already. + * + * Once frozen the source can not be changed any more. + * + * @var bool + */ + protected $frozen = FALSE; + + /** + * The raw destination properties. + * + * Unlike $destination which is set by using + * \Drupal\Component\Utility\NestedArray::setValue() this array contains + * the destination as setDestinationProperty was called. + * + * @var array + * The raw destination. + * + * @see getRawDestination() + */ + protected $rawDestination = []; + + /** + * TRUE when this row is a stub. + * + * @var bool + */ + protected $isStub = FALSE; + + /** + * The empty destination properties. + * + * @var array + */ + protected $emptyDestinationProperties = []; + + /** + * Constructs a \Drupal\Migrate\Row object. + * + * @param array $values + * An array of values to add as properties on the object. + * @param array $source_ids + * An array containing the IDs of the source using the keys as the field + * names. + * @param bool $is_stub + * TRUE if the row being created is a stub. + * + * @throws \InvalidArgumentException + * Thrown when a source ID property does not exist. + */ + public function __construct(array $values = [], array $source_ids = [], $is_stub = FALSE) { + $this->source = $values; + $this->sourceIds = $source_ids; + $this->isStub = $is_stub; + foreach (array_keys($source_ids) as $id) { + if (!$this->hasSourceProperty($id)) { + throw new \InvalidArgumentException("$id has no value"); + } + } + } + + /** + * Retrieves the values of the source identifiers. + * + * @return array + * An array containing the values of the source identifiers. Returns values + * in the same order as defined in $this->sourceIds. + */ + public function getSourceIdValues() { + return array_merge($this->sourceIds, array_intersect_key($this->source, $this->sourceIds)); + } + + /** + * Determines whether a source has a property. + * + * @param string $property + * A property on the source. + * + * @return bool + * TRUE if the source has property; FALSE otherwise. + */ + public function hasSourceProperty($property) { + return NestedArray::keyExists($this->source, explode(static::PROPERTY_SEPARATOR, $property)); + } + + /** + * Retrieves a source property. + * + * @param string $property + * A property on the source. + * + * @return mixed|null + * The found returned property or NULL if not found. + */ + public function getSourceProperty($property) { + $return = NestedArray::getValue($this->source, explode(static::PROPERTY_SEPARATOR, $property), $key_exists); + if ($key_exists) { + return $return; + } + } + + /** + * Returns the whole source array. + * + * @return array + * An array of source plugins. + */ + public function getSource() { + return $this->source; + } + + /** + * Sets a source property. + * + * This can only be called from the source plugin. + * + * @param string $property + * A property on the source. + * @param mixed $data + * The property value to set on the source. + * + * @throws \Exception + */ + public function setSourceProperty($property, $data) { + if ($this->frozen) { + throw new \Exception("The source is frozen and can't be changed any more"); + } + else { + NestedArray::setValue($this->source, explode(static::PROPERTY_SEPARATOR, $property), $data, TRUE); + } + } + + /** + * Freezes the source. + * + * @return $this + */ + public function freezeSource() { + $this->frozen = TRUE; + return $this; + } + + /** + * Clones the row with an empty set of destination values. + * + * @return static + */ + public function cloneWithoutDestination() { + return (new static($this->getSource(), $this->sourceIds, $this->isStub()))->freezeSource(); + } + + /** + * Tests if destination property exists. + * + * @param array|string $property + * An array of properties on the destination. + * + * @return bool + * TRUE if the destination property exists. + */ + public function hasDestinationProperty($property) { + return NestedArray::keyExists($this->destination, explode(static::PROPERTY_SEPARATOR, $property)); + } + + /** + * Sets destination properties. + * + * @param string $property + * The name of the destination property. + * @param mixed $value + * The property value to set on the destination. + */ + public function setDestinationProperty($property, $value) { + $this->rawDestination[$property] = $value; + NestedArray::setValue($this->destination, explode(static::PROPERTY_SEPARATOR, $property), $value, TRUE); + } + + /** + * Removes destination property. + * + * @param string $property + * The name of the destination property. + */ + public function removeDestinationProperty($property) { + unset($this->rawDestination[$property]); + NestedArray::unsetValue($this->destination, explode(static::PROPERTY_SEPARATOR, $property)); + } + + /** + * Sets a destination to be empty. + * + * @param string $property + * The destination property. + */ + public function setEmptyDestinationProperty($property) { + $this->emptyDestinationProperties[] = $property; + } + + /** + * Gets the empty destination properties. + * + * @return array + * An array of destination properties. + */ + public function getEmptyDestinationProperties() { + return $this->emptyDestinationProperties; + } + + /** + * Returns the whole destination array. + * + * @return array + * An array of destination values. + */ + public function getDestination() { + return $this->destination; + } + + /** + * Returns the raw destination. Rarely necessary. + * + * For example calling setDestination('foo/bar', 'baz') results in + * @code + * $this->destination['foo']['bar'] = 'baz'; + * $this->rawDestination['foo/bar'] = 'baz'; + * @endcode + * + * @return array + * The raw destination values. + */ + public function getRawDestination() { + return $this->rawDestination; + } + + /** + * Returns the value of a destination property. + * + * @param string $property + * The name of a property on the destination. + * + * @return mixed + * The destination value. + */ + public function getDestinationProperty($property) { + return NestedArray::getValue($this->destination, explode(static::PROPERTY_SEPARATOR, $property)); + } + + /** + * Sets the Migrate ID mappings. + * + * @param array $id_map + * An array of mappings between source ID and destination ID. + */ + public function setIdMap(array $id_map) { + $this->idMap = $id_map; + } + + /** + * Retrieves the Migrate ID mappings. + * + * @return array + * An array of mapping between source and destination identifiers. + */ + public function getIdMap() { + return $this->idMap; + } + + /** + * Recalculates the hash for the row. + */ + public function rehash() { + $this->idMap['original_hash'] = $this->idMap['hash']; + $this->idMap['hash'] = hash('sha256', serialize($this->source)); + } + + /** + * Checks whether the row has changed compared to the original ID map. + * + * @return bool + * TRUE if the row has changed, FALSE otherwise. If setIdMap() was not + * called, this always returns FALSE. + */ + public function changed() { + return $this->idMap['original_hash'] != $this->idMap['hash']; + } + + /** + * Returns if this row needs an update. + * + * @return bool + * TRUE if the row needs updating, FALSE otherwise. + */ + public function needsUpdate() { + return $this->idMap['source_row_status'] == MigrateIdMapInterface::STATUS_NEEDS_UPDATE; + } + + /** + * Returns the hash for the source values.. + * + * @return mixed + * The hash of the source values. + */ + public function getHash() { + return $this->idMap['hash']; + } + + /** + * Reports whether this row is a stub. + * + * @return bool + * The current stub value. + */ + public function isStub() { + return $this->isStub; + } + +}