@@ -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
0 commit comments