Adding support for infinite nesting level in field configurations

This commit is contained in:
Lea Haensenberger 2013-01-10 12:25:34 +01:00
parent 973d67f0c1
commit 2119a4b39f

View file

@ -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()
;