diff options
author | Arne H Juul <arnej@yahooinc.com> | 2022-02-16 15:18:11 +0000 |
---|---|---|
committer | Arne H Juul <arnej@yahooinc.com> | 2022-02-16 15:18:11 +0000 |
commit | bb7c40435ff9f80c47cba77fbae7f2276171adf1 (patch) | |
tree | e30a52a9aec4e0b8eb8f8818f87c7b94f4cb9ad9 /document/src | |
parent | 90694216f0c1cd2dcb43fa346051949c72a9a438 (diff) |
avoid using getHeader() in serialization code
Diffstat (limited to 'document/src')
4 files changed, 31 insertions, 27 deletions
diff --git a/document/src/main/java/com/yahoo/document/serialization/VespaDocumentDeserializer6.java b/document/src/main/java/com/yahoo/document/serialization/VespaDocumentDeserializer6.java index 757356e3096..4afab9233c6 100644 --- a/document/src/main/java/com/yahoo/document/serialization/VespaDocumentDeserializer6.java +++ b/document/src/main/java/com/yahoo/document/serialization/VespaDocumentDeserializer6.java @@ -116,13 +116,11 @@ public class VespaDocumentDeserializer6 extends BufferSerializer implements Docu doc.setDataType(readDocumentType()); doc.setId(documentId); - Struct h = doc.getHeader(); - h.clear(); if ((content & 0x2) != 0) { - readHeaderBody(h); + readHeaderBody(doc); } if ((content & 0x4) != 0) { - readHeaderBody(h); + readHeaderBody(doc); } if (dataLength != (position() - dataPos)) { @@ -322,15 +320,12 @@ public class VespaDocumentDeserializer6 extends BufferSerializer implements Docu buf = bigBuf; } - private void readHeaderBody(Struct primary) { - primary.setVersion(version); - + private void readHeaderBody(Document target) { if (version < 8) { throw new DeserializationException("Illegal document serialization version " + version); } int dataSize = getInt(null); - byte comprCode = getByte(null); CompressionType compression = CompressionType.valueOf(comprCode); @@ -366,7 +361,8 @@ public class VespaDocumentDeserializer6 extends BufferSerializer implements Docu // for a while: deserialize from this buffer instead: buf = GrowableByteBuffer.wrap(destination); - StructDataType priType = primary.getDataType(); + StructDataType priType = target.getDataType().contentStruct(); + for (int i=0; i<numberOfFields; ++i) { int posBefore = position(); Integer f_id = fieldIdsAndLengths.get(i).first; @@ -374,7 +370,7 @@ public class VespaDocumentDeserializer6 extends BufferSerializer implements Docu if (structField != null) { FieldValue value = structField.getDataType().createFieldValue(); value.deserialize(structField, this); - primary.setFieldValue(structField, value); + target.setFieldValue(structField, value); } //jump to beginning of next field: position(posBefore + fieldIdsAndLengths.get(i).second.intValue()); diff --git a/document/src/main/java/com/yahoo/document/serialization/VespaDocumentSerializer6.java b/document/src/main/java/com/yahoo/document/serialization/VespaDocumentSerializer6.java index 09e41a0e8bf..8f5a0f6acd5 100644 --- a/document/src/main/java/com/yahoo/document/serialization/VespaDocumentSerializer6.java +++ b/document/src/main/java/com/yahoo/document/serialization/VespaDocumentSerializer6.java @@ -106,7 +106,8 @@ public class VespaDocumentSerializer6 extends BufferSerializer implements Docume doc.getDataType().serialize(this); if (hasHead) { - doc.getHeader().serialize(null, this); + StructuredFieldValue asStructured = doc; + write(null, asStructured); } int finalPos = buf.position(); @@ -311,12 +312,12 @@ public class VespaDocumentSerializer6 extends BufferSerializer implements Docume } /** - * Write out the value of struct field + * Write out the value of structured field * * @param field - field description (name and data type) * @param s - field value */ - public void write(FieldBase field, Struct s) { + public void write(FieldBase field, StructuredFieldValue s) { // Serialize all parts first.. As we need to know length before starting // Serialize all the fields. @@ -330,7 +331,9 @@ public class VespaDocumentSerializer6 extends BufferSerializer implements Docume List<Integer> fieldIds = new LinkedList<>(); List<java.lang.Integer> fieldLengths = new LinkedList<>(); - for (Map.Entry<Field, FieldValue> value : s.getFields()) { + var iter = s.iterator(); + while (iter.hasNext()) { + Map.Entry<Field, FieldValue> value = iter.next(); int startPos = buffer.position(); value.getValue().serialize(value.getKey(), this); @@ -343,13 +346,14 @@ public class VespaDocumentSerializer6 extends BufferSerializer implements Docume buffer.flip(); buf = bigBuffer; + int sz = fieldIds.size(); // Actual serialization starts here. int lenPos = buf.position(); putInt(null, 0); // Move back to this after compression is done. buf.put(CompressionType.NONE.getCode()); - buf.putInt1_4Bytes(s.getFieldCount()); + buf.putInt1_4Bytes(sz); - for (int i = 0; i < s.getFieldCount(); ++i) { + for (int i = 0; i < sz; ++i) { putInt1_4Bytes(null, fieldIds.get(i)); putInt2_4_8Bytes(null, fieldLengths.get(i)); } @@ -365,13 +369,14 @@ public class VespaDocumentSerializer6 extends BufferSerializer implements Docume } /** - * Write out the value of structured field + * Write out the value of struct field * * @param field - field description (name and data type) * @param value - field value */ - public void write(FieldBase field, StructuredFieldValue value) { - throw new IllegalArgumentException("Not Implemented"); + public void write(FieldBase field, Struct value) { + StructuredFieldValue asStructured = value; + write(field, asStructured); } /** diff --git a/document/src/main/java/com/yahoo/document/serialization/XmlDocumentWriter.java b/document/src/main/java/com/yahoo/document/serialization/XmlDocumentWriter.java index c610af9778d..082a88bb000 100644 --- a/document/src/main/java/com/yahoo/document/serialization/XmlDocumentWriter.java +++ b/document/src/main/java/com/yahoo/document/serialization/XmlDocumentWriter.java @@ -105,7 +105,8 @@ public final class XmlDocumentWriter implements DocumentWriter { if (lastModified != null) { buffer.addAttribute("lastmodifiedtime", lastModified); } - write(null, value.getHeader()); + StructuredFieldValue asStructured = value; + write(null, asStructured); buffer.endTag(); } @@ -228,14 +229,13 @@ public final class XmlDocumentWriter implements DocumentWriter { @Override public void write(FieldBase field, Struct value) { - optionalWrapperStart(field); - XmlSerializationHelper.printStructXml(value, buffer); - optionalWrapperEnd(field); + StructuredFieldValue asStructured = value; + write(field, asStructured); } @Override public void write(FieldBase field, StructuredFieldValue value) { - buffer.beginTag(field.getName()); + optionalWrapperStart(field); Iterator<Map.Entry<Field, FieldValue>> i = value.iterator(); while (i.hasNext()) { Map.Entry<Field, FieldValue> v = i.next(); @@ -243,7 +243,7 @@ public final class XmlDocumentWriter implements DocumentWriter { v.getValue().printXml(buffer); buffer.endTag(); } - buffer.endTag(); + optionalWrapperEnd(field); } @Override diff --git a/document/src/main/java/com/yahoo/document/serialization/XmlSerializationHelper.java b/document/src/main/java/com/yahoo/document/serialization/XmlSerializationHelper.java index 9b99c0c9bbd..1bb91b91762 100644 --- a/document/src/main/java/com/yahoo/document/serialization/XmlSerializationHelper.java +++ b/document/src/main/java/com/yahoo/document/serialization/XmlSerializationHelper.java @@ -54,7 +54,7 @@ public class XmlSerializationHelper { if (lastModified != null) { xml.addAttribute("lastmodifiedtime", lastModified); } - doc.getHeader().printXml(xml); + printStructured(doc, xml); } public static void printDoubleXml(DoubleFieldValue d, XmlStream xml) { @@ -97,7 +97,7 @@ public class XmlSerializationHelper { } } - public static void printStructXml(Struct s, XmlStream xml) { + private static void printStructured(StructuredFieldValue s, XmlStream xml) { Iterator<Map.Entry<Field, FieldValue>> it = s.iterator(); while (it.hasNext()) { Map.Entry<Field, FieldValue> val = it.next(); @@ -106,6 +106,9 @@ public class XmlSerializationHelper { xml.endTag(); } } + public static void printStructXml(Struct s, XmlStream xml) { + printStructured(s, xml); + } public static void printWeightedSetXml(WeightedSet ws, XmlStream xml) { Iterator<FieldValue> it = ws.fieldValueIterator(); |