Skip to content

Commit 51d6fd9

Browse files
authored
[Improvement] Add logic for multiple field collection fields (#320)
* add logic for multiple field collection fields * Apply php-cs-fixer changes * fix unit * update docs --------- Co-authored-by: lukmzig <[email protected]>
1 parent 661d7d5 commit 51d6fd9

File tree

3 files changed

+18
-17
lines changed

3 files changed

+18
-17
lines changed

doc/01_Installation/02_Upgrade.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ Following steps are necessary during updating to newer versions.
55
## Upgrade to 2.1.0
66
- Added support for Symfony 7
77
- [Indexing] Added sort index for documents
8+
- [Indexing] Improved indexing of field collections to prevent mapping conflicts when properties have the same name but different types
89
- Execute the following command to reindex all elements to be able to use all new features:
910
```bin/console generic-data-index:update:index -r```
1011

src/SearchIndexAdapter/DefaultSearch/DataObject/FieldDefinitionAdapter/FieldCollectionAdapter.php

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -46,20 +46,20 @@ public function getIndexMapping(): array
4646
if (!$fieldCollectionDefinition) {
4747
continue;
4848
}
49+
$mapping[$allowedType] = [
50+
'type' => AttributeType::NESTED,
51+
'properties' => [],
52+
];
4953
foreach ($fieldCollectionDefinition->getFieldDefinitions() as $fieldDefinition) {
5054
$fieldDefinitionAdapter = $this->getFieldDefinitionService()
5155
->getFieldDefinitionAdapter($fieldDefinition);
5256
if ($fieldDefinitionAdapter) {
53-
$mapping[$fieldDefinition->getName()] = $fieldDefinitionAdapter->getIndexMapping();
57+
$mapping[$allowedType]['properties'][$fieldDefinition->getName()] =
58+
$fieldDefinitionAdapter->getIndexMapping();
5459
}
5560
}
5661
}
5762

58-
// Add type mapping
59-
$mapping['type'] = [
60-
'type' => AttributeType::TEXT,
61-
];
62-
6363
return [
6464
'type' => AttributeType::NESTED,
6565
'properties' => $mapping,
@@ -77,19 +77,20 @@ public function normalize(mixed $value): ?array
7777

7878
foreach ($items as $item) {
7979
$type = $item->getType();
80-
$fieldCollectionDefinition = $this->fieldCollectionDefinition->getByKey($item->getType());
80+
$fieldCollectionDefinition = $this->fieldCollectionDefinition->getByKey($type);
8181
if (!$fieldCollectionDefinition) {
8282
continue;
8383
}
84-
$resultItem = ['type' => $type];
84+
$resultItem = [];
8585

8686
foreach ($fieldCollectionDefinition->getFieldDefinitions() as $fieldDefinition) {
8787
$getter = 'get' . ucfirst($fieldDefinition->getName());
8888
$value = $item->$getter();
89-
$resultItem[$fieldDefinition->getName()] = $this->fieldDefinitionService->normalizeValue(
90-
$fieldDefinition,
91-
$value
92-
);
89+
$resultItem[$type][$fieldDefinition->getName()] =
90+
$this->fieldDefinitionService->normalizeValue(
91+
$fieldDefinition,
92+
$value
93+
);
9394
}
9495

9596
$resultItems[] = $resultItem;

tests/Unit/SearchIndexAdapter/DataObject/FieldDefinitionAdapter/FieldCollectionAdapterTest.php

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,13 @@ public function testGetSearchIndexMapping(): void
4444
$adapter->setFieldCollectionDefinition($definitionResolverMock);
4545
$mapping = $adapter->getIndexMapping();
4646

47-
$this->assertSame([
47+
$this->assertSame(
48+
[
4849
'type' => AttributeType::NESTED,
4950
'properties' => [
50-
'type' => [
51-
'type' => AttributeType::TEXT,
52-
],
5351
],
54-
], $mapping
52+
],
53+
$mapping
5554
);
5655

5756
}

0 commit comments

Comments
 (0)