diff options
author | freva <valerijf@yahoo-inc.com> | 2017-02-10 11:14:52 +0100 |
---|---|---|
committer | freva <valerijf@yahoo-inc.com> | 2017-02-10 11:14:52 +0100 |
commit | dd4d45b74bcafac741a43e213336853f21b476b0 (patch) | |
tree | 27b9d98150e42cd176e5cc1038a95fb452fcfba1 /document | |
parent | 7f7b4e172e4ab301c46b8c7d2377f45685862221 (diff) |
Buffer fieldpaths to process later
Diffstat (limited to 'document')
3 files changed, 28 insertions, 22 deletions
diff --git a/document/src/main/java/com/yahoo/document/json/TokenBuffer.java b/document/src/main/java/com/yahoo/document/json/TokenBuffer.java index 9f6a0ba3641..edb2ba0be00 100644 --- a/document/src/main/java/com/yahoo/document/json/TokenBuffer.java +++ b/document/src/main/java/com/yahoo/document/json/TokenBuffer.java @@ -72,12 +72,20 @@ public class TokenBuffer { buffer.addLast(new Token(token, name, text)); } - public void bufferObject(JsonToken first, JsonParser tokens) { + public void bufferObject(JsonToken first, JsonParser tokens) { + bufferJsonStruct(first, tokens, JsonToken.START_OBJECT); + } + + public void bufferArray(JsonToken first, JsonParser tokens) { + bufferJsonStruct(first, tokens, JsonToken.START_ARRAY); + } + + private void bufferJsonStruct(JsonToken first, JsonParser tokens, JsonToken firstToken) { int localNesting = 0; JsonToken t = first; - Preconditions.checkArgument(first == JsonToken.START_OBJECT, - "Expected START_OBJECT, got %s.", t); + Preconditions.checkArgument(first == firstToken, + "Expected %s, got %s.", firstToken.name(), t); if (size() == 0) { updateNesting(t); } 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 8053246a266..1c3f3af58b0 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 @@ -21,6 +21,7 @@ public class DocumentParser { private static final String CONDITION = "condition"; public static final String CREATE_IF_NON_EXISTENT = "create"; public static final String FIELDS = "fields"; + public static final String FIELDPATHS = "fieldpaths"; public static final String REMOVE = "remove"; public static Optional<DocumentParseInfo> parseDocument(JsonParser parser) throws IOException { @@ -109,35 +110,31 @@ public class DocumentParser { indentLevel--; break; case START_ARRAY: - indentLevel+=10000L; + indentLevel += 10000L; break; case END_ARRAY: - indentLevel-=10000L; + indentLevel -= 10000L; break; } - if (indentLevel == 1 && (t == JsonToken.VALUE_TRUE || t == JsonToken.VALUE_FALSE)) { - try { + try { + if (indentLevel == 0L && t == JsonToken.END_OBJECT) { + break; + } else if (indentLevel == 1L && (t == JsonToken.VALUE_TRUE || t == JsonToken.VALUE_FALSE)) { if (CREATE_IF_NON_EXISTENT.equals(parser.getCurrentName())) { documentParseInfo.create = Optional.ofNullable(parser.getBooleanValue()); - continue; } - } catch (IOException e) { - throw new RuntimeException("Got IO exception while parsing document", e); - } - } - if (indentLevel == 2L && t == JsonToken.START_OBJECT) { - - try { - if (!FIELDS.equals(parser.getCurrentName())) { - continue; - } - } catch (IOException e) { - throw new RuntimeException("Got IO exception while parsing document", e); + } else if (indentLevel == 2L && t == JsonToken.START_OBJECT && FIELDS.equals(parser.getCurrentName())) { + documentParseInfo.fieldsBuffer.bufferObject(t, parser); + indentLevel--; + } else if (indentLevel == 10001L && t == JsonToken.START_ARRAY && FIELDPATHS.equals(parser.getCurrentName())) { + documentParseInfo.fieldpathsBuffer.bufferArray(t, parser); + indentLevel -= 10000L; } - documentParseInfo.fieldsBuffer.bufferObject(t, parser); - break; + } catch (IOException e) { + throw new RuntimeException("Got IO exception while parsing document", e); } } + return documentParseInfo; } } diff --git a/document/src/main/java/com/yahoo/document/json/readers/DocumentParseInfo.java b/document/src/main/java/com/yahoo/document/json/readers/DocumentParseInfo.java index 7401e33c607..2661c3f0097 100644 --- a/document/src/main/java/com/yahoo/document/json/readers/DocumentParseInfo.java +++ b/document/src/main/java/com/yahoo/document/json/readers/DocumentParseInfo.java @@ -13,4 +13,5 @@ public class DocumentParseInfo { public Optional<String> condition = Optional.empty(); public DocumentParser.SupportedOperation operationType = null; public TokenBuffer fieldsBuffer = new TokenBuffer(); + public TokenBuffer fieldpathsBuffer = new TokenBuffer(); } |