/**
  * @param ArticleWriterResult $articleWriterResult
  * @param array $configuratorData
  * @throws AdapterException
  */
 public function writeOrUpdateConfiguratorSet(ArticleWriterResult $articleWriterResult, $configuratorData)
 {
     $configuratorSetId = null;
     foreach ($configuratorData as $configurator) {
         if (!$this->isValid($configurator)) {
             continue;
         }
         $configurator = $this->configuratorValidator->filterEmptyString($configurator);
         $this->configuratorValidator->validate($configurator, ConfiguratorValidator::$mapper);
         /**
          * Updates the type of a configurator set
          */
         $configuratorSetId = $this->updateConfiguratorSetTypeIfConfigSetIdIsNotEmptyAndSetDoesExistAndMatchSetName($articleWriterResult->getArticleId(), $configuratorSetId, $configurator);
         if (!$configuratorSetId) {
             $configuratorSetId = $this->getConfiguratorSetIdByArticleId($articleWriterResult->getArticleId());
         }
         if (!$configuratorSetId) {
             if (empty($configurator['configSetName'])) {
                 $orderNumber = $this->getOrderNumber($articleWriterResult->getArticleId());
                 $dataSet['name'] = 'Set-' . $orderNumber;
             } else {
                 $dataSet['name'] = $configurator['configSetName'];
             }
             $dataSet['public'] = false;
             $dataSet['id'] = $configurator['configSetId'];
             if ($configurator['configSetType']) {
                 $dataSet['type'] = $configurator['configSetType'];
             }
             if (array_key_exists($dataSet['name'], $this->sets)) {
                 $configuratorSetId = $this->sets[$dataSet['name']];
             } else {
                 $configuratorSetId = $this->createSet($dataSet);
                 $this->sets[$dataSet['name']] = $configuratorSetId;
             }
         }
         if ($articleWriterResult->getMainDetailId() != $articleWriterResult->getDetailId()) {
             $this->updateArticleSetsRelation($articleWriterResult->getArticleId(), $configuratorSetId);
         }
         /**
          * configurator option
          */
         if (isset($configurator['configOptionId']) && !empty($configurator['configOptionId'])) {
             $optionResult = $this->getOptionRow($configurator['configOptionId']);
             $optionId = $optionResult['id'];
             $groupId = $optionResult['group_id'];
             if (!$optionId) {
                 $message = SnippetsHelper::getNamespace()->get('adapters/articles/config_option_not_found', 'ConfiguratorOption with id %s not found');
                 throw new AdapterException(sprintf($message, $configurator['configOptionId']));
             }
         } else {
             //gets or creates configurator group
             $groupId = $this->getConfiguratorGroup($configurator);
         }
         $this->updateGroupsRelation($configuratorSetId, $groupId);
         if (isset($configurator['configOptionName']) && !$optionId) {
             $optionId = $this->getOptionIdByOptionNameAndGroupId($configurator['configOptionName'], $groupId);
         }
         //creates option
         if (!$optionId) {
             if (isset($configurator['configOptionPosition']) && !empty($configurator['configOptionPosition'])) {
                 $position = $configurator['configOptionPosition'];
             } else {
                 $position = $this->getNextOptionPosition($groupId);
             }
             $dataOption = array('groupId' => $groupId, 'name' => $configurator['configOptionName'], 'position' => $position);
             $optionId = $this->createOption($dataOption);
         }
         $this->updateOptionRelation($articleWriterResult->getDetailId(), $optionId);
         $this->updateSetOptionRelation($configuratorSetId, $optionId);
         unset($groupId);
         unset($optionId);
     }
 }
 /**
  * @param array $records
  * @param int $index
  * @param ArticleWriterResult $articleWriterResult
  * @return array
  */
 private function filterPropertyValues($records, $index, ArticleWriterResult $articleWriterResult)
 {
     return array_filter($records['propertyValue'], function ($property) use($index, $articleWriterResult) {
         return $property['parentIndexElement'] == $index && $articleWriterResult->getMainDetailId() == $articleWriterResult->getDetailId();
     });
 }