diff options
-rw-r--r-- | document/src/main/java/com/yahoo/document/json/document/DocumentParser.java | 23 | ||||
-rw-r--r-- | document/src/main/java/com/yahoo/document/json/readers/CompositeReader.java | 9 |
2 files changed, 18 insertions, 14 deletions
diff --git a/document/src/main/java/com/yahoo/document/json/document/DocumentParser.java b/document/src/main/java/com/yahoo/document/json/document/DocumentParser.java index a9fad40912b..f046eff4360 100644 --- a/document/src/main/java/com/yahoo/document/json/document/DocumentParser.java +++ b/document/src/main/java/com/yahoo/document/json/document/DocumentParser.java @@ -36,9 +36,7 @@ public class DocumentParser { public Optional<DocumentParseInfo> parse(Optional<DocumentId> documentIdArg) throws IOException { indentLevel = 0; DocumentParseInfo documentParseInfo = new DocumentParseInfo(); - if (documentIdArg.isPresent()) { - documentParseInfo.documentId = documentIdArg.get(); - } + documentIdArg.ifPresent(documentId -> documentParseInfo.documentId = documentId); do { parseOneItem(documentParseInfo, documentIdArg.isPresent() /* doc id set externally */); } while (indentLevel > 0L); @@ -57,8 +55,8 @@ public class DocumentParser { } if (indentLevel == 1L) { handleIdentLevelOne(documentParseInfo, docIdAndOperationIsSetExternally); - } else if (indentLevel == 2L) { - handleIdentLevelTwo(documentParseInfo); + } else if (indentLevel > 1L) { + handleIdentLevelOnePlus(documentParseInfo); } } @@ -75,10 +73,10 @@ public class DocumentParser { indentLevel--; return; case START_ARRAY: - indentLevel+=10000L; + indentLevel += 10000L; break; case END_ARRAY: - indentLevel-=10000L; + indentLevel -= 10000L; break; } } @@ -111,13 +109,18 @@ public class DocumentParser { } } - private void handleIdentLevelTwo(DocumentParseInfo documentParseInfo) { + private void handleIdentLevelOnePlus(DocumentParseInfo documentParseInfo) { try { JsonToken currentToken = parser.getCurrentToken(); - // "Fields" opens a dictionary and is therefore on level two which might be surprising. - if (currentToken == JsonToken.START_OBJECT && FIELDS.equals(parser.getCurrentName())) { + // "fields" opens a dictionary and is therefore on level two which might be surprising. + if (indentLevel == 2 && currentToken == JsonToken.START_OBJECT && FIELDS.equals(parser.getCurrentName())) { documentParseInfo.fieldsBuffer.bufferObject(currentToken, parser); processIndent(); + + // "fieldpaths" opens an array and is therefore on level 10001 which might be surprising + } else if (indentLevel == 10001 && currentToken == JsonToken.START_ARRAY && FIELDPATHS.equals(parser.getCurrentName())) { + documentParseInfo.fieldpathsBuffer.bufferArray(currentToken, parser); + processIndent(); } } catch (IOException e) { throw new RuntimeException("Got IO exception while parsing document", e); diff --git a/document/src/main/java/com/yahoo/document/json/readers/CompositeReader.java b/document/src/main/java/com/yahoo/document/json/readers/CompositeReader.java index b9f4d1d4613..712ab81899b 100644 --- a/document/src/main/java/com/yahoo/document/json/readers/CompositeReader.java +++ b/document/src/main/java/com/yahoo/document/json/readers/CompositeReader.java @@ -22,7 +22,11 @@ public class CompositeReader { @SuppressWarnings({ "cast", "rawtypes" }) public static FieldValue createComposite(TokenBuffer buffer, DataType expectedType) { FieldValue fieldValue = expectedType.createFieldValue(); - populateComposite(buffer, fieldValue); + if (buffer.currentToken().isStructStart()) { + populateComposite(buffer, fieldValue); + } else { + fieldValue.assign(buffer.currentText()); + } return fieldValue; } @@ -54,7 +58,4 @@ public class CompositeReader { } expectCompositeEnd(buffer.currentToken()); } - - - } |