/** * {@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; }
/** * @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; }
/** * 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()); }