@@ -167,6 +167,8 @@ public void add(String type, String mappingSource) {
167
167
}
168
168
}
169
169
170
+ // never expose this to the outside world, we need to reparse the doc mapper so we get fresh
171
+ // instances of field mappers to properly remove existing doc mapper
170
172
private void add (DocumentMapper mapper ) {
171
173
synchronized (mutex ) {
172
174
if (mapper .type ().charAt (0 ) == '_' ) {
@@ -181,10 +183,17 @@ private void add(DocumentMapper mapper) {
181
183
if (mapper .type ().contains ("." )) {
182
184
logger .warn ("Type [{}] contains a '.', it is recommended not to include it within a type name" , mapper .type ());
183
185
}
184
- remove (mapper .type ()); // first remove it (in case its an update, we need to remove the aggregated mappers)
186
+ // we can add new field/object mappers while the old ones are there
187
+ // since we get new instances of those, and when we remove, we remove
188
+ // by instance equality
189
+ DocumentMapper oldMapper = mappers .get (mapper .type ());
185
190
mapper .addFieldMapperListener (fieldMapperListener , true );
186
191
mapper .addObjectMapperListener (objectMapperListener , true );
187
192
mappers = newMapBuilder (mappers ).put (mapper .type (), mapper ).immutableMap ();
193
+ if (oldMapper != null ) {
194
+ removeObjectFieldMappers (oldMapper );
195
+ oldMapper .close ();
196
+ }
188
197
}
189
198
}
190
199
@@ -196,49 +205,52 @@ public void remove(String type) {
196
205
}
197
206
docMapper .close ();
198
207
mappers = newMapBuilder (mappers ).remove (type ).immutableMap ();
208
+ removeObjectFieldMappers (docMapper );
209
+ }
210
+ }
199
211
200
- // we need to remove those mappers
201
- for ( FieldMapper mapper : docMapper . mappers ()) {
202
- FieldMappers mappers = nameFieldMappers . get ( mapper . names (). name ());
203
- if ( mappers != null ) {
204
- mappers = mappers . remove ( mapper );
205
- if ( mappers .isEmpty ()) {
206
- nameFieldMappers = newMapBuilder ( nameFieldMappers ). remove ( mapper . names (). name ()). immutableMap ();
207
- } else {
208
- nameFieldMappers = newMapBuilder ( nameFieldMappers ). put ( mapper . names (). name (), mappers ). immutableMap ();
209
- }
212
+ private void removeObjectFieldMappers ( DocumentMapper docMapper ) {
213
+ // we need to remove those mappers
214
+ for ( FieldMapper mapper : docMapper . mappers ()) {
215
+ FieldMappers mappers = nameFieldMappers . get ( mapper . names (). name ());
216
+ if ( mappers != null ) {
217
+ mappers = mappers .remove ( mapper );
218
+ if ( mappers . isEmpty ()) {
219
+ nameFieldMappers = newMapBuilder ( nameFieldMappers ). remove ( mapper . names (). name ()). immutableMap ();
220
+ } else {
221
+ nameFieldMappers = newMapBuilder ( nameFieldMappers ). put ( mapper . names (). name (), mappers ). immutableMap ();
210
222
}
223
+ }
211
224
212
- mappers = indexNameFieldMappers .get (mapper .names ().indexName ());
213
- if (mappers != null ) {
214
- mappers = mappers .remove (mapper );
215
- if (mappers .isEmpty ()) {
216
- indexNameFieldMappers = newMapBuilder (indexNameFieldMappers ).remove (mapper .names ().indexName ()).immutableMap ();
217
- } else {
218
- indexNameFieldMappers = newMapBuilder (indexNameFieldMappers ).put (mapper .names ().indexName (), mappers ).immutableMap ();
219
- }
225
+ mappers = indexNameFieldMappers .get (mapper .names ().indexName ());
226
+ if (mappers != null ) {
227
+ mappers = mappers .remove (mapper );
228
+ if (mappers .isEmpty ()) {
229
+ indexNameFieldMappers = newMapBuilder (indexNameFieldMappers ).remove (mapper .names ().indexName ()).immutableMap ();
230
+ } else {
231
+ indexNameFieldMappers = newMapBuilder (indexNameFieldMappers ).put (mapper .names ().indexName (), mappers ).immutableMap ();
220
232
}
233
+ }
221
234
222
- mappers = fullNameFieldMappers .get (mapper .names ().fullName ());
223
- if (mappers != null ) {
224
- mappers = mappers .remove (mapper );
225
- if (mappers .isEmpty ()) {
226
- fullNameFieldMappers = newMapBuilder (fullNameFieldMappers ).remove (mapper .names ().fullName ()).immutableMap ();
227
- } else {
228
- fullNameFieldMappers = newMapBuilder (fullNameFieldMappers ).put (mapper .names ().fullName (), mappers ).immutableMap ();
229
- }
235
+ mappers = fullNameFieldMappers .get (mapper .names ().fullName ());
236
+ if (mappers != null ) {
237
+ mappers = mappers .remove (mapper );
238
+ if (mappers .isEmpty ()) {
239
+ fullNameFieldMappers = newMapBuilder (fullNameFieldMappers ).remove (mapper .names ().fullName ()).immutableMap ();
240
+ } else {
241
+ fullNameFieldMappers = newMapBuilder (fullNameFieldMappers ).put (mapper .names ().fullName (), mappers ).immutableMap ();
230
242
}
231
243
}
244
+ }
232
245
233
- for (ObjectMapper mapper : docMapper .objectMappers ().values ()) {
234
- ObjectMappers mappers = objectMappers .get (mapper .fullPath ());
235
- if (mappers != null ) {
236
- mappers = mappers .remove (mapper );
237
- if (mappers .isEmpty ()) {
238
- objectMappers = newMapBuilder (objectMappers ).remove (mapper .fullPath ()).immutableMap ();
239
- } else {
240
- objectMappers = newMapBuilder (objectMappers ).put (mapper .fullPath (), mappers ).immutableMap ();
241
- }
246
+ for (ObjectMapper mapper : docMapper .objectMappers ().values ()) {
247
+ ObjectMappers mappers = objectMappers .get (mapper .fullPath ());
248
+ if (mappers != null ) {
249
+ mappers = mappers .remove (mapper );
250
+ if (mappers .isEmpty ()) {
251
+ objectMappers = newMapBuilder (objectMappers ).remove (mapper .fullPath ()).immutableMap ();
252
+ } else {
253
+ objectMappers = newMapBuilder (objectMappers ).put (mapper .fullPath (), mappers ).immutableMap ();
242
254
}
243
255
}
244
256
}
0 commit comments