/**
  * @param ContainerBuilder $container
  *
  * @throws \InvalidArgumentException
  */
 public function process(ContainerBuilder $container)
 {
     $config = $container->getExtensionConfig('elastica')[0];
     $jsonLdFrameLoader = $container->get('nemrod.elastica.jsonld.frame.loader.filesystem');
     $confManager = $container->getDefinition('nemrod.elastica.config_manager');
     $filiationBuilder = $container->get('nemrod.filiation.builder');
     $jsonLdFrameLoader->setFiliationBuilder($filiationBuilder);
     foreach ($config['indexes'] as $name => $index) {
         $indexName = isset($index['index_name']) ? $index['index_name'] : $name;
         foreach ($index['types'] as $typeName => $settings) {
             $jsonLdFrameLoader->setEsIndex($name);
             $frame = $jsonLdFrameLoader->load($settings['frame'], null, true, true, true);
             $type = !empty($frame['@type']) ? $frame['@type'] : $settings['type'];
             if (empty($type)) {
                 throw \Exception("You must provide a RDF Type.");
             }
             //type
             $typeId = 'nemrod.elastica.type.' . $name . '.' . $typeName;
             $indexId = 'nemrod.elastica.index.' . $name;
             $typeDef = new DefinitionDecorator('nemrod.elastica.type.abstract');
             $typeDef->replaceArgument(0, $type);
             $typeDef->setFactory(array(new Reference($indexId), 'getType'));
             $typeDef->addTag('nemrod.elastica.type', array('index' => $name, 'name' => $typeName, 'type' => $type));
             $container->setDefinition($typeId, $typeDef);
             //registering config to configManager
             $confManager->addMethodCall('setTypeConfigurationArray', array($name, $typeName, $type, $frame));
         }
     }
 }
 /**
  * {@inheritDoc}
  */
 public function load(array $configs, ContainerBuilder $container)
 {
     $loader = new XmlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config/'));
     $loader->load('services.xml');
     $processor = new Processor();
     $config = $processor->processConfiguration(new Configuration(), $configs);
     $collection = 'in_memory';
     switch (true) {
         case 'redis' === $config['persistence']:
             $loader->load('redis.xml');
             $collection = 'predis';
             $container->setParameter('qandidate.toggle.redis.namespace', $config['redis_namespace']);
             $container->setAlias('qandidate.toggle.redis.client', $config['redis_client']);
             break;
         case 'factory' === $config['persistence']:
             $collection = 'factory';
             $definition = new DefinitionDecorator('qandidate.toggle.collection.in_memory');
             $definition->setFactory(array(new Reference($config['collection_factory']['service_id']), $config['collection_factory']['method']));
             $container->setDefinition('qandidate.toggle.collection.factory', $definition);
             break;
     }
     $container->setAlias('qandidate.toggle.collection', 'qandidate.toggle.collection.' . $collection);
     $contextFactoryService = 'qandidate.toggle.user_context_factory';
     if (null !== $config['context_factory']) {
         $contextFactoryService = $config['context_factory'];
     }
     $container->setAlias('qandidate.toggle.context_factory', $contextFactoryService);
 }
 /**
  * Loads the configured types.
  *
  * @param array            $types
  * @param ContainerBuilder $container
  * @param array            $indexConfig
  * @param array            $indexableCallbacks
  */
 private function loadTypes(array $types, ContainerBuilder $container, array $indexConfig, array &$indexableCallbacks)
 {
     foreach ($types as $name => $type) {
         $indexName = $indexConfig['name'];
         $typeId = sprintf('%s.%s', $indexConfig['reference'], $name);
         $typeDef = new DefinitionDecorator('fos_elastica.type_prototype');
         $typeDef->setFactory(array($indexConfig['reference'], 'getType'));
         $typeDef->replaceArgument(0, $name);
         $container->setDefinition($typeId, $typeDef);
         $typeConfig = array('name' => $name, 'mapping' => array(), 'config' => array());
         foreach (array('dynamic_templates', 'properties', '_all', '_boost', '_id', '_parent', '_routing', '_source', '_timestamp', '_ttl') as $field) {
             if (isset($type[$field])) {
                 $typeConfig['mapping'][$field] = $type[$field];
             }
         }
         foreach (array('persistence', 'serializer', 'analyzer', 'search_analyzer', 'dynamic', 'date_detection', 'dynamic_date_formats', 'numeric_detection') as $field) {
             $typeConfig['config'][$field] = array_key_exists($field, $type) ? $type[$field] : null;
         }
         $this->indexConfigs[$indexName]['types'][$name] = $typeConfig;
         if (isset($type['persistence'])) {
             $this->loadTypePersistenceIntegration($type['persistence'], $container, new Reference($typeId), $indexName, $name);
             $typeConfig['persistence'] = $type['persistence'];
         }
         if (isset($type['_parent'])) {
             // _parent mapping cannot contain `property` and `identifier`, so removing them after building `persistence`
             unset($indexConfig['types'][$name]['mapping']['_parent']['property'], $indexConfig['types'][$name]['mapping']['_parent']['identifier']);
         }
         if (isset($type['indexable_callback'])) {
             $indexableCallbacks[sprintf('%s/%s', $indexName, $name)] = $type['indexable_callback'];
         }
         if ($container->hasDefinition('fos_elastica.serializer_callback_prototype')) {
             $typeSerializerId = sprintf('%s.serializer.callback', $typeId);
             $typeSerializerDef = new DefinitionDecorator('fos_elastica.serializer_callback_prototype');
             if (isset($type['serializer']['groups'])) {
                 $typeSerializerDef->addMethodCall('setGroups', array($type['serializer']['groups']));
             }
             if (isset($type['serializer']['serialize_null'])) {
                 $typeSerializerDef->addMethodCall('setSerializeNull', array($type['serializer']['serialize_null']));
             }
             if (isset($type['serializer']['version'])) {
                 $typeSerializerDef->addMethodCall('setVersion', array($type['serializer']['version']));
             }
             $typeDef->addMethodCall('setSerializer', array(array(new Reference($typeSerializerId), 'serialize')));
             $container->setDefinition($typeSerializerId, $typeSerializerDef);
         }
     }
 }
Esempio n. 4
0
 /**
  * Loads the configured indexes.
  *
  * @param array $indexes An array of indexes configurations
  * @param ContainerBuilder $container A ContainerBuilder instance
  * @throws \InvalidArgumentException
  * @return array
  */
 private function loadIndexes(array $indexes, ContainerBuilder $container)
 {
     $confManager = $container->getDefinition('nemrod.elastica.config_manager');
     $indexRegistry = $container->getDefinition('nemrod.elastica.index_registry');
     foreach ($indexes as $name => $index) {
         $indexId = sprintf('nemrod.elastica.index.%s', $name);
         $indexName = isset($index['index_name']) ? $index['index_name'] : $name;
         $indexDef = new DefinitionDecorator('nemrod.elastica.index.abstract');
         $indexDef->replaceArgument(0, $indexName);
         $indexDef->addTag('nemrod.elastica.index', array('name' => $name));
         if (isset($index['client'])) {
             $clientId = 'nemrod.elastica.client.' . $index['client'];
             $indexDef->setFactory(array(new Reference($clientId), 'getIndex'));
         }
         $container->setDefinition($indexId, $indexDef);
         $reference = new Reference($indexId);
         $this->indexConfigs[$name] = array('elasticsearch_name' => $indexName, 'reference' => $reference, 'name' => $name, 'settings' => $index['settings']);
         $confManager->addMethodCall('setIndexConfigurationArray', array($name, $this->indexConfigs[$name]));
         $indexRegistry->addMethodCall('registerIndex', array($name, $reference));
     }
 }