Skip to content

Commit de1319b

Browse files
committed
fixed generation of indexes.
1 parent d988eb6 commit de1319b

File tree

3 files changed

+27
-98
lines changed

3 files changed

+27
-98
lines changed

src/Service/Generator/Definition/Entity/PrimaryKeyEntity.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ class PrimaryKeyEntity extends AbstractIndexEntity
77

88
protected array $columns = [];
99

10-
protected string $indexType = 'primary';
10+
protected string $indexType = 'index';
1111

1212
public function getColumns(): array
1313
{

src/Service/Generator/Resolver/DefinitionResolver.php

Lines changed: 26 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -100,89 +100,56 @@ protected function buildResultEntity(string $table, array $definitionResult): Re
100100

101101
protected function getUniqueIndexes(string $table, array $definitionResult): array
102102
{
103-
$flatIndexEntities = $this->extractIndexEntitiesWithOrigin($definitionResult[$table]);
104-
$filteredIndexes = $this->filterDuplicateIndexesByName($flatIndexEntities);
105-
$rebuilt = $this->rebuildDefinitionResult($definitionResult[$table], $filteredIndexes);
103+
// Step 1: Separate index-like definitions
104+
[$indexEntitiesByName, $result] = $this->extractIndexEntities($definitionResult[$table]);
106105

107-
return [$table => $rebuilt];
106+
// Step 2: Resolve conflicts (e.g. foreignKey vs. index) but retain original group
107+
$this->mergeResolvedIndexes($result, $indexEntitiesByName);
108+
109+
return [$table => $result];
108110
}
109111

110112

111-
protected function extractIndexEntitiesWithOrigin(array $definitions): array
113+
protected function extractIndexEntities(array $definitionsByType): array
112114
{
113115
$indexEntitiesByName = [];
116+
$result = [];
114117

115-
foreach ($definitions as $originType => $entries) {
116-
foreach ($entries as $definition) {
118+
foreach ($definitionsByType as $type => $definitions) {
119+
foreach ($definitions as $key => $definition) {
117120
if (!$definition instanceof AbstractIndexEntity) {
121+
$result[$type][$key] = $definition;
118122
continue;
119123
}
120124

121125
$name = $definition->getName();
122-
123-
$indexEntitiesByName[$name][] = [
124-
'entity' => $definition,
125-
'originType' => $originType,
126-
];
126+
$indexEntitiesByName[$name][] = ['entity' => $definition, 'originType' => $type];
127127
}
128128
}
129129

130-
return $indexEntitiesByName;
130+
return [$indexEntitiesByName, $result];
131131
}
132132

133-
protected function filterDuplicateIndexesByName(array $indexEntitiesByName): array
133+
134+
protected function mergeResolvedIndexes(array &$result, array $indexEntitiesByName): void
134135
{
135-
$filtered = [];
136-
137-
foreach ($indexEntitiesByName as $name => $entries) {
138-
$primary = null;
139-
$foreign = null;
140-
$fallback = null;
141-
142-
foreach ($entries as $entry) {
143-
$type = $entry['entity']->getIndexType();
144-
145-
if ($type === 'primary') {
146-
$primary = $entry;
147-
} elseif ($type === 'foreignKey') {
148-
$foreign = $entry;
149-
} elseif (!$fallback) {
150-
$fallback = $entry;
136+
foreach ($indexEntitiesByName as $name => $candidates) {
137+
$preferred = null;
138+
foreach ($candidates as $item) {
139+
if ($item['entity']->getIndexType() === 'foreignKey') {
140+
$preferred = $item;
141+
break;
151142
}
152143
}
153144

154-
if ($primary) {
155-
$filtered[$name] = $primary;
156-
} elseif ($foreign) {
157-
$filtered[$name] = $foreign;
158-
} elseif ($fallback) {
159-
$filtered[$name] = $fallback;
160-
}
161-
}
162-
163-
return $filtered;
164-
}
165-
166-
protected function rebuildDefinitionResult(array $original, array $filteredIndexes): array
167-
{
168-
$result = [];
169-
170-
// Erstmal alles übernehmen, was kein AbstractIndexEntity ist
171-
foreach ($original as $type => $entries) {
172-
foreach ($entries as $key => $entry) {
173-
if (!$entry instanceof AbstractIndexEntity) {
174-
$result[$type][$key] = $entry;
175-
}
145+
// fallback if no foreignKey
146+
if (!$preferred) {
147+
$preferred = $candidates[0];
176148
}
177-
}
178149

179-
// Jetzt die gefilterten Index-Elemente einfügen, an Ursprungsposition
180-
foreach ($filteredIndexes as $name => $entry) {
181-
$origin = $entry['originType'];
182-
$result[$origin][$name] = $entry['entity'];
150+
$originType = $preferred['originType'];
151+
$result[$originType][$name] = $preferred['entity'];
183152
}
184-
185-
return $result;
186153
}
187154

188155

tests/Resources/ExpectedResults/migrationCompilerResultWithPrimary.txt

Lines changed: 0 additions & 38 deletions
This file was deleted.

0 commit comments

Comments
 (0)