From 2119a4b39fd13056858b9764e87187e8dbba2dd6 Mon Sep 17 00:00:00 2001 From: Lea Haensenberger Date: Thu, 10 Jan 2013 12:25:34 +0100 Subject: [PATCH] Adding support for infinite nesting level in field configurations --- DependencyInjection/Configuration.php | 160 ++++++++++++++++---------- 1 file changed, 99 insertions(+), 61 deletions(-) diff --git a/DependencyInjection/Configuration.php b/DependencyInjection/Configuration.php index 6aa179d..eaab029 100644 --- a/DependencyInjection/Configuration.php +++ b/DependencyInjection/Configuration.php @@ -3,7 +3,9 @@ namespace FOQ\ElasticaBundle\DependencyInjection; use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; +use Symfony\Component\Config\Definition\Exception\InvalidTypeException; use Symfony\Component\Config\Definition\Builder\TreeBuilder; +use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException; class Configuration { @@ -263,68 +265,104 @@ class Configuration $node ->useAttributeAsKey('name') - ->prototype('array') + ->prototype('variable') ->treatNullLike(array()) - ->addDefaultsIfNotSet() - ->children() - ->scalarNode('type')->defaultValue('string')->end() - ->scalarNode('boost')->end() - ->scalarNode('store')->end() - ->scalarNode('index')->end() - ->scalarNode('index_analyzer')->end() - ->scalarNode('search_analyzer')->end() - ->scalarNode('analyzer')->end() - ->scalarNode('term_vector')->end() - ->scalarNode('null_value')->end() - ->booleanNode('include_in_all')->defaultValue('true')->end() - ->scalarNode('lat_lon')->end() - ->arrayNode('fields') - ->useAttributeAsKey('name') - ->prototype('array') - ->treatNullLike(array()) - ->addDefaultsIfNotSet() - ->children() - ->scalarNode('type')->defaultValue('string')->end() - ->scalarNode('boost')->end() - ->scalarNode('store')->end() - ->scalarNode('index')->end() - ->scalarNode('index_analyzer')->end() - ->scalarNode('search_analyzer')->end() - ->scalarNode('analyzer')->end() - ->scalarNode('term_vector')->end() - ->scalarNode('null_value')->end() - ->booleanNode('include_in_all')->defaultValue('true')->end() - ->scalarNode('lat_lon')->end() - ->end() - ->end() - ->end() - ->arrayNode('_parent') - ->treatNullLike(array()) - ->children() - ->scalarNode('type')->end() - ->scalarNode('identifier')->defaultValue('id')->end() - ->end() - ->end() - ->arrayNode('properties') - ->useAttributeAsKey('name') - ->prototype('array') - ->treatNullLike(array()) - ->addDefaultsIfNotSet() - ->children() - ->scalarNode('type')->defaultValue('string')->end() - ->scalarNode('boost')->end() - ->scalarNode('store')->end() - ->scalarNode('index')->end() - ->scalarNode('index_analyzer')->end() - ->scalarNode('search_analyzer')->end() - ->scalarNode('analyzer')->end() - ->scalarNode('term_vector')->end() - ->scalarNode('null_value')->end() - ->booleanNode('include_in_all')->defaultValue('true')->end() - ->scalarNode('lat_lon')->end() - ->end() - ->end() - ->end() + ->validate() + ->always($a = function($v) use (&$a) { + if (!isset($v)) { + $v = array(); + } + + if (!isset($v['type'])) { + $v['type'] = 'string'; + } + + $scalars = array( + 'type', + 'boost', + 'store', + 'index', + 'index_analyzer', + 'analyzer', + 'search_analyzer', + 'term_vector', + 'null_value', + 'lat_lon', + ); + + foreach ($scalars as $scalar) { + if (isset($v[$scalar]) && !is_scalar($v[$scalar])) { + throw new InvalidTypeException(sprintf( + 'Invalid type for path "%s". Expected scalar, but got %s.', + $scalar, + gettype($v[$scalar]) + )); + } + } + + if (!isset($v['include_in_all'])) { + $v['include_in_all'] = 'true'; + } else if (!is_bool($v['include_in_all'])) { + throw new InvalidTypeException(sprintf( + 'Invalid type for path "%s". Expected boolean, but got %s.', + 'include_in_all', + gettype($v['include_in_all']) + )); + } + + + if (isset($v['fields'])) { + if ($v['type'] != 'multi_field') { + throw new InvalidConfigurationException('Configuration "fields" does not exist for type '.$v['type']); + } + foreach ($v['fields'] as $index => $field) { + $v['fields'][$index] = $a($field); + } + } else if ($v['type'] == 'multi_field') { + $v['fields'] = array(); + } + + if (isset($v['_parent'])) { + if (!is_array($v['_parent'])) { + throw new InvalidTypeException(sprintf( + 'Invalid type for path "%s". Expected array, but got %s.', + '_parent', + gettype($v['_parent']) + )); + } else { + if (!is_scalar($v['_parent']['type'])) { + throw new InvalidTypeException(sprintf( + 'Invalid type for path "%s". Expected scalar, but got %s.', + '_parent.type', + gettype($v['_parent']['type']) + )); + } + + if (!isset($v['_parent']['identifier'])) { + $v['_parent']['identifier'] = 'id'; + } else if (!is_scalar($v['_parent']['identifier'])) { + throw new InvalidTypeException(sprintf( + 'Invalid type for path "%s". Expected scalar, but got %s.', + '_parent.identifier', + gettype($v['_parent']['identifier']) + )); + } + } + } + + if (isset($v['properties'])) { + if (!in_array($v['type'], array('nested', 'object', 'array'))) { + throw new InvalidConfigurationException('Configuration "properties" does not exist for type '.$v['type']); + } + foreach ($v['properties'] as $index => $property) { + $v['properties'][$index] = $a($property); + } + } else if (in_array($v['type'], array('nested', 'object', 'array'))) { + $v['properties'] = array(); + } + + return $v; + }) ->end() ->end() ;