27
27
import org .elasticsearch .common .joda .FormatDateTimeFormatter ;
28
28
import org .elasticsearch .common .xcontent .XContentHelper ;
29
29
import org .elasticsearch .common .xcontent .XContentParser ;
30
+ import org .elasticsearch .common .xcontent .XContentType ;
30
31
import org .elasticsearch .index .IndexSettings ;
31
32
import org .elasticsearch .index .mapper .DynamicTemplate .XContentFieldType ;
32
33
import org .elasticsearch .index .mapper .KeywordFieldMapper .KeywordFieldType ;
@@ -58,9 +59,10 @@ ParsedDocument parseDocument(SourceToParse source) throws MapperParsingException
58
59
59
60
final Mapping mapping = docMapper .mapping ();
60
61
final ParseContext .InternalParseContext context ;
61
- try (XContentParser parser = XContentHelper .createParser (docMapperParser .getXContentRegistry (), source .source ())) {
62
- context = new ParseContext .InternalParseContext (indexSettings .getSettings (),
63
- docMapperParser , docMapper , source , parser );
62
+ final XContentType xContentType = source .getXContentType ();
63
+
64
+ try (XContentParser parser = XContentHelper .createParser (docMapperParser .getXContentRegistry (), source .source (), xContentType )) {
65
+ context = new ParseContext .InternalParseContext (indexSettings .getSettings (), docMapperParser , docMapper , source , parser );
64
66
validateStart (parser );
65
67
internalParseDocument (mapping , context , parser );
66
68
validateEnd (parser );
@@ -74,8 +76,7 @@ ParsedDocument parseDocument(SourceToParse source) throws MapperParsingException
74
76
75
77
reverseOrder (context );
76
78
77
- ParsedDocument doc = parsedDocument (source , context , createDynamicUpdate (mapping , docMapper , context .getDynamicMappers ()));
78
- return doc ;
79
+ return parsedDocument (source , context , createDynamicUpdate (mapping , docMapper , context .getDynamicMappers ()));
79
80
}
80
81
81
82
private static void internalParseDocument (Mapping mapping , ParseContext .InternalParseContext context , XContentParser parser ) throws IOException {
@@ -89,7 +90,7 @@ private static void internalParseDocument(Mapping mapping, ParseContext.Internal
89
90
// entire type is disabled
90
91
parser .skipChildren ();
91
92
} else if (emptyDoc == false ) {
92
- parseObjectOrNested (context , mapping .root , true );
93
+ parseObjectOrNested (context , mapping .root );
93
94
}
94
95
95
96
for (MetadataFieldMapper metadataMapper : mapping .metadataMappers ) {
@@ -338,7 +339,7 @@ private static ObjectMapper createUpdate(ObjectMapper parent, String[] nameParts
338
339
return parent .mappingUpdate (mapper );
339
340
}
340
341
341
- static void parseObjectOrNested (ParseContext context , ObjectMapper mapper , boolean atRoot ) throws IOException {
342
+ static void parseObjectOrNested (ParseContext context , ObjectMapper mapper ) throws IOException {
342
343
if (mapper .isEnabled () == false ) {
343
344
context .parser ().skipChildren ();
344
345
return ;
@@ -467,7 +468,7 @@ private static ParseContext nestedContext(ParseContext context, ObjectMapper map
467
468
468
469
private static void parseObjectOrField (ParseContext context , Mapper mapper ) throws IOException {
469
470
if (mapper instanceof ObjectMapper ) {
470
- parseObjectOrNested (context , (ObjectMapper ) mapper , false );
471
+ parseObjectOrNested (context , (ObjectMapper ) mapper );
471
472
} else {
472
473
FieldMapper fieldMapper = (FieldMapper )mapper ;
473
474
Mapper update = fieldMapper .parse (context );
@@ -481,14 +482,13 @@ private static void parseObjectOrField(ParseContext context, Mapper mapper) thro
481
482
private static void parseObject (final ParseContext context , ObjectMapper mapper , String currentFieldName ) throws IOException {
482
483
assert currentFieldName != null ;
483
484
484
- Mapper objectMapper = getMapper (mapper , currentFieldName );
485
+ final String [] paths = splitAndValidatePath (currentFieldName );
486
+ Mapper objectMapper = getMapper (mapper , currentFieldName , paths );
485
487
if (objectMapper != null ) {
486
488
context .path ().add (currentFieldName );
487
489
parseObjectOrField (context , objectMapper );
488
490
context .path ().remove ();
489
491
} else {
490
-
491
- final String [] paths = splitAndValidatePath (currentFieldName );
492
492
currentFieldName = paths [paths .length - 1 ];
493
493
Tuple <Integer , ObjectMapper > parentMapperTuple = getDynamicParentMapper (context , paths , mapper );
494
494
ObjectMapper parentMapper = parentMapperTuple .v2 ();
@@ -518,7 +518,9 @@ private static void parseObject(final ParseContext context, ObjectMapper mapper,
518
518
519
519
private static void parseArray (ParseContext context , ObjectMapper parentMapper , String lastFieldName ) throws IOException {
520
520
String arrayFieldName = lastFieldName ;
521
- Mapper mapper = getMapper (parentMapper , lastFieldName );
521
+
522
+ final String [] paths = splitAndValidatePath (arrayFieldName );
523
+ Mapper mapper = getMapper (parentMapper , lastFieldName , paths );
522
524
if (mapper != null ) {
523
525
// There is a concrete mapper for this field already. Need to check if the mapper
524
526
// expects an array, if so we pass the context straight to the mapper and if not
@@ -529,8 +531,6 @@ private static void parseArray(ParseContext context, ObjectMapper parentMapper,
529
531
parseNonDynamicArray (context , parentMapper , lastFieldName , arrayFieldName );
530
532
}
531
533
} else {
532
-
533
- final String [] paths = splitAndValidatePath (arrayFieldName );
534
534
arrayFieldName = paths [paths .length - 1 ];
535
535
lastFieldName = arrayFieldName ;
536
536
Tuple <Integer , ObjectMapper > parentMapperTuple = getDynamicParentMapper (context , paths , parentMapper );
@@ -589,12 +589,12 @@ private static void parseValue(final ParseContext context, ObjectMapper parentMa
589
589
if (currentFieldName == null ) {
590
590
throw new MapperParsingException ("object mapping [" + parentMapper .name () + "] trying to serialize a value with no field associated with it, current value [" + context .parser ().textOrNull () + "]" );
591
591
}
592
- Mapper mapper = getMapper (parentMapper , currentFieldName );
592
+
593
+ final String [] paths = splitAndValidatePath (currentFieldName );
594
+ Mapper mapper = getMapper (parentMapper , currentFieldName , paths );
593
595
if (mapper != null ) {
594
596
parseObjectOrField (context , mapper );
595
597
} else {
596
-
597
- final String [] paths = splitAndValidatePath (currentFieldName );
598
598
currentFieldName = paths [paths .length - 1 ];
599
599
Tuple <Integer , ObjectMapper > parentMapperTuple = getDynamicParentMapper (context , paths , parentMapper );
600
600
parentMapper = parentMapperTuple .v2 ();
@@ -607,7 +607,7 @@ private static void parseValue(final ParseContext context, ObjectMapper parentMa
607
607
608
608
private static void parseNullValue (ParseContext context , ObjectMapper parentMapper , String lastFieldName ) throws IOException {
609
609
// we can only handle null values if we have mappings for them
610
- Mapper mapper = getMapper (parentMapper , lastFieldName );
610
+ Mapper mapper = getMapper (parentMapper , lastFieldName , splitAndValidatePath ( lastFieldName ) );
611
611
if (mapper != null ) {
612
612
// TODO: passing null to an object seems bogus?
613
613
parseObjectOrField (context , mapper );
@@ -893,15 +893,15 @@ private static Tuple<Integer, ObjectMapper> getDynamicParentMapper(ParseContext
893
893
break ;
894
894
case FALSE :
895
895
// Should not dynamically create any more mappers so return the last mapper
896
- return new Tuple <Integer , ObjectMapper >(pathsAdded , parent );
896
+ return new Tuple <>(pathsAdded , parent );
897
897
898
898
}
899
899
}
900
900
context .path ().add (paths [i ]);
901
901
pathsAdded ++;
902
902
parent = mapper ;
903
903
}
904
- return new Tuple <Integer , ObjectMapper >(pathsAdded , mapper );
904
+ return new Tuple <>(pathsAdded , mapper );
905
905
}
906
906
907
907
// find what the dynamic setting is given the current parse context and parent
@@ -929,8 +929,7 @@ private static ObjectMapper.Dynamic dynamicOrDefault(ObjectMapper parentMapper,
929
929
}
930
930
931
931
// looks up a child mapper, but takes into account field names that expand to objects
932
- static Mapper getMapper (ObjectMapper objectMapper , String fieldName ) {
933
- String [] subfields = splitAndValidatePath (fieldName );
932
+ private static Mapper getMapper (ObjectMapper objectMapper , String fieldName , String [] subfields ) {
934
933
for (int i = 0 ; i < subfields .length - 1 ; ++i ) {
935
934
Mapper mapper = objectMapper .getMapper (subfields [i ]);
936
935
if (mapper == null || (mapper instanceof ObjectMapper ) == false ) {
0 commit comments