/**
  * {@inheritdoc}
  */
 public function perform()
 {
     $this->progress->start(1);
     $this->progress->advance();
     $ratingsShouldBeActive = [];
     $ratingsIsActive = [];
     /** @var \Migration\ResourceModel\Adapter\Mysql $adapter */
     $adapter = $this->destination->getAdapter();
     /** @var \Magento\Framework\DB\Select $select */
     $select = $adapter->getSelect()->from($this->getRatingStoreDocument(), ['rating_id'])->where('store_id > 0');
     $ratingsStore = $adapter->loadDataFromSelect($select);
     foreach ($ratingsStore as $rating) {
         $ratingsShouldBeActive[] = $rating['rating_id'];
     }
     $ratingsShouldBeActive = array_unique($ratingsShouldBeActive);
     /** @var \Magento\Framework\DB\Select $select */
     $select = $adapter->getSelect()->from($this->getRatingDocument(), ['rating_id'])->where('is_active = ?', 1);
     $ratings = $adapter->loadDataFromSelect($select);
     foreach ($ratings as $rating) {
         $ratingsIsActive[] = $rating['rating_id'];
     }
     if (count(array_intersect($ratingsShouldBeActive, $ratingsIsActive)) != count($ratingsShouldBeActive)) {
         $this->errors[] = sprintf('Mismatch of entities in the documents: %s, %s', self::RATING_TABLE_NAME, self::RATING_STORE_TABLE_NAME);
     }
     $this->progress->finish();
     return $this->checkForErrors(Logger::ERROR);
 }
 /**
  * @throws \Zend_Db_Adapter_Exception
  * @return void
  */
 public function updateEavAttributes()
 {
     /** @var Mysql $adapter */
     $adapter = $this->destination->getAdapter();
     $query = $adapter->getSelect()->from($this->destination->addDocumentPrefix('eav_entity_type'), ['entity_type_id', 'entity_type_code']);
     $entityTypes = $query->getAdapter()->fetchAll($query);
     $entityTypesByCode = [];
     foreach ($entityTypes as $entityType) {
         $entityTypesByCode[$entityType['entity_type_code']] = $entityType['entity_type_id'];
     }
     $where = [];
     $entities = array_keys($this->readerGroups->getGroup('eav_entities'));
     foreach ($entities as $entity) {
         $documents = $this->readerGroups->getGroup($entity);
         $codes = [];
         foreach ($documents as $document => $key) {
             if ($key != 'entity_id') {
                 continue;
             }
             $codes = implode("','", array_keys($this->readerAttributes->getGroup($document)));
         }
         $where += [sprintf("attribute_code IN ('%s')", $codes), sprintf("entity_type_id = '%s'", $entityTypesByCode[$entity])];
     }
     $adapter->getSelect()->getAdapter()->update($this->destination->addDocumentPrefix('eav_attribute'), ['backend_type' => 'static'], $where);
 }
 /**
  * @param array $entityType
  * @param int $storeId
  * @return int
  */
 protected function addDataMetaTable(array $entityType, $storeId)
 {
     $data = ['entity_type' => $entityType['entity_type_code'], 'store_id' => $storeId, 'sequence_table' => $this->helper->getTableName($entityType['entity_type_table'], $storeId)];
     /** @var \Magento\Framework\DB\Adapter\Pdo\Mysql $adapter */
     $adapter = $this->destination->getAdapter()->getSelect()->getAdapter();
     $adapter->insert($this->helper->getTableName($this->helper->getSequenceMetaTable()), $data);
     return $adapter->lastInsertId($this->helper->getTableName($this->helper->getSequenceMetaTable()), 'meta_id');
 }
 /**
  * @param string $documentName
  * @param string $idKey
  * @param string $destinationName
  * @return void
  */
 protected function processDeletedRecords($documentName, $idKey, $destinationName)
 {
     $this->destination->getAdapter()->setForeignKeyChecks(1);
     while (!empty($items = $this->source->getDeletedRecords($documentName, $idKey))) {
         $this->destination->deleteRecords($this->destination->addDocumentPrefix($destinationName), $idKey, $items);
         $documentNameDelta = $this->source->getDeltaLogName($documentName);
         $documentNameDelta = $this->source->addDocumentPrefix($documentNameDelta);
         $this->markRecordsProcessed($documentNameDelta, $idKey, $items);
     }
     $this->destination->getAdapter()->setForeignKeyChecks(0);
 }
 /**
  * @return bool
  */
 public function perform()
 {
     $this->progressBar->start(1);
     $this->progressBar->advance();
     /** @var \Magento\Framework\DB\Adapter\Pdo\Mysql $adapter */
     $adapter = $this->destination->getAdapter()->getSelect()->getAdapter();
     foreach ($this->helper->getEntityTypeTablesMap() as $entityType) {
         foreach ($this->helper->getStoreIds() as $storeId) {
             $incrementMaxNumber = $this->helper->getMaxIncrementForEntityType($entityType['entity_type_id']);
             $select = $adapter->select()->from($this->helper->getTableName($entityType['entity_type_table'], $storeId))->order("{$entityType['column']} DESC")->limit(1);
             $lastInsertId = $adapter->fetchOne($select);
             if ($incrementMaxNumber != $lastInsertId) {
                 $this->errors[] = sprintf('Mismatch in last increment id of %s entity', $entityType['entity_type_code']);
                 continue 2;
             }
         }
     }
     $this->progressBar->finish();
     return $this->checkForErrors();
 }
 /**
  * {@inheritdoc}
  */
 public function perform()
 {
     $this->progress->start(1);
     $this->progress->advance();
     $ratingsIsActive = [];
     /** @var \Migration\ResourceModel\Adapter\Mysql $adapter */
     $adapter = $this->destination->getAdapter();
     /** @var \Magento\Framework\DB\Select $select */
     $select = $adapter->getSelect()->from($this->getRatingStoreDocument(), ['rating_id'])->where('store_id > 0');
     $ratingsStore = $adapter->loadDataFromSelect($select);
     foreach ($ratingsStore as $rating) {
         $ratingsIsActive[] = $rating['rating_id'];
     }
     $ratingsIsActive = array_unique($ratingsIsActive);
     if ($ratingsIsActive) {
         $adapter->updateDocument($this->getRatingDocument(), ['is_active' => 1], sprintf('rating_id IN (%s)', implode(',', $ratingsIsActive)));
     }
     $this->progress->finish();
     return true;
 }
 /**
  * Performance optimized way. In case when source has direct access to destination database
  *
  * @param string $methodToExecute
  * @param array $columns
  * @param string $destinationDocumentName
  * @param string $sourceGridDocument
  * @return bool|void
  */
 protected function isCopiedDirectly($methodToExecute, array $columns, $destinationDocumentName, $sourceGridDocument)
 {
     if (!$this->copyDirectly) {
         return;
     }
     $result = true;
     try {
         $entityIdsSelect = $this->getEntityIdsSelect($sourceGridDocument);
         $this->destination->getAdapter()->insertFromSelect($this->{$methodToExecute}($columns, new \Zend_Db_Expr($entityIdsSelect)), $this->destination->addDocumentPrefix($destinationDocumentName), [], \Magento\Framework\Db\Adapter\AdapterInterface::INSERT_ON_DUPLICATE);
     } catch (\Exception $e) {
         $this->copyDirectly = false;
         $this->logger->error('Document ' . $sourceGridDocument . ' can not be copied directly because of error: ' . $e->getMessage());
         $result = false;
     }
     return $result;
 }
示例#8
0
 /**
  * @param Document $sourceDocument
  * @param Document $destinationDocument
  * @return bool
  */
 protected function isCopiedDirectly(Document $sourceDocument, Document $destinationDocument)
 {
     if (!$this->copyDirectly) {
         return;
     }
     $result = true;
     $schema = $this->config->getSource()['database']['name'];
     /** @var \Magento\Framework\DB\Select $select */
     $select = $this->source->getAdapter()->getSelect();
     $select->from($this->source->addDocumentPrefix($sourceDocument->getName()), '*', $schema);
     try {
         $this->destination->getAdapter()->insertFromSelect($select, $this->destination->addDocumentPrefix($destinationDocument->getName()), array_keys($sourceDocument->getStructure()->getFields()));
     } catch (\Exception $e) {
         $this->copyDirectly = false;
         $this->logger->error('Document ' . $sourceDocument->getName() . ' can not be copied directly because of error: ' . $e->getMessage());
         $result = false;
     }
     return $result;
 }
 /**
  * {@inheritdoc}
  */
 public function perform()
 {
     $updateData = $this->helper->getUpdateData();
     $selectData = $this->helper->getSelectData();
     $sourceDocuments = $this->readerGroups->getGroup('source_documents');
     foreach ($sourceDocuments as $sourceDocName => $idKey) {
         if ($this->source->getRecordsCount($this->source->getDeltaLogName($sourceDocName)) == 0) {
             continue;
         }
         $items = $this->source->getChangedRecords($sourceDocName, $idKey, 0, true);
         if (empty($items)) {
             continue;
         }
         $this->logger->debug(sprintf('%s has changes', $sourceDocName));
         if (!$this->eolOnce) {
             $this->eolOnce = true;
             echo PHP_EOL;
         }
         $gridIdKey = $updateData[$sourceDocName]['idKey'];
         $page = 1;
         do {
             $ids = [];
             foreach ($items as $data) {
                 echo '.';
                 $ids[] = $data[$gridIdKey];
             }
             foreach ($updateData[$sourceDocName]['methods'] as $method) {
                 echo '.';
                 $destinationDocumentName = $selectData[$method]['destination'];
                 $select = call_user_func_array([$this->data, $method], [$selectData[$method]['columns'], $ids]);
                 $this->destination->getAdapter()->insertFromSelect($select, $this->destination->addDocumentPrefix($destinationDocumentName), [], \Magento\Framework\Db\Adapter\AdapterInterface::INSERT_ON_DUPLICATE);
             }
             $documentNameDelta = $this->source->getDeltaLogName($sourceDocName);
             $documentNameDelta = $this->source->addDocumentPrefix($documentNameDelta);
             $this->markRecordsProcessed($documentNameDelta, $idKey, $ids);
         } while (!empty($items = $this->source->getChangedRecords($sourceDocName, $idKey, $page++)));
     }
     return true;
 }
示例#10
0
 /**
  * Run step
  *
  * @return bool
  */
 public function perform()
 {
     /** @var \Migration\ResourceModel\Adapter\Mysql $sourceAdapter */
     $sourceAdapter = $this->source->getAdapter();
     /** @var \Migration\ResourceModel\Adapter\Mysql $destinationAdapter */
     $destinationAdapter = $this->destination->getAdapter();
     $sourceDocuments = array_keys($this->groups->getGroup('source_documents'));
     $this->progress->start($this->getIterationsCount(), LogManager::LOG_LEVEL_INFO);
     foreach ($sourceDocuments as $sourceDocumentName) {
         $destinationDocumentName = $this->map->getDocumentMap($sourceDocumentName, MapInterface::TYPE_SOURCE);
         $sourceTable = $sourceAdapter->getTableDdlCopy($this->source->addDocumentPrefix($sourceDocumentName), $this->destination->addDocumentPrefix($destinationDocumentName));
         $destinationTable = $destinationAdapter->getTableDdlCopy($this->destination->addDocumentPrefix($destinationDocumentName), $this->destination->addDocumentPrefix($destinationDocumentName));
         foreach ($sourceTable->getColumns() as $columnData) {
             $destinationTable->setColumn($columnData);
         }
         $destinationAdapter->createTableByDdl($destinationTable);
         $destinationDocument = $this->destination->getDocument($destinationDocumentName);
         $this->logger->debug('migrating', ['table' => $sourceDocumentName]);
         $pageNumber = 0;
         $this->progress->start($this->source->getRecordsCount($sourceDocumentName), LogManager::LOG_LEVEL_DEBUG);
         while (!empty($sourceRecords = $this->source->getRecords($sourceDocumentName, $pageNumber))) {
             $pageNumber++;
             $recordsToSave = $destinationDocument->getRecords();
             foreach ($sourceRecords 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]);
                 $destinationRecord->setData($recordData);
                 $recordsToSave->addRecord($destinationRecord);
             }
             $this->destination->saveRecords($destinationDocument->getName(), $recordsToSave);
         }
         $this->progress->finish(LogManager::LOG_LEVEL_DEBUG);
     }
     $this->progress->finish(LogManager::LOG_LEVEL_INFO);
     return true;
 }
 /**
  * @return void
  */
 public function testGetAdapter()
 {
     $this->assertSame($this->adapter, $this->resourceDestination->getAdapter());
 }