diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2017-07-25 17:05:52 +0200 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2017-07-31 17:04:16 +0200 |
commit | 76d9c00d726c3038e3ad1677619facb50336fb05 (patch) | |
tree | 14c34cb53c5336f1ac90aea07facde5d0b5d7303 /document | |
parent | a52a8a0ca92398ae3d10bee8d0eb75fc00da453a (diff) |
Serialize structs lazy as we do with documents..
Diffstat (limited to 'document')
3 files changed, 16 insertions, 5 deletions
diff --git a/document/src/tests/serialization/vespadocumentserializer_test.cpp b/document/src/tests/serialization/vespadocumentserializer_test.cpp index 4b4f46bbaa9..174e49798bf 100644 --- a/document/src/tests/serialization/vespadocumentserializer_test.cpp +++ b/document/src/tests/serialization/vespadocumentserializer_test.cpp @@ -529,7 +529,7 @@ TEST("requireThatReserializationPreservesCompressionIfUnmodified") { const_cast<StructDataType &>(value.getStructType()). setCompressionConfig(CompressionConfig(CompressionConfig::LZ4, 0, 95)); - checkStructSerialization(value, CompressionConfig::LZ4); + TEST_DO(checkStructSerialization(value, CompressionConfig::LZ4)); nbostream os; VespaDocumentSerializer serializer(os); @@ -539,9 +539,9 @@ TEST("requireThatReserializationPreservesCompressionIfUnmodified") { StructFieldValue value2(struct_type); VespaDocumentDeserializer deserializer(repo, os, serialization_version); deserializer.read(value2); - checkStructSerialization(value, CompressionConfig::LZ4); - // No lazy serialization of structs anymore, only documents - checkStructSerialization(value2, CompressionConfig::NONE); + TEST_DO(checkStructSerialization(value, CompressionConfig::LZ4)); + // Lazy serialization of structs.... + TEST_DO(checkStructSerialization(value2, CompressionConfig::LZ4)); EXPECT_EQUAL(value, value2); } diff --git a/document/src/vespa/document/serialization/vespadocumentserializer.cpp b/document/src/vespa/document/serialization/vespadocumentserializer.cpp index 1810b9fb631..0c0841bf85e 100644 --- a/document/src/vespa/document/serialization/vespadocumentserializer.cpp +++ b/document/src/vespa/document/serialization/vespadocumentserializer.cpp @@ -151,6 +151,17 @@ void VespaDocumentSerializer::write(const Document &value, _stream.write(doc_stream.peek(), doc_stream.size()); } +void VespaDocumentSerializer::visit(const StructFieldValue &value) +{ + if (!structNeedsReserialization(value)) { + const StructFieldValue::Chunks & chunks = value.getChunks(); + assert(chunks.size() == 1); + writeUnchanged(chunks[0]); + } else { + write(value, AllFields()); + } +} + void VespaDocumentSerializer::write(const AnnotationReferenceFieldValue &value) { putInt1_2_4Bytes(_stream, value.getAnnotationIndex()); diff --git a/document/src/vespa/document/serialization/vespadocumentserializer.h b/document/src/vespa/document/serialization/vespadocumentserializer.h index e5c2dc4a3de..3b0fe581c9e 100644 --- a/document/src/vespa/document/serialization/vespadocumentserializer.h +++ b/document/src/vespa/document/serialization/vespadocumentserializer.h @@ -101,7 +101,7 @@ private: void visit(const RawFieldValue &value) override { write(value); } void visit(const ShortFieldValue &value) override { write(value); } void visit(const StringFieldValue &value) override { write(value); } - void visit(const StructFieldValue &value) override { write(value, AllFields()); } + void visit(const StructFieldValue &value) override; void visit(const WeightedSetFieldValue &value) override { write(value); } void visit(const TensorFieldValue &value) override { write(value); } void visit(const ReferenceFieldValue& value) override { write(value); } |