2424import org .apache .lucene .search .Scorer ;
2525import org .apache .lucene .search .Weight ;
2626import org .elasticsearch .ElasticsearchGenerationException ;
27- import org .elasticsearch .Version ;
28- import org .elasticsearch .common .Nullable ;
2927import org .elasticsearch .common .bytes .BytesReference ;
3028import org .elasticsearch .common .compress .CompressedXContent ;
3129import org .elasticsearch .common .settings .Settings ;
3230import org .elasticsearch .common .text .Text ;
33- import org .elasticsearch .common .util .concurrent .ReleasableLock ;
3431import org .elasticsearch .common .xcontent .ToXContent ;
3532import org .elasticsearch .common .xcontent .XContentBuilder ;
3633import org .elasticsearch .common .xcontent .XContentType ;
34+ import org .elasticsearch .index .IndexSettings ;
35+ import org .elasticsearch .index .analysis .AnalysisService ;
3736import org .elasticsearch .index .mapper .MetadataFieldMapper .TypeParser ;
3837import org .elasticsearch .index .mapper .internal .AllFieldMapper ;
3938import org .elasticsearch .index .mapper .internal .IdFieldMapper ;
5150
5251import java .io .IOException ;
5352import java .util .ArrayList ;
54- import java .util .Arrays ;
55- import java .util .Collection ;
5653import java .util .Collections ;
5754import java .util .HashMap ;
5855import java .util .LinkedHashMap ;
5956import java .util .List ;
6057import java .util .Map ;
6158import java .util .Objects ;
62- import java .util .concurrent .locks .ReentrantReadWriteLock ;
6359
6460import static java .util .Collections .emptyMap ;
6561
@@ -72,16 +68,14 @@ public static class Builder {
7268
7369 private Map <Class <? extends MetadataFieldMapper >, MetadataFieldMapper > metadataMappers = new LinkedHashMap <>();
7470
75- private final Settings indexSettings ;
76-
7771 private final RootObjectMapper rootObjectMapper ;
7872
7973 private Map <String , Object > meta = emptyMap ();
8074
8175 private final Mapper .BuilderContext builderContext ;
8276
83- public Builder (Settings indexSettings , RootObjectMapper .Builder builder , MapperService mapperService ) {
84- this . indexSettings = indexSettings ;
77+ public Builder (RootObjectMapper .Builder builder , MapperService mapperService ) {
78+ final Settings indexSettings = mapperService . getIndexSettings (). getSettings () ;
8579 this .builderContext = new Mapper .BuilderContext (indexSettings , new ContentPath (1 ));
8680 this .rootObjectMapper = builder .build (builderContext );
8781
@@ -104,9 +98,14 @@ public Builder put(MetadataFieldMapper.Builder<?, ?> mapper) {
10498 return this ;
10599 }
106100
107- public DocumentMapper build (MapperService mapperService , DocumentMapperParser docMapperParser ) {
101+ public DocumentMapper build (MapperService mapperService ) {
108102 Objects .requireNonNull (rootObjectMapper , "Mapper builder must have the root object mapper set" );
109- return new DocumentMapper (mapperService , indexSettings , docMapperParser , rootObjectMapper , meta , metadataMappers , mapperService .mappingLock );
103+ Mapping mapping = new Mapping (
104+ mapperService .getIndexSettings ().getIndexVersionCreated (),
105+ rootObjectMapper ,
106+ metadataMappers .values ().toArray (new MetadataFieldMapper [metadataMappers .values ().size ()]),
107+ meta );
108+ return new DocumentMapper (mapperService , mapping );
110109 }
111110 }
112111
@@ -115,38 +114,25 @@ public DocumentMapper build(MapperService mapperService, DocumentMapperParser do
115114 private final String type ;
116115 private final Text typeText ;
117116
118- private volatile CompressedXContent mappingSource ;
117+ private final CompressedXContent mappingSource ;
119118
120- private volatile Mapping mapping ;
119+ private final Mapping mapping ;
121120
122121 private final DocumentParser documentParser ;
123122
124- private volatile DocumentFieldMappers fieldMappers ;
125-
126- private volatile Map <String , ObjectMapper > objectMappers = Collections .emptyMap ();
123+ private final DocumentFieldMappers fieldMappers ;
127124
128- private boolean hasNestedObjects = false ;
125+ private final Map < String , ObjectMapper > objectMappers ;
129126
130- private final ReleasableLock mappingWriteLock ;
131- private final ReentrantReadWriteLock mappingLock ;
127+ private final boolean hasNestedObjects ;
132128
133- public DocumentMapper (MapperService mapperService , @ Nullable Settings indexSettings , DocumentMapperParser docMapperParser ,
134- RootObjectMapper rootObjectMapper ,
135- Map <String , Object > meta ,
136- Map <Class <? extends MetadataFieldMapper >, MetadataFieldMapper > metadataMappers ,
137- ReentrantReadWriteLock mappingLock ) {
129+ public DocumentMapper (MapperService mapperService , Mapping mapping ) {
138130 this .mapperService = mapperService ;
139- this .type = rootObjectMapper .name ();
131+ this .type = mapping . root () .name ();
140132 this .typeText = new Text (this .type );
141- this .mapping = new Mapping (
142- Version .indexCreated (indexSettings ),
143- rootObjectMapper ,
144- metadataMappers .values ().toArray (new MetadataFieldMapper [metadataMappers .values ().size ()]),
145- meta );
146- this .documentParser = new DocumentParser (indexSettings , docMapperParser , this , new ReleasableLock (mappingLock .readLock ()));
147-
148- this .mappingWriteLock = new ReleasableLock (mappingLock .writeLock ());
149- this .mappingLock = mappingLock ;
133+ final IndexSettings indexSettings = mapperService .getIndexSettings ();
134+ this .mapping = mapping ;
135+ this .documentParser = new DocumentParser (indexSettings , mapperService .documentMapperParser (), this );
150136
151137 if (metadataMapper (ParentFieldMapper .class ).active ()) {
152138 // mark the routing field mapper as required
@@ -163,7 +149,11 @@ public DocumentMapper(MapperService mapperService, @Nullable Settings indexSetti
163149 }
164150 MapperUtils .collect (this .mapping .root , newObjectMappers , newFieldMappers );
165151
166- this .fieldMappers = new DocumentFieldMappers (docMapperParser .analysisService ).copyAndAllAll (newFieldMappers );
152+ final AnalysisService analysisService = mapperService .analysisService ();
153+ this .fieldMappers = new DocumentFieldMappers (newFieldMappers ,
154+ analysisService .defaultIndexAnalyzer (),
155+ analysisService .defaultSearchAnalyzer (),
156+ analysisService .defaultSearchQuoteAnalyzer ());
167157
168158 Map <String , ObjectMapper > builder = new HashMap <>();
169159 for (ObjectMapper objectMapper : newObjectMappers ) {
@@ -173,14 +163,20 @@ public DocumentMapper(MapperService mapperService, @Nullable Settings indexSetti
173163 }
174164 }
175165
166+ boolean hasNestedObjects = false ;
176167 this .objectMappers = Collections .unmodifiableMap (builder );
177168 for (ObjectMapper objectMapper : newObjectMappers ) {
178169 if (objectMapper .nested ().isNested ()) {
179170 hasNestedObjects = true ;
180171 }
181172 }
173+ this .hasNestedObjects = hasNestedObjects ;
182174
183- refreshSource ();
175+ try {
176+ mappingSource = new CompressedXContent (this , XContentType .JSON , ToXContent .EMPTY_PARAMS );
177+ } catch (Exception e ) {
178+ throw new ElasticsearchGenerationException ("failed to serialize source for type [" + type + "]" , e );
179+ }
184180 }
185181
186182 public Mapping mapping () {
@@ -334,46 +330,17 @@ public boolean isParent(String type) {
334330 return mapperService .getParentTypes ().contains (type );
335331 }
336332
337- private void addMappers (Collection <ObjectMapper > objectMappers , Collection <FieldMapper > fieldMappers , boolean updateAllTypes ) {
338- assert mappingLock .isWriteLockedByCurrentThread ();
339-
340- // update mappers for this document type
341- Map <String , ObjectMapper > builder = new HashMap <>(this .objectMappers );
342- for (ObjectMapper objectMapper : objectMappers ) {
343- builder .put (objectMapper .fullPath (), objectMapper );
344- if (objectMapper .nested ().isNested ()) {
345- hasNestedObjects = true ;
346- }
347- }
348- this .objectMappers = Collections .unmodifiableMap (builder );
349- this .fieldMappers = this .fieldMappers .copyAndAllAll (fieldMappers );
350-
351- // finally update for the entire index
352- mapperService .addMappers (type , objectMappers , fieldMappers );
353- }
354-
355- public void merge (Mapping mapping , boolean simulate , boolean updateAllTypes ) {
356- try (ReleasableLock lock = mappingWriteLock .acquire ()) {
357- mapperService .checkMappersCompatibility (type , mapping , updateAllTypes );
358- // do the merge even if simulate == false so that we get exceptions
359- Mapping merged = this .mapping .merge (mapping , updateAllTypes );
360- if (simulate == false ) {
361- this .mapping = merged ;
362- Collection <ObjectMapper > objectMappers = new ArrayList <>();
363- Collection <FieldMapper > fieldMappers = new ArrayList <>(Arrays .asList (merged .metadataMappers ));
364- MapperUtils .collect (merged .root , objectMappers , fieldMappers );
365- addMappers (objectMappers , fieldMappers , updateAllTypes );
366- refreshSource ();
367- }
368- }
333+ public DocumentMapper merge (Mapping mapping , boolean updateAllTypes ) {
334+ Mapping merged = this .mapping .merge (mapping , updateAllTypes );
335+ return new DocumentMapper (mapperService , merged );
369336 }
370337
371- private void refreshSource () throws ElasticsearchGenerationException {
372- try {
373- mappingSource = new CompressedXContent ( this , XContentType . JSON , ToXContent . EMPTY_PARAMS );
374- } catch ( Exception e ) {
375- throw new ElasticsearchGenerationException ( "failed to serialize source for type [" + type + "]" , e );
376- }
338+ /**
339+ * Recursively update sub field types.
340+ */
341+ public DocumentMapper updateFieldType ( Map < String , MappedFieldType > fullNameToFieldType ) {
342+ Mapping updated = this . mapping . updateFieldType ( fullNameToFieldType );
343+ return new DocumentMapper ( mapperService , updated );
377344 }
378345
379346 public void close () {
0 commit comments