Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
85.71% |
18 / 21 |
CRAP | |
87.80% |
36 / 41 |
Row | |
0.00% |
0 / 1 |
|
85.71% |
18 / 21 |
26.13 | |
87.80% |
36 / 41 |
__construct | |
100.00% |
1 / 1 |
3 | |
100.00% |
7 / 7 |
|||
getSourceIdValues | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
hasSourceProperty | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
getSourceProperty | |
100.00% |
1 / 1 |
2 | |
100.00% |
4 / 4 |
|||
getSource | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
setSourceProperty | |
100.00% |
1 / 1 |
2 | |
100.00% |
4 / 4 |
|||
freezeSource | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
cloneWithoutDestination | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
|||
hasDestinationProperty | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
setDestinationProperty | |
100.00% |
1 / 1 |
1 | |
100.00% |
3 / 3 |
|||
removeDestinationProperty | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 3 |
|||
getDestination | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
getRawDestination | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
|||
getDestinationProperty | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
setIdMap | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
getIdMap | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
rehash | |
100.00% |
1 / 1 |
1 | |
100.00% |
3 / 3 |
|||
changed | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
needsUpdate | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
getHash | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
isStub | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
<?php | |
/** | |
* @file | |
* Contains \Drupal\migrate\Row. | |
*/ | |
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 = array(); | |
/** | |
* The source identifiers. | |
* | |
* @var array | |
*/ | |
protected $sourceIds = array(); | |
/** | |
* The destination values. | |
* | |
* @var array | |
*/ | |
protected $destination = array(); | |
/** | |
* Level separator of destination and source properties. | |
*/ | |
const PROPERTY_SEPARATOR = '/'; | |
/** | |
* The mapping between source and destination identifiers. | |
* | |
* @var array | |
*/ | |
protected $idMap = array( | |
'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; | |
/** | |
* 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. | |
*/ | |
public function getSourceIdValues() { | |
return 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)); | |
} | |
/** | |
* 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; | |
} | |
} |