@@ -92,6 +92,12 @@ public function updateIndexes(?int $maxTimeMs = null, ?WriteConcern $writeConcer
9292 continue ;
9393 }
9494
95+ if ($ class ->isInheritanceTypeSingleCollection () && count ($ class ->parentClasses ) > 0 ) {
96+ // Skip document nodes that use the same collection as one of their parents.
97+ // Indexes will be added by the parent document.
98+ continue ;
99+ }
100+
95101 $ this ->updateDocumentIndexes ($ class ->name , $ maxTimeMs , $ writeConcern );
96102 }
97103 }
@@ -172,56 +178,68 @@ private function doGetDocumentIndexes(string $documentName, array &$visited): ar
172178 return [];
173179 }
174180
175- $ visited [$ documentName ] = true ;
176-
177- $ class = $ this ->dm ->getClassMetadata ($ documentName );
178- $ indexes = $ this ->prepareIndexes ($ class );
179- $ embeddedDocumentIndexes = [];
181+ $ class = $ this ->dm ->getClassMetadata ($ documentName );
182+ $ processClasses = [$ class ];
180183
181- // Add indexes from embedded & referenced documents
182- foreach ($ class ->fieldMappings as $ fieldMapping ) {
183- if (isset ($ fieldMapping ['embedded ' ])) {
184- if (isset ($ fieldMapping ['targetDocument ' ])) {
185- $ possibleEmbeds = [$ fieldMapping ['targetDocument ' ]];
186- } elseif (isset ($ fieldMapping ['discriminatorMap ' ])) {
187- $ possibleEmbeds = array_unique ($ fieldMapping ['discriminatorMap ' ]);
188- } else {
189- continue ;
190- }
184+ if ($ class ->isInheritanceTypeSingleCollection ()) {
185+ // process all subclasses as well
186+ foreach ($ class ->subClasses as $ subClassName ) {
187+ $ processClasses [] = $ this ->metadataFactory ->getMetadataFor ($ subClassName );
188+ }
189+ }
191190
192- foreach ($ possibleEmbeds as $ embed ) {
193- if (isset ($ embeddedDocumentIndexes [$ embed ])) {
194- $ embeddedIndexes = $ embeddedDocumentIndexes [$ embed ];
191+ $ indexes = [];
192+ $ embeddedDocumentIndexes = [];
193+ foreach ($ processClasses as $ class ) {
194+ $ visited [$ class ->name ] = true ;
195+
196+ $ indexes = array_merge ($ indexes , $ this ->prepareIndexes ($ class ));
197+
198+ // Add indexes from embedded & referenced documents
199+ foreach ($ class ->fieldMappings as $ fieldMapping ) {
200+ if (isset ($ fieldMapping ['embedded ' ])) {
201+ if (isset ($ fieldMapping ['targetDocument ' ])) {
202+ $ possibleEmbeds = [$ fieldMapping ['targetDocument ' ]];
203+ } elseif (isset ($ fieldMapping ['discriminatorMap ' ])) {
204+ $ possibleEmbeds = array_unique ($ fieldMapping ['discriminatorMap ' ]);
195205 } else {
196- $ embeddedIndexes = $ this ->doGetDocumentIndexes ($ embed , $ visited );
197- $ embeddedDocumentIndexes [$ embed ] = $ embeddedIndexes ;
206+ continue ;
198207 }
199208
200- foreach ($ embeddedIndexes as $ embeddedIndex ) {
201- foreach ($ embeddedIndex ['keys ' ] as $ key => $ value ) {
202- $ embeddedIndex ['keys ' ][$ fieldMapping ['name ' ] . '. ' . $ key ] = $ value ;
203- unset($ embeddedIndex ['keys ' ][$ key ]);
209+ foreach ($ possibleEmbeds as $ embed ) {
210+ if (isset ($ embeddedDocumentIndexes [$ embed ])) {
211+ $ embeddedIndexes = $ embeddedDocumentIndexes [$ embed ];
212+ } else {
213+ $ embeddedIndexes = $ this ->doGetDocumentIndexes ($ embed , $ visited );
214+ $ embeddedDocumentIndexes [$ embed ] = $ embeddedIndexes ;
204215 }
205216
206- if (isset ($ embeddedIndex ['options ' ]['name ' ])) {
207- $ embeddedIndex ['options ' ]['name ' ] = sprintf ('%s_%s ' , $ fieldMapping ['name ' ], $ embeddedIndex ['options ' ]['name ' ]);
208- }
217+ foreach ($ embeddedIndexes as $ embeddedIndex ) {
218+ foreach ($ embeddedIndex ['keys ' ] as $ key => $ value ) {
219+ $ embeddedIndex ['keys ' ][$ fieldMapping ['name ' ] . '. ' . $ key ] = $ value ;
220+ unset($ embeddedIndex ['keys ' ][$ key ]);
221+ }
209222
210- $ indexes [] = $ embeddedIndex ;
223+ if (isset ($ embeddedIndex ['options ' ]['name ' ])) {
224+ $ embeddedIndex ['options ' ]['name ' ] = sprintf ('%s_%s ' , $ fieldMapping ['name ' ], $ embeddedIndex ['options ' ]['name ' ]);
225+ }
226+
227+ $ indexes [] = $ embeddedIndex ;
228+ }
211229 }
212- }
213- } elseif (isset ($ fieldMapping ['reference ' ]) && isset ($ fieldMapping ['targetDocument ' ])) {
214- foreach ($ indexes as $ idx => $ index ) {
215- $ newKeys = [];
216- foreach ($ index ['keys ' ] as $ key => $ v ) {
217- if ($ key === $ fieldMapping ['name ' ]) {
218- $ key = ClassMetadata::getReferenceFieldName ($ fieldMapping ['storeAs ' ], $ key );
230+ } elseif (isset ($ fieldMapping ['reference ' ]) && isset ($ fieldMapping ['targetDocument ' ])) {
231+ foreach ($ indexes as $ idx => $ index ) {
232+ $ newKeys = [];
233+ foreach ($ index ['keys ' ] as $ key => $ v ) {
234+ if ($ key === $ fieldMapping ['name ' ]) {
235+ $ key = ClassMetadata::getReferenceFieldName ($ fieldMapping ['storeAs ' ], $ key );
236+ }
237+
238+ $ newKeys [$ key ] = $ v ;
219239 }
220240
221- $ newKeys [ $ key ] = $ v ;
241+ $ indexes [ $ idx ][ ' keys ' ] = $ newKeys ;
222242 }
223-
224- $ indexes [$ idx ]['keys ' ] = $ newKeys ;
225243 }
226244 }
227245 }
0 commit comments