From 441ebf8446460163805919157a17a7e860594eac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Tamarelle?= Date: Wed, 16 Oct 2024 15:57:01 +0200 Subject: [PATCH] Search index mapping must be dynamic or specify a field mapping. --- lib/Doctrine/ODM/MongoDB/Mapping/ClassMetadata.php | 8 +++++++- lib/Doctrine/ODM/MongoDB/Mapping/MappingException.php | 5 +++++ .../ODM/MongoDB/Tests/Mapping/ClassMetadataTest.php | 9 +++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/lib/Doctrine/ODM/MongoDB/Mapping/ClassMetadata.php b/lib/Doctrine/ODM/MongoDB/Mapping/ClassMetadata.php index 558ab6a86..335add4fe 100644 --- a/lib/Doctrine/ODM/MongoDB/Mapping/ClassMetadata.php +++ b/lib/Doctrine/ODM/MongoDB/Mapping/ClassMetadata.php @@ -1220,9 +1220,15 @@ public function hasIndexes(): bool */ public function addSearchIndex(array $definition, ?string $name = null): void { + $name ??= self::DEFAULT_SEARCH_INDEX_NAME; + + if (empty($definition['mappings']['dynamic']) && empty($definition['mappings']['fields'])) { + throw MappingException::emptySearchIndexDefinition($this->name, $name); + } + $this->searchIndexes[] = [ 'definition' => $definition, - 'name' => $name ?? self::DEFAULT_SEARCH_INDEX_NAME, + 'name' => $name, ]; } diff --git a/lib/Doctrine/ODM/MongoDB/Mapping/MappingException.php b/lib/Doctrine/ODM/MongoDB/Mapping/MappingException.php index af7d22a28..68438848c 100644 --- a/lib/Doctrine/ODM/MongoDB/Mapping/MappingException.php +++ b/lib/Doctrine/ODM/MongoDB/Mapping/MappingException.php @@ -291,4 +291,9 @@ public static function nonBackedEnumMapped(string $className, string $fieldName, $fieldName, )); } + + public static function emptySearchIndexDefinition(string $className, string $indexName): self + { + return new self(sprintf('%s search index "%s" must be dynamic or specify a field mapping', $className, $indexName)); + } } diff --git a/tests/Doctrine/ODM/MongoDB/Tests/Mapping/ClassMetadataTest.php b/tests/Doctrine/ODM/MongoDB/Tests/Mapping/ClassMetadataTest.php index cb905e9ac..cbf6d7fa7 100644 --- a/tests/Doctrine/ODM/MongoDB/Tests/Mapping/ClassMetadataTest.php +++ b/tests/Doctrine/ODM/MongoDB/Tests/Mapping/ClassMetadataTest.php @@ -971,6 +971,15 @@ public function testDefaultValueForValidationLevel(): void $cm = new ClassMetadata('stdClass'); self::assertEquals(ClassMetadata::SCHEMA_VALIDATION_LEVEL_STRICT, $cm->getValidationLevel()); } + + public function testEmptySearchIndexDefinition(): void + { + $cm = new ClassMetadata('stdClass'); + + $this->expectException(MappingException::class); + $this->expectExceptionMessage('stdClass search index "default" must be dynamic or specify a field mapping'); + $cm->addSearchIndex(['mappings' => []]); + } } /** @template-extends DocumentRepository */