/** * @param string $documentName * @param string $idKey * @return void */ protected function processChangedRecords($documentName, $idKey) { $items = $this->source->getChangedRecords($documentName, $idKey); if (empty($items)) { return; } if (!$this->eolOnce) { $this->eolOnce = true; echo PHP_EOL; } $destinationName = $this->mapReader->getDocumentMap($documentName, MapInterface::TYPE_SOURCE); $sourceDocument = $this->source->getDocument($documentName); $destDocument = $this->destination->getDocument($destinationName); $recordTransformer = $this->getRecordTransformer($sourceDocument, $destDocument); do { $destinationRecords = $destDocument->getRecords(); $ids = []; foreach ($items as $data) { echo '.'; $ids[] = $data[$idKey]; $this->transformData($data, $sourceDocument, $destDocument, $recordTransformer, $destinationRecords); } $this->destination->updateChangedRecords($destinationName, $destinationRecords); $documentNameDelta = $this->source->getDeltaLogName($documentName); $documentNameDelta = $this->source->addDocumentPrefix($documentNameDelta); $this->markRecordsProcessed($documentNameDelta, $idKey, $ids); } while (!empty($items = $this->source->getChangedRecords($documentName, $idKey))); }
/** * @param Record $from * @param Record $to * @return void */ protected function copy(Record $from, Record $to) { foreach ($from->getFields() as $field) { if (!$this->mapReader->isFieldIgnored($this->sourceDocument->getName(), $field, MapInterface::TYPE_SOURCE)) { $fieldMap = $this->mapReader->getFieldMap($this->sourceDocument->getName(), $field, MapInterface::TYPE_SOURCE); $to->setValue($fieldMap, $from->getValue($field)); } } }
public function testTransform() { $srcHandler = $this->initHandler($this->sourceDocument, 0); $destHandler = $this->initHandler($this->destDocument, 1); $this->recordTransformer->init(); $this->sourceDocument->expects($this->any())->method('getName')->willReturn('source_document_name'); $recordFrom = $this->getMock('Migration\\Resource\\Record', [], [], '', false); $recordFrom->expects($this->any())->method('getFields')->will($this->returnValue(['field1', 'field2'])); $recordFrom->expects($this->any())->method('getData')->will($this->returnValue(['field1' => 1, 'field2' => 2])); $recordTo = $this->getMock('Migration\\Resource\\Record', [], [], '', false); $recordTo->expects($this->any())->method('getFields')->will($this->returnValue(['field2'])); $recordTo->expects($this->once())->method('setData')->with(['field2' => 2]); $field2Handler = $this->getMock('Migration\\Handler\\SetValue', ['handle'], [], '', false); $field2Handler->expects($this->once())->method('handle'); $srcHandler->expects($this->any())->method('getHandlers')->willReturn(['field2' => $field2Handler]); $destHandler->expects($this->any())->method('getHandlers')->willReturn([]); $this->mapReader->expects($this->any())->method('getFieldMap')->with('source_document_name', 'field1')->willReturnArgument(1); $this->recordTransformer->transform($recordFrom, $recordTo); }
/** * @param Resource\Document $sourceDocument * @param Resource\Document $destinationDocument * @param string $type * @return void */ protected function verifyFields($sourceDocument, $destinationDocument, $type) { $sourceFields = array_keys($sourceDocument->getStructure()->getFields()); $destFields = $destinationDocument->getStructure()->getFields(); foreach ($sourceFields as $field) { $mappedField = $this->map->getFieldMap($sourceDocument->getName(), $field, $type); if ($mappedField && !isset($destFields[$mappedField])) { $this->missingDocumentFields[$type][$sourceDocument->getName()][] = $mappedField; } } }
/** * @param Record $from * @param Record $to * @return void */ protected function copy(Record $from, Record $to) { $sourceDocumentName = $this->sourceDocument->getName(); $data = $from->getData(); $sourceFields = $from->getFields(); $destinationFields = $to->getFields(); $diff = array_diff($sourceFields, $destinationFields); foreach ($diff as $field) { if (!$this->mapReader->isFieldIgnored($sourceDocumentName, $field, MapInterface::TYPE_SOURCE)) { $fieldMap = $this->mapReader->getFieldMap($sourceDocumentName, $field, MapInterface::TYPE_SOURCE); $data[$fieldMap] = $from->getValue($field); } unset($data[$field]); } $to->setData($data); }
/** * @param Resource\Document $sourceDocument * @param Resource\Document $destinationDocument * @param string $type * @return void */ protected function verifyFields($sourceDocument, $destinationDocument, $type) { $sourceFields = $sourceDocument->getStructure()->getFields(); $destFields = $destinationDocument->getStructure()->getFields(); foreach ($sourceFields as $sourceField => $sourceFieldMetaData) { $mappedField = $this->map->getFieldMap($sourceDocument->getName(), $sourceField, $type); if ($mappedField) { if (!isset($destFields[$mappedField])) { $this->missingDocumentFields[$type][$sourceDocument->getName()][] = $mappedField; } else { if ($sourceFieldMetaData['DATA_TYPE'] != $destFields[$mappedField]['DATA_TYPE'] && !$this->map->isFieldDataTypeIgnored($sourceDocument->getName(), $sourceField, $type)) { $this->mismatchDocumentFieldDataTypes[$type][$sourceDocument->getName()][] = $sourceField; } } } } }