예제 #1
0
 /**
  * Validate data rows and save bunches to DB.
  *
  * @return $this|void
  * @SuppressWarnings(PHPMD.CyclomaticComplexity)
  */
 protected function _saveValidatedBunches()
 {
     $source = $this->_getSource();
     $currentDataSize = 0;
     $bunchRows = [];
     $startNewBunch = false;
     $nextRowBackup = [];
     $maxDataSize = $this->_resourceHelper->getMaxDataSize();
     $bunchSize = $this->_importExportData->getBunchSize();
     $source->rewind();
     $this->_dataSourceModel->cleanBunches();
     while ($source->valid() || $bunchRows) {
         if ($startNewBunch || !$source->valid()) {
             $this->_dataSourceModel->saveBunch($this->getEntityTypeCode(), $this->getBehavior(), $bunchRows);
             $bunchRows = $nextRowBackup;
             $currentDataSize = strlen(serialize($bunchRows));
             $startNewBunch = false;
             $nextRowBackup = [];
         }
         if ($source->valid()) {
             try {
                 $rowData = $source->current();
             } catch (\InvalidArgumentException $e) {
                 $this->addRowError($e->getMessage(), $this->_processedRowsCount);
                 $this->_processedRowsCount++;
                 $source->next();
                 continue;
             }
             $this->_processedRowsCount++;
             if ($this->validateRow($rowData, $source->key())) {
                 // add row to bunch for save
                 $rowData = $this->_prepareRowForDb($rowData);
                 $rowSize = strlen($this->jsonHelper->jsonEncode($rowData));
                 $isBunchSizeExceeded = $bunchSize > 0 && count($bunchRows) >= $bunchSize;
                 if ($currentDataSize + $rowSize >= $maxDataSize || $isBunchSizeExceeded) {
                     $startNewBunch = true;
                     $nextRowBackup = [$source->key() => $rowData];
                 } else {
                     $bunchRows[$source->key()] = $rowData;
                     $currentDataSize += $rowSize;
                 }
             }
             $source->next();
         }
     }
     return $this;
 }
 /**
  * Validate data rows and save bunches to DB
  *
  * @return $this
  * @SuppressWarnings(PHPMD.CyclomaticComplexity)
  * @SuppressWarnings(PHPMD.NPathComplexity)
  */
 protected function _saveValidatedBunches()
 {
     $source = $this->getSource();
     $bunchRows = [];
     $startNewBunch = false;
     $source->rewind();
     $this->_dataSourceModel->cleanBunches();
     $masterAttributeCode = $this->getMasterAttributeCode();
     while ($source->valid() || count($bunchRows) || isset($entityGroup)) {
         if ($startNewBunch || !$source->valid()) {
             /* If the end approached add last validated entity group to the bunch */
             if (!$source->valid() && isset($entityGroup)) {
                 foreach ($entityGroup as $key => $value) {
                     $bunchRows[$key] = $value;
                 }
                 unset($entityGroup);
             }
             $this->_dataSourceModel->saveBunch($this->getEntityTypeCode(), $this->getBehavior(), $bunchRows);
             $bunchRows = [];
             $startNewBunch = false;
         }
         if ($source->valid()) {
             $valid = true;
             try {
                 $rowData = $source->current();
                 foreach ($rowData as $attrName => $element) {
                     if (!mb_check_encoding($element, 'UTF-8')) {
                         $valid = false;
                         $this->addRowError(AbstractEntity::ERROR_CODE_ILLEGAL_CHARACTERS, $this->_processedRowsCount, $attrName);
                     }
                 }
             } catch (\InvalidArgumentException $e) {
                 $valid = false;
                 $this->addRowError($e->getMessage(), $this->_processedRowsCount);
             }
             if (!$valid) {
                 $this->_processedRowsCount++;
                 $source->next();
                 continue;
             }
             if (isset($rowData[$masterAttributeCode]) && trim($rowData[$masterAttributeCode])) {
                 /* Add entity group that passed validation to bunch */
                 if (isset($entityGroup)) {
                     foreach ($entityGroup as $key => $value) {
                         $bunchRows[$key] = $value;
                     }
                     $productDataSize = strlen(serialize($bunchRows));
                     /* Check if the new bunch should be started */
                     $isBunchSizeExceeded = $this->_bunchSize > 0 && count($bunchRows) >= $this->_bunchSize;
                     $startNewBunch = $productDataSize >= $this->_maxDataSize || $isBunchSizeExceeded;
                 }
                 /* And start a new one */
                 $entityGroup = [];
             }
             if (isset($entityGroup) && $this->validateRow($rowData, $source->key())) {
                 /* Add row to entity group */
                 $entityGroup[$source->key()] = $this->_prepareRowForDb($rowData);
             } elseif (isset($entityGroup)) {
                 /* In case validation of one line of the group fails kill the entire group */
                 unset($entityGroup);
             }
             $this->_processedRowsCount++;
             $source->next();
         }
     }
     return $this;
 }