@@ -92,6 +92,12 @@ public function updateIndexes(?int $maxTimeMs = null, ?WriteConcern $writeConcer
92
92
continue ;
93
93
}
94
94
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
+
95
101
$ this ->updateDocumentIndexes ($ class ->name , $ maxTimeMs , $ writeConcern );
96
102
}
97
103
}
@@ -172,56 +178,68 @@ private function doGetDocumentIndexes(string $documentName, array &$visited): ar
172
178
return [];
173
179
}
174
180
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 ];
180
183
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
+ }
191
190
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 ' ]);
195
205
} else {
196
- $ embeddedIndexes = $ this ->doGetDocumentIndexes ($ embed , $ visited );
197
- $ embeddedDocumentIndexes [$ embed ] = $ embeddedIndexes ;
206
+ continue ;
198
207
}
199
208
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 ;
204
215
}
205
216
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
+ }
209
222
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
+ }
211
229
}
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 ;
219
239
}
220
240
221
- $ newKeys [ $ key ] = $ v ;
241
+ $ indexes [ $ idx ][ ' keys ' ] = $ newKeys ;
222
242
}
223
-
224
- $ indexes [$ idx ]['keys ' ] = $ newKeys ;
225
243
}
226
244
}
227
245
}
0 commit comments