Skip to content

Commit da17214

Browse files
authored
Search index mapping must be dynamic or specify a field mapping. (#2690)
1 parent fe0f1ff commit da17214

File tree

3 files changed

+21
-1
lines changed

3 files changed

+21
-1
lines changed

lib/Doctrine/ODM/MongoDB/Mapping/ClassMetadata.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1220,9 +1220,15 @@ public function hasIndexes(): bool
12201220
*/
12211221
public function addSearchIndex(array $definition, ?string $name = null): void
12221222
{
1223+
$name ??= self::DEFAULT_SEARCH_INDEX_NAME;
1224+
1225+
if (empty($definition['mappings']['dynamic']) && empty($definition['mappings']['fields'])) {
1226+
throw MappingException::emptySearchIndexDefinition($this->name, $name);
1227+
}
1228+
12231229
$this->searchIndexes[] = [
12241230
'definition' => $definition,
1225-
'name' => $name ?? self::DEFAULT_SEARCH_INDEX_NAME,
1231+
'name' => $name,
12261232
];
12271233
}
12281234

lib/Doctrine/ODM/MongoDB/Mapping/MappingException.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,4 +291,9 @@ public static function nonBackedEnumMapped(string $className, string $fieldName,
291291
$fieldName,
292292
));
293293
}
294+
295+
public static function emptySearchIndexDefinition(string $className, string $indexName): self
296+
{
297+
return new self(sprintf('%s search index "%s" must be dynamic or specify a field mapping', $className, $indexName));
298+
}
294299
}

tests/Doctrine/ODM/MongoDB/Tests/Mapping/ClassMetadataTest.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -971,6 +971,15 @@ public function testDefaultValueForValidationLevel(): void
971971
$cm = new ClassMetadata('stdClass');
972972
self::assertEquals(ClassMetadata::SCHEMA_VALIDATION_LEVEL_STRICT, $cm->getValidationLevel());
973973
}
974+
975+
public function testEmptySearchIndexDefinition(): void
976+
{
977+
$cm = new ClassMetadata('stdClass');
978+
979+
$this->expectException(MappingException::class);
980+
$this->expectExceptionMessage('stdClass search index "default" must be dynamic or specify a field mapping');
981+
$cm->addSearchIndex(['mappings' => []]);
982+
}
974983
}
975984

976985
/** @template-extends DocumentRepository<self> */

0 commit comments

Comments
 (0)