/**
  * Returns associations fields (resolves once)
  *
  * @return array
  */
 protected function getOptionalAssociationFields()
 {
     if (empty($this->optionalAssocFields)) {
         $this->optionalAssocFields = $this->assocColumnsResolver->resolveAssociationColumns();
     }
     return $this->optionalAssocFields;
 }
 /**
  * Denormalize product associations
  *
  * @param string           &$data
  * @param string           $format
  * @param array            $context
  * @param ProductInterface $product
  *
  * @throws \RuntimeException
  */
 protected function denormalizeAssociations(&$data, $format, array $context, ProductInterface $product)
 {
     foreach ($product->getAssociations() as $association) {
         foreach ($association->getGroups() as $group) {
             $association->removeGroup($group);
         }
         foreach ($association->getProducts() as $prod) {
             $association->removeProduct($prod);
         }
     }
     // Get association field names and add associations
     $assocFieldNames = $this->assocFieldResolver->resolveAssociationColumns();
     foreach ($assocFieldNames as $assocFieldName) {
         if (isset($data[$assocFieldName])) {
             if (strlen($data[$assocFieldName]) > 0) {
                 list($associationTypeCode, $part) = explode('-', $assocFieldName);
                 $association = $product->getAssociationForTypeCode($associationTypeCode);
                 $association = $this->serializer->denormalize($data[$assocFieldName], $this->associationClass, $format, ['entity' => $association, 'association_type_code' => $associationTypeCode, 'part' => $part] + $context);
                 if (!$product->getAssociationForTypeCode($associationTypeCode)) {
                     $product->addAssociation($association);
                 }
             }
             unset($data[$assocFieldName]);
         }
     }
     foreach (array_keys($data) as $fieldName) {
         if (null !== ($matches = $this->extractAssociationFieldNameInfos($fieldName))) {
             throw new \RuntimeException(sprintf('Association type "%s" does not exist anymore', $matches['assoc_type_code']));
         }
     }
 }
 /**
  * @param string $column
  *
  * @return bool
  */
 public function supportsColumn($column)
 {
     $associationFields = $this->assocFieldResolver->resolveAssociationColumns();
     $fields = array_merge(['categories', 'groups', 'enabled', 'family'], $associationFields);
     return in_array($column, $fields);
 }