diff options
7 files changed, 34 insertions, 20 deletions
diff --git a/document/src/tests/fieldsettest.cpp b/document/src/tests/fieldsettest.cpp index 2642bbe23ce..472ede57b6d 100644 --- a/document/src/tests/fieldsettest.cpp +++ b/document/src/tests/fieldsettest.cpp @@ -291,20 +291,22 @@ TEST(FieldCollectionTest, testHash ) { const DocumentType & type = *repo.getDocumentType("testdoctype1"); FieldCollection fc(type); EXPECT_EQ(0ul, fc.hash()); - fc.insert(type.getField("headerval")); + fc.insertField(type.getField("headerval")); + EXPECT_EQ(0ul, fc.hash()); + fc.complete(); EXPECT_EQ(0x548599858c77ef83ul, fc.hash()); - fc.insert(type.getField("hstringval")); + fc.insertField(type.getField("hstringval")).complete(); EXPECT_EQ(0x4a7ff2406d36a9b0ul, fc.hash()); - fc.insert(type.getField("headerval")); + fc.insertField(type.getField("headerval")).complete(); EXPECT_EQ(0x4a7ff2406d36a9b0ul, fc.hash()); FieldCollection fc2(type); EXPECT_EQ(0ul, fc2.hash()); - fc2.insert(type.getField("hstringval")); + fc2.insertField(type.getField("hstringval")).complete(); EXPECT_EQ(0x1e0918531b19734ul, fc2.hash()); - fc2.insert(type.getField("headerval")); + fc2.insertField(type.getField("headerval")).complete(); EXPECT_EQ(fc.hash(), fc2.hash()); - fc2.insert(type.getField("headerval")); + fc2.insertField(type.getField("headerval")).complete(); EXPECT_EQ(fc.hash(), fc2.hash()); } diff --git a/document/src/vespa/document/fieldset/fieldsetrepo.cpp b/document/src/vespa/document/fieldset/fieldsetrepo.cpp index 614a8740f90..e202a370559 100644 --- a/document/src/vespa/document/fieldset/fieldsetrepo.cpp +++ b/document/src/vespa/document/fieldset/fieldsetrepo.cpp @@ -50,13 +50,13 @@ parseFieldCollection(const DocumentTypeRepo& repo, const DocumentType::FieldSet * fs = type.getFieldSet(token); if (fs) { for (const auto & fieldName : fs->getFields()) { - collection->insert(type.getField(fieldName)); + collection->insertField(type.getField(fieldName)); } } else { - collection->insert(type.getField(token)); + collection->insertField(type.getField(token)); } } - + collection->complete(); return collection; } diff --git a/document/src/vespa/document/fieldset/fieldsets.cpp b/document/src/vespa/document/fieldset/fieldsets.cpp index d878d38be14..ae0703ed66b 100644 --- a/document/src/vespa/document/fieldset/fieldsets.cpp +++ b/document/src/vespa/document/fieldset/fieldsets.cpp @@ -28,6 +28,8 @@ FieldCollection::FieldCollection(const DocumentType& type) { } +FieldCollection::FieldCollection(const FieldCollection&) = default; + FieldCollection::~FieldCollection() = default; bool @@ -65,10 +67,13 @@ FieldCollection::contains(const FieldSet& fields) const return false; } -void -FieldCollection::insert(const Field& f) -{ +FieldCollection & +FieldCollection::insertField(const Field& f) { _set.insert(&f); + return *this; +} +void +FieldCollection::complete() { _hash = computeHash(_set); } diff --git a/document/src/vespa/document/fieldset/fieldsets.h b/document/src/vespa/document/fieldset/fieldsets.h index eac35244012..44b6b8a6405 100644 --- a/document/src/vespa/document/fieldset/fieldsets.h +++ b/document/src/vespa/document/fieldset/fieldsets.h @@ -42,6 +42,8 @@ public: typedef std::unique_ptr<FieldCollection> UP; FieldCollection(const DocumentType& docType); + FieldCollection(const FieldCollection &); + FieldCollection(FieldCollection&&) = default; ~FieldCollection() override; bool contains(const FieldSet& fields) const override; @@ -57,7 +59,11 @@ public: /** * Inserts the given field into the collection. */ - void insert(const Field& f); + FieldCollection & insertField(const Field& f); + /** + * Must be called after all fields are inserted + */ + void complete(); /** * Returns all the fields contained in this collection. diff --git a/searchcore/src/tests/proton/document_iterator/document_iterator_test.cpp b/searchcore/src/tests/proton/document_iterator/document_iterator_test.cpp index f52ca606900..b215cae9149 100644 --- a/searchcore/src/tests/proton/document_iterator/document_iterator_test.cpp +++ b/searchcore/src/tests/proton/document_iterator/document_iterator_test.cpp @@ -749,7 +749,7 @@ TEST("require that document selection and timestamp range works together") { TEST("require that fieldset limits fields returned") { document::FieldCollection limited(getDocType()); - limited.insert(getDocType().getField("header")); + limited.insertField(getDocType().getField("header")).complete(); DocumentIterator itr(bucket(5), limited, selectAll(), newestV(), -1, false); itr.add(doc_with_fields("id:ns:foo::xxx1", Timestamp(1), bucket(5))); IterateResult res = itr.iterate(largeNum); diff --git a/storage/src/vespa/storage/persistence/fieldvisitor.cpp b/storage/src/vespa/storage/persistence/fieldvisitor.cpp index df9d3df6379..a544105be68 100644 --- a/storage/src/vespa/storage/persistence/fieldvisitor.cpp +++ b/storage/src/vespa/storage/persistence/fieldvisitor.cpp @@ -6,10 +6,10 @@ namespace storage { -FieldVisitor::~FieldVisitor() {} +FieldVisitor::~FieldVisitor() = default; void FieldVisitor::visitFieldValueNode(const document::select::FieldValueNode & node) { - _fields.insert(_docType.getField(node.getRealFieldName())); + _fields.insertField(_docType.getField(node.getRealFieldName())); } void FieldVisitor::visitComparison(const document::select::Compare & node) { diff --git a/storage/src/vespa/storage/persistence/fieldvisitor.h b/storage/src/vespa/storage/persistence/fieldvisitor.h index 4b47c68e33b..d34b7049b88 100644 --- a/storage/src/vespa/storage/persistence/fieldvisitor.h +++ b/storage/src/vespa/storage/persistence/fieldvisitor.h @@ -19,14 +19,15 @@ private: document::FieldCollection _fields; public: - FieldVisitor(const document::DocumentType & docType) + explicit FieldVisitor(const document::DocumentType & docType) : _docType(docType), _fields(_docType) {} - ~FieldVisitor(); + ~FieldVisitor() override; - const document::FieldSet & getFieldSet() { - return _fields; + document::FieldCollection getFieldSet() { + _fields.complete(); + return std::move(_fields); } void visitFieldValueNode(const document::select::FieldValueNode &) override; |