From 20033709cf8ce84b169235de4e20bd888a6f8206 Mon Sep 17 00:00:00 2001 From: Tim Nagel Date: Thu, 7 Aug 2014 09:36:23 +1000 Subject: [PATCH] Fix empty mappings for old ES versions --- .travis.yml | 2 +- Configuration/TypeConfig.php | 26 ++++++++++++++++++ DependencyInjection/FOSElasticaExtension.php | 6 ++-- Index/MappingBuilder.php | 29 +++++++++++++++----- Tests/Functional/MappingToElasticaTest.php | 10 +++++-- Tests/Functional/app/Basic/config.yml | 2 ++ 6 files changed, 62 insertions(+), 13 deletions(-) diff --git a/.travis.yml b/.travis.yml index 76a2969..8ccaa8d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,7 +7,7 @@ php: - 5.6 before_script: - - /usr/share/elasticsearch -v + - /usr/share/elasticsearch/bin/elasticsearch -v - sudo /usr/share/elasticsearch/bin/plugin -install elasticsearch/elasticsearch-mapper-attachments/2.0.0 - sudo service elasticsearch restart - echo "extension = mongo.so" >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini diff --git a/Configuration/TypeConfig.php b/Configuration/TypeConfig.php index 5d3f084..3f1c939 100644 --- a/Configuration/TypeConfig.php +++ b/Configuration/TypeConfig.php @@ -35,6 +35,14 @@ class TypeConfig $this->name = $name; } + /** + * @return string|null + */ + public function getIndexAnalyzer() + { + return $this->getConfig('index_analyzer'); + } + /** * @return array */ @@ -43,6 +51,9 @@ class TypeConfig return $this->mapping; } + /** + * @return string|null + */ public function getModel() { return isset($this->config['persistence']['model']) ? @@ -57,4 +68,19 @@ class TypeConfig { return $this->name; } + + /** + * @return string|null + */ + public function getSearchAnalyzer() + { + return $this->getConfig('search_analyzer'); + } + + private function getConfig($key) + { + return isset($this->config[$key]) ? + $this->config[$key] : + null; + } } diff --git a/DependencyInjection/FOSElasticaExtension.php b/DependencyInjection/FOSElasticaExtension.php index e523bf4..aefa7fe 100644 --- a/DependencyInjection/FOSElasticaExtension.php +++ b/DependencyInjection/FOSElasticaExtension.php @@ -220,9 +220,7 @@ class FOSElasticaExtension extends Extension foreach (array( 'dynamic_templates', - 'index_analyzer', 'properties', - 'search_analyzer', '_all', '_boost', '_id', @@ -239,7 +237,9 @@ class FOSElasticaExtension extends Extension foreach (array( 'persistence', - 'serializer' + 'serializer', + 'index_analyzer', + 'search_analyzer', ) as $field) { $typeConfig['config'][$field] = array_key_exists($field, $type) ? $type[$field] : diff --git a/Index/MappingBuilder.php b/Index/MappingBuilder.php index fc67420..21ae871 100644 --- a/Index/MappingBuilder.php +++ b/Index/MappingBuilder.php @@ -18,7 +18,7 @@ class MappingBuilder { /** * Skip adding default information to certain fields. - * + * * @var array */ private $skipTypes = array('completion'); @@ -36,10 +36,11 @@ class MappingBuilder $typeMappings[$typeConfig->getName()] = $this->buildTypeMapping($typeConfig); } - $mapping = array( - 'mappings' => $typeMappings, - // 'warmers' => $indexConfig->getWarmers(), - ); + $mapping = array(); + if ($typeMappings) { + $mapping['mappings'] = $typeMappings; + } + // 'warmers' => $indexConfig->getWarmers(), $settings = $indexConfig->getSettings(); if ($settings) { @@ -61,22 +62,36 @@ class MappingBuilder // 'date_detection' => true, // 'dynamic_date_formats' => array() // 'dynamic_templates' => $typeConfig->getDynamicTemplates(), - // 'index_analyzer' => $typeConfig->getIndexAnalyzer(), // 'numeric_detection' => false, // 'properties' => array(), - // 'search_analyzer' => $typeConfig->getSearchAnalyzer(), )); + if ($typeConfig->getIndexAnalyzer()) { + $mapping['index_analyzer'] = $typeConfig->getIndexAnalyzer(); + } + + if ($typeConfig->getSearchAnalyzer()) { + $mapping['search_analyzer'] = $typeConfig->getSearchAnalyzer(); + } + if (isset($mapping['dynamic_templates']) and empty($mapping['dynamic_templates'])) { unset($mapping['dynamic_templates']); } $this->fixProperties($mapping['properties']); + if (!$mapping['properties']) { + unset($mapping['properties']); + } if ($typeConfig->getModel()) { $mapping['_meta']['model'] = $typeConfig->getModel(); } + if (!$mapping) { + // Empty mapping, we want it encoded as a {} instead of a [] + $mapping = new \stdClass; + } + return $mapping; } diff --git a/Tests/Functional/MappingToElasticaTest.php b/Tests/Functional/MappingToElasticaTest.php index 2474a1c..f42df61 100644 --- a/Tests/Functional/MappingToElasticaTest.php +++ b/Tests/Functional/MappingToElasticaTest.php @@ -31,6 +31,12 @@ class MappingToElasticaTest extends WebTestCase $this->assertArrayHasKey('store', $mapping['type']['properties']['field1']); $this->assertTrue($mapping['type']['properties']['field1']['store']); $this->assertArrayNotHasKey('store', $mapping['type']['properties']['field2']); + + $parent = $this->getType($client, 'parent'); + $mapping = $parent->getMapping(); + + $this->assertEquals('my_analyzer', $mapping['parent']['index_analyzer']); + $this->assertEquals('whitespace', $mapping['parent']['search_analyzer']); } public function testResetType() @@ -101,9 +107,9 @@ class MappingToElasticaTest extends WebTestCase * @param Client $client * @return \Elastica\Type */ - private function getType(Client $client) + private function getType(Client $client, $type = 'type') { - return $client->getContainer()->get('fos_elastica.index.index.type'); + return $client->getContainer()->get('fos_elastica.index.index.' . $type); } protected function setUp() diff --git a/Tests/Functional/app/Basic/config.yml b/Tests/Functional/app/Basic/config.yml index 9feed34..3c3d369 100644 --- a/Tests/Functional/app/Basic/config.yml +++ b/Tests/Functional/app/Basic/config.yml @@ -42,6 +42,8 @@ fos_elastica: mappings: field1: ~ field2: ~ + search_analyzer: whitespace + index_analyzer: my_analyzer type: search_analyzer: my_analyzer dynamic_templates: