예제 #1
0
 /**
  * @dataProvider saveRecordsDataSet()
  * @param string|null @prefix
  */
 public function testSaveRecords($prefix)
 {
     $resourceName = 'core_config_data';
     $this->config->expects($this->any())->method('getOption')->willReturnMap([['bulk_size', 3], ['dest_prefix', $prefix]]);
     $this->adapter->expects($this->at(0))->method('insertRecords')->with($prefix . $resourceName, [['data' => 'value1'], ['data' => 'value2'], ['data' => 'value3']])->will($this->returnSelf());
     $this->adapter->expects($this->at(1))->method('insertRecords')->with($prefix . $resourceName, [['data' => 'value4']])->will($this->returnSelf());
     $records = $this->getMock('\\Migration\\Resource\\Record\\Collection', [], [], '', false);
     $records->expects($this->any())->method('current')->willReturnCallback(function () {
         static $count = 0;
         $count++;
         $data = ['data' => "value{$count}"];
         $record = $this->getMock('\\Migration\\Resource\\Record', ['getData'], [], '', false);
         $record->expects($this->once())->method('getData')->will($this->returnValue($data));
         return $record;
     });
     $records->expects($this->any())->method('valid')->willReturnCallback(function () {
         static $count = 0;
         $count++;
         if ($count <= 4) {
             return true;
         } else {
             return false;
         }
     });
     $this->resourceDestination->saveRecords($resourceName, $records);
 }
예제 #2
0
 /**
  * @param Record $recordToHandle
  * @param Record $oppositeRecord
  * @return void
  */
 public function handle(Record $recordToHandle, Record $oppositeRecord)
 {
     $this->validate($recordToHandle);
     $ids = explode(',', $recordToHandle->getValue($this->field));
     $normalizedRecords = [];
     foreach ($ids as $id) {
         $normalizedRecords[] = ['rule_id' => $recordToHandle->getValue('rule_id'), $this->normalizationField => $id];
     }
     if ($normalizedRecords) {
         $this->destination->clearDocument($this->normalizationDocument);
         $this->destination->saveRecords($this->normalizationDocument, $normalizedRecords);
     }
 }
예제 #3
0
 /**
  * @return bool
  */
 protected function data()
 {
     $this->progress->start(count($this->getDocumentList()));
     $documents = $this->getDocumentList();
     foreach ($documents as $sourceDocName => $destDocName) {
         $this->progress->advance();
         $sourceDocument = $this->source->getDocument($sourceDocName);
         $destinationDocument = $this->destination->getDocument($destDocName);
         $this->destination->clearDocument($destDocName);
         $pageNumber = 0;
         while (!empty($sourceRecords = $this->source->getRecords($sourceDocName, $pageNumber))) {
             $pageNumber++;
             $recordsToSave = $destinationDocument->getRecords();
             foreach ($sourceRecords as $recordData) {
                 /** @var Resource\Record $destinationRecord */
                 $destinationRecord = $this->recordFactory->create(['document' => $destinationDocument]);
                 if ($this->haveEqualStructure($sourceDocument, $destinationDocument)) {
                     $destinationRecord->setData($recordData);
                 } else {
                     $destinationRecord = $this->transformRecord($destinationRecord, $recordData);
                 }
                 $recordsToSave->addRecord($destinationRecord);
             }
             $this->destination->saveRecords($destinationDocument->getName(), $recordsToSave);
         }
     }
     $this->progress->finish();
     return true;
 }
예제 #4
0
 /**
  * Run step
  *
  * @return bool
  */
 protected function data()
 {
     $this->progress->start($this->source->getRecordsCount(self::SOURCE));
     $sourceDocument = $this->source->getDocument(self::SOURCE);
     $destDocument = $this->destination->getDocument(self::DESTINATION);
     $destProductCategory = $this->destination->getDocument(self::DESTINATION_PRODUCT_CATEGORY);
     $this->destination->clearDocument(self::DESTINATION);
     $this->destination->clearDocument(self::DESTINATION_PRODUCT_CATEGORY);
     $pageNumber = 0;
     while (!empty($bulk = $this->source->getRecords(self::SOURCE, $pageNumber))) {
         $pageNumber++;
         $destinationRecords = $destDocument->getRecords();
         $destProductCategoryRecords = $destProductCategory->getRecords();
         foreach ($bulk as $recordData) {
             $this->progress->advance();
             /** @var Record $record */
             $record = $this->recordFactory->create(['document' => $sourceDocument, 'data' => $recordData]);
             /** @var Record $destRecord */
             $destRecord = $this->recordFactory->create(['document' => $destDocument]);
             $this->transform($record, $destRecord);
             if ($record->getValue('is_system') && $record->getValue('product_id') && $record->getValue('category_id')) {
                 $destProductCategoryRecord = $this->recordFactory->create(['document' => $destProductCategory]);
                 $destProductCategoryRecord->setValue('url_rewrite_id', $record->getValue('url_rewrite_id'));
                 $destProductCategoryRecord->setValue('category_id', $record->getValue('category_id'));
                 $destProductCategoryRecord->setValue('product_id', $record->getValue('product_id'));
                 $destProductCategoryRecords->addRecord($destProductCategoryRecord);
             }
             $destinationRecords->addRecord($destRecord);
         }
         $this->destination->saveRecords(self::DESTINATION, $destinationRecords);
         $this->destination->saveRecords(self::DESTINATION_PRODUCT_CATEGORY, $destProductCategoryRecords);
     }
     $this->progress->finish();
     return true;
 }
예제 #5
0
 /**
  * @return bool
  */
 public function perform()
 {
     $this->helper->init();
     $this->progress->start($this->getIterationsCount(), LogManager::LOG_LEVEL_INFO);
     $document = $this->helper->getDocumentList();
     $sourceDocumentName = $document['source'];
     $destinationDocumentName = $document['destination'];
     $destinationDocument = $this->destination->getDocument($destinationDocumentName);
     $pageNumber = 0;
     $this->logger->debug('migrating', ['table' => $sourceDocumentName]);
     $this->progress->start($this->source->getRecordsCount($sourceDocumentName), LogManager::LOG_LEVEL_DEBUG);
     /** @var \Magento\Framework\DB\Select $select */
     $select = $this->getConfigurablePrice($sourceDocumentName);
     while (!empty($bulk = $this->getRecords($select, $pageNumber))) {
         $pageNumber++;
         $destinationCollection = $destinationDocument->getRecords();
         foreach ($bulk as $recordData) {
             $this->progress->advance(LogManager::LOG_LEVEL_INFO);
             $this->progress->advance(LogManager::LOG_LEVEL_DEBUG);
             /** @var Record $destinationRecord */
             $destinationRecord = $this->recordFactory->create(['document' => $destinationDocument, 'data' => $recordData]);
             $destinationCollection->addRecord($destinationRecord);
         }
         $this->destination->saveRecords($destinationDocumentName, $destinationCollection);
         $this->progress->finish(LogManager::LOG_LEVEL_DEBUG);
     }
     $this->progress->finish(LogManager::LOG_LEVEL_INFO);
     return true;
 }
 /**
  * @param string $sourceName
  * @param string $destinationName
  * @param string $type
  * @return void
  */
 protected function copyEavData($sourceName, $destinationName, $type)
 {
     $destinationDocument = $this->destination->getDocument($destinationName);
     $pageNumber = 0;
     while (!empty($recordsData = $this->source->getRecords($sourceName, $pageNumber))) {
         $pageNumber++;
         $records = $destinationDocument->getRecords();
         foreach ($recordsData as $row) {
             $this->progress->advance();
             unset($row['value_id']);
             unset($row['entity_type_id']);
             if (!empty($this->resolvedDuplicates[$type][$row['entity_id']][$row['store_id']])) {
                 $row['value'] = $row['value'] . '-' . $this->resolvedDuplicates[$type][$row['entity_id']][$row['store_id']];
             } elseif (!empty($this->resolvedDuplicates[$type][$row['entity_id']]) && $row['store_id'] == 0) {
                 foreach ($this->resolvedDuplicates[$type][$row['entity_id']] as $storeId => $urlKey) {
                     $storeRow = $row;
                     $storeRow['store_id'] = $storeId;
                     $storeRow['value'] = $storeRow['value'] . '-' . $urlKey;
                     $records->addRecord($this->recordFactory->create(['data' => $storeRow]));
                     if (!isset($this->resolvedDuplicates[$destinationName])) {
                         $this->resolvedDuplicates[$destinationName] = 0;
                     }
                     $this->resolvedDuplicates[$destinationName]++;
                 }
             }
             $records->addRecord($this->recordFactory->create(['data' => $row]));
         }
         $this->destination->saveRecords($destinationName, $records, true);
     }
 }
예제 #7
0
 /**
  * @return bool
  * @throws \Migration\Exception
  */
 protected function data()
 {
     $destinationDocument = $this->destination->getDocument(self::CONFIG_TABLE_NAME_DESTINATION);
     $recordsCountSource = $this->source->getRecordsCount(self::CONFIG_TABLE_NAME_SOURCE);
     $recordsCountDestination = $this->destination->getRecordsCount(self::CONFIG_TABLE_NAME_DESTINATION);
     $this->progress->start($recordsCountSource);
     $sourceRecords = $this->source->getRecords(self::CONFIG_TABLE_NAME_SOURCE, 0, $recordsCountSource);
     $destinationRecords = $this->destination->getRecords(self::CONFIG_TABLE_NAME_DESTINATION, 0, $recordsCountDestination);
     foreach ($sourceRecords as $sourceRecord) {
         $this->progress->advance();
         if (!$this->readerSettings->isNodeIgnored($sourceRecord[self::CONFIG_FIELD_PATH])) {
             $sourceRecordPathMapped = $this->readerSettings->getNodeMap($sourceRecord[self::CONFIG_FIELD_PATH]);
             foreach ($destinationRecords as &$destinationRecord) {
                 if ($destinationRecord[self::CONFIG_FIELD_SCOPE] == $sourceRecord[self::CONFIG_FIELD_SCOPE] && $destinationRecord[self::CONFIG_FIELD_SCOPE_ID] == $sourceRecord[self::CONFIG_FIELD_SCOPE_ID] && $destinationRecord[self::CONFIG_FIELD_PATH] == $sourceRecordPathMapped) {
                     $record = $this->applyHandler($destinationDocument, $sourceRecord, $destinationRecord);
                     $destinationRecord[self::CONFIG_FIELD_VALUE] = $record->getValue(self::CONFIG_FIELD_VALUE);
                     continue 2;
                 }
             }
             $record = $this->applyHandler($destinationDocument, $sourceRecord, []);
             $record->setValue(self::CONFIG_FIELD_PATH, $sourceRecordPathMapped);
             $destinationRecords[] = $record->getData();
         }
     }
     foreach ($destinationRecords as &$destinationRecord) {
         unset($destinationRecord[self::CONFIG_FIELD_CONFIG_ID]);
     }
     $this->destination->clearDocument(self::CONFIG_TABLE_NAME_DESTINATION);
     $this->destination->saveRecords(self::CONFIG_TABLE_NAME_DESTINATION, $destinationRecords);
     $this->progress->finish();
     return true;
 }
예제 #8
0
파일: Data.php 프로젝트: okite11/frames21
 /**
  * @return bool
  */
 public function perform()
 {
     $this->progressBar->start(count($this->source->getDocumentList()), LogManager::LOG_LEVEL_INFO);
     $sourceDocuments = $this->source->getDocumentList();
     $stage = 'run';
     $processedDocuments = $this->progress->getProcessedEntities($this, $stage);
     foreach (array_diff($sourceDocuments, $processedDocuments) as $sourceDocName) {
         $this->progressBar->advance(LogManager::LOG_LEVEL_INFO);
         $sourceDocument = $this->source->getDocument($sourceDocName);
         $destinationName = $this->map->getDocumentMap($sourceDocName, MapInterface::TYPE_SOURCE);
         if (!$destinationName) {
             continue;
         }
         $destDocument = $this->destination->getDocument($destinationName);
         $this->destination->clearDocument($destinationName);
         $this->logger->debug('migrating', ['table' => $sourceDocName]);
         $recordTransformer = $this->getRecordTransformer($sourceDocument, $destDocument);
         $doCopy = $recordTransformer === null && $this->copyDirectly;
         if ($doCopy && $this->isCopiedDirectly($sourceDocument, $destDocument)) {
             $this->progressBar->start(1, LogManager::LOG_LEVEL_DEBUG);
         } else {
             $pageNumber = 0;
             $this->progressBar->start(ceil($this->source->getRecordsCount($sourceDocName) / $this->source->getPageSize($sourceDocName)), LogManager::LOG_LEVEL_DEBUG);
             while (!empty($items = $this->source->getRecords($sourceDocName, $pageNumber))) {
                 $pageNumber++;
                 $destinationRecords = $destDocument->getRecords();
                 foreach ($items as $data) {
                     if ($recordTransformer) {
                         /** @var Record $record */
                         $record = $this->recordFactory->create(['document' => $sourceDocument, 'data' => $data]);
                         /** @var Record $destRecord */
                         $destRecord = $this->recordFactory->create(['document' => $destDocument]);
                         $recordTransformer->transform($record, $destRecord);
                     } else {
                         $destRecord = $this->recordFactory->create(['document' => $destDocument, 'data' => $data]);
                     }
                     $destinationRecords->addRecord($destRecord);
                 }
                 $this->source->setLastLoadedRecord($sourceDocName, end($items));
                 $this->progressBar->advance(LogManager::LOG_LEVEL_DEBUG);
                 $this->destination->saveRecords($destinationName, $destinationRecords);
             }
         }
         $this->source->setLastLoadedRecord($sourceDocName, []);
         $this->progress->addProcessedEntity($this, $stage, $sourceDocName);
         $this->progressBar->finish(LogManager::LOG_LEVEL_DEBUG);
     }
     $this->progressBar->finish(LogManager::LOG_LEVEL_INFO);
     return true;
 }
예제 #9
0
 /**
  * @return bool
  */
 public function perform()
 {
     $this->progressBar->start(count($this->source->getDocumentList()), LogManager::LOG_LEVEL_INFO);
     $sourceDocuments = $this->source->getDocumentList();
     // TODO: during steps refactoring MAGETWO-35749 stage will be removed
     $stage = 'run';
     $processedDocuments = $this->progress->getProcessedEntities($this, $stage);
     foreach ($sourceDocuments as $sourceDocName) {
         $this->progressBar->advance(LogManager::LOG_LEVEL_INFO);
         if (in_array($sourceDocName, $processedDocuments)) {
             continue;
         }
         $sourceDocument = $this->source->getDocument($sourceDocName);
         $destinationName = $this->map->getDocumentMap($sourceDocName, MapInterface::TYPE_SOURCE);
         if (!$destinationName) {
             continue;
         }
         $destDocument = $this->destination->getDocument($destinationName);
         $this->destination->clearDocument($destinationName);
         $recordTransformer = $this->getRecordTransformer($sourceDocument, $destDocument);
         $pageNumber = 0;
         $this->logger->debug('migrating', ['table' => $sourceDocName]);
         $this->progressBar->start($this->source->getRecordsCount($sourceDocName), LogManager::LOG_LEVEL_DEBUG);
         while (!empty($items = $this->source->getRecords($sourceDocName, $pageNumber))) {
             $pageNumber++;
             $destinationRecords = $destDocument->getRecords();
             foreach ($items as $data) {
                 $this->progressBar->advance(LogManager::LOG_LEVEL_DEBUG);
                 if ($recordTransformer) {
                     /** @var Record $record */
                     $record = $this->recordFactory->create(['document' => $sourceDocument, 'data' => $data]);
                     /** @var Record $destRecord */
                     $destRecord = $this->recordFactory->create(['document' => $destDocument]);
                     $recordTransformer->transform($record, $destRecord);
                 } else {
                     $destRecord = $this->recordFactory->create(['document' => $destDocument, 'data' => $data]);
                 }
                 $destinationRecords->addRecord($destRecord);
             }
             $this->destination->saveRecords($destinationName, $destinationRecords);
         }
         $this->progress->addProcessedEntity($this, $stage, $sourceDocName);
         $this->progressBar->finish(LogManager::LOG_LEVEL_DEBUG);
     }
     $this->progressBar->finish(LogManager::LOG_LEVEL_INFO);
     return true;
 }
예제 #10
0
파일: Data.php 프로젝트: okite11/frames21
 /**
  * @return bool
  */
 public function perform()
 {
     $this->progress->start($this->getIterationsCount(), LogManager::LOG_LEVEL_INFO);
     $sourceDocuments = array_keys($this->readerGroups->getGroup('source_documents'));
     foreach ($sourceDocuments as $sourceDocName) {
         $sourceDocument = $this->source->getDocument($sourceDocName);
         $destinationName = $this->map->getDocumentMap($sourceDocName, MapInterface::TYPE_SOURCE);
         if (!$destinationName) {
             continue;
         }
         $destDocument = $this->destination->getDocument($destinationName);
         $this->destination->clearDocument($destinationName);
         /** @var \Migration\RecordTransformer $recordTransformer */
         $recordTransformer = $this->recordTransformerFactory->create(['sourceDocument' => $sourceDocument, 'destDocument' => $destDocument, 'mapReader' => $this->map]);
         $recordTransformer->init();
         $attributeType = $this->helper->getAttributeType($sourceDocName);
         $pageNumber = 0;
         $this->logger->debug('migrating', ['table' => $sourceDocName]);
         $this->progress->start(ceil($this->source->getRecordsCount($sourceDocName) / $this->source->getPageSize($sourceDocName)), LogManager::LOG_LEVEL_DEBUG);
         while (!empty($bulk = $this->source->getRecords($sourceDocName, $pageNumber))) {
             $pageNumber++;
             $destinationRecords = $destDocument->getRecords();
             foreach ($bulk as $recordData) {
                 $this->source->setLastLoadedRecord($sourceDocName, $recordData);
                 if ($this->helper->isSkipRecord($attributeType, $sourceDocName, $recordData)) {
                     continue;
                 }
                 /** @var Record $record */
                 $record = $this->recordFactory->create(['document' => $sourceDocument, 'data' => $recordData]);
                 /** @var Record $destRecord */
                 $destRecord = $this->recordFactory->create(['document' => $destDocument]);
                 $recordTransformer->transform($record, $destRecord);
                 $destinationRecords->addRecord($destRecord);
             }
             $this->progress->advance(LogManager::LOG_LEVEL_INFO);
             $this->progress->advance(LogManager::LOG_LEVEL_DEBUG);
             $this->helper->updateAttributeData($attributeType, $sourceDocName, $destinationRecords);
             $this->destination->saveRecords($destinationName, $destinationRecords);
         }
         $this->progress->finish(LogManager::LOG_LEVEL_DEBUG);
     }
     $this->helper->updateEavAttributes();
     $this->progress->finish(LogManager::LOG_LEVEL_INFO);
     return true;
 }
예제 #11
0
 /**
  * @param Document $document
  * @param Record\Collection $recordsToSave
  * @return void
  */
 protected function saveRecords(Document $document, Record\Collection $recordsToSave)
 {
     $this->destination->clearDocument($document->getName());
     $this->destination->saveRecords($document->getName(), $recordsToSave);
 }