summaryrefslogtreecommitdiffstats
path: root/document
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2017-07-25 17:05:52 +0200
committerHenning Baldersheim <balder@yahoo-inc.com>2017-07-31 17:04:16 +0200
commit76d9c00d726c3038e3ad1677619facb50336fb05 (patch)
tree14c34cb53c5336f1ac90aea07facde5d0b5d7303 /document
parenta52a8a0ca92398ae3d10bee8d0eb75fc00da453a (diff)
Serialize structs lazy as we do with documents..
Diffstat (limited to 'document')
-rw-r--r--document/src/tests/serialization/vespadocumentserializer_test.cpp8
-rw-r--r--document/src/vespa/document/serialization/vespadocumentserializer.cpp11
-rw-r--r--document/src/vespa/document/serialization/vespadocumentserializer.h2
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); }