/**
  * @param string $entityClass
  * @param string $filterKey
  * @param array  $filterConfig
  *
  * @return ConfigInterface|null
  */
 protected function findFieldConfig($entityClass, $filterKey, $filterConfig)
 {
     $path = ConfigUtil::explodePropertyPath(isset($filterConfig[ConfigUtil::PROPERTY_PATH]) ? $filterConfig[ConfigUtil::PROPERTY_PATH] : $filterKey);
     if (count($path) === 1) {
         return $this->getFieldConfig($entityClass, reset($path));
     }
     $linkedProperty = array_pop($path);
     $classMetadata = $this->doctrineHelper->findEntityMetadataByPath($entityClass, $path);
     return null !== $classMetadata ? $this->getFieldConfig($classMetadata->name, $linkedProperty) : null;
 }
 /**
  * @param EntityMetadata $entityMetadata
  * @param string         $propertyName
  * @param string[]       $propertyPath
  */
 protected function addLinkedProperty(EntityMetadata $entityMetadata, $propertyName, array $propertyPath)
 {
     $linkedProperty = array_pop($propertyPath);
     $classMetadata = $this->doctrineHelper->findEntityMetadataByPath($entityMetadata->getClassName(), $propertyPath);
     if (null !== $classMetadata) {
         if ($classMetadata->hasAssociation($linkedProperty)) {
             $associationMetadata = $this->entityMetadataFactory->createAssociationMetadata($classMetadata, $linkedProperty);
             $associationMetadata->setName($propertyName);
             $entityMetadata->addAssociation($associationMetadata);
         } else {
             $fieldMetadata = $this->entityMetadataFactory->createFieldMetadata($classMetadata, $linkedProperty);
             $fieldMetadata->setName($propertyName);
             $entityMetadata->addField($fieldMetadata);
         }
     }
 }
 /**
  * @param ConfigContext $context
  * @param array         $fields
  * @param string        $rootEntityClass
  * @param ClassMetadata $metadata
  * @param string|null   $fieldPath
  */
 protected function processFields(ConfigContext $context, array &$fields, $rootEntityClass, ClassMetadata $metadata, $fieldPath = null)
 {
     foreach ($fields as $fieldName => &$fieldConfig) {
         if (is_array($fieldConfig)) {
             $propertyPath = !empty($fieldConfig[ConfigUtil::PROPERTY_PATH]) ? $fieldConfig[ConfigUtil::PROPERTY_PATH] : $fieldName;
             $path = ConfigUtil::explodePropertyPath($propertyPath);
             if (count($path) === 1) {
                 $this->setFieldCustomizationHandler($context, $fieldConfig, $metadata, $propertyPath, $rootEntityClass, $this->buildFieldPath($fieldName, $fieldPath));
             } else {
                 $linkedField = array_pop($path);
                 $linkedMetadata = $this->doctrineHelper->findEntityMetadataByPath($metadata->name, $path);
                 if (null !== $linkedMetadata) {
                     $this->setFieldCustomizationHandler($context, $fieldConfig, $linkedMetadata, $linkedField, $rootEntityClass, $this->buildFieldPath($fieldName, $fieldPath));
                 }
             }
         }
     }
 }
 /**
  * @param array  $definition
  * @param string $entityClass
  * @param int    $limit
  */
 protected function setLimits(array &$definition, $entityClass, $limit)
 {
     if (isset($definition[ConfigUtil::FIELDS]) && is_array($definition[ConfigUtil::FIELDS])) {
         $metadata = $this->doctrineHelper->getEntityMetadataForClass($entityClass);
         foreach ($definition[ConfigUtil::FIELDS] as $fieldName => &$fieldConfig) {
             if (is_array($fieldConfig)) {
                 $propertyPath = ConfigUtil::getPropertyPath($fieldConfig, $fieldName);
                 $path = ConfigUtil::explodePropertyPath($propertyPath);
                 if (count($path) === 1) {
                     $this->setFieldLimit($fieldConfig, $metadata, $propertyPath, $limit);
                 } else {
                     $linkedField = array_pop($path);
                     $linkedMetadata = $this->doctrineHelper->findEntityMetadataByPath($entityClass, $path);
                     if (null !== $linkedMetadata) {
                         $this->setFieldLimit($fieldConfig, $linkedMetadata, $linkedField, $limit);
                     }
                 }
             }
         }
     }
 }
 /**
  * @param array  $sectionConfig
  * @param string $entityClass
  *
  * @return array
  */
 protected function removeDuplicates(array $sectionConfig, $entityClass)
 {
     if (empty($sectionConfig[ConfigUtil::FIELDS])) {
         return $sectionConfig;
     }
     $keys = array_keys($sectionConfig[ConfigUtil::FIELDS]);
     foreach ($keys as $key) {
         $fieldPath = !empty($sectionConfig[ConfigUtil::FIELDS][$key][ConfigUtil::PROPERTY_PATH]) ? $sectionConfig[ConfigUtil::FIELDS][$key][ConfigUtil::PROPERTY_PATH] : $key;
         $path = ConfigUtil::explodePropertyPath($fieldPath);
         if (count($path) === 1) {
             continue;
         }
         $fieldName = array_pop($path);
         if (array_key_exists(implode(ConfigUtil::PATH_DELIMITER, $path), $sectionConfig[ConfigUtil::FIELDS])) {
             $metadata = $this->doctrineHelper->findEntityMetadataByPath($entityClass, $path);
             if (null !== $metadata && in_array($fieldName, $metadata->getIdentifierFieldNames(), true)) {
                 unset($sectionConfig[ConfigUtil::FIELDS][$key]);
             }
         }
     }
     return $sectionConfig;
 }