From f20f9cb986d9cda14ffebc9ef79d11d09220fd92 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..0d1453eb6 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['dynamic']) && empty($definition['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..812efc5f4 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..774a25b85 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([]); + } } /** @template-extends DocumentRepository */