summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--document/src/tests/fieldsettest.cpp14
-rw-r--r--document/src/vespa/document/fieldset/fieldsetrepo.cpp6
-rw-r--r--document/src/vespa/document/fieldset/fieldsets.cpp11
-rw-r--r--document/src/vespa/document/fieldset/fieldsets.h8
-rw-r--r--searchcore/src/tests/proton/document_iterator/document_iterator_test.cpp2
-rw-r--r--storage/src/vespa/storage/persistence/fieldvisitor.cpp4
-rw-r--r--storage/src/vespa/storage/persistence/fieldvisitor.h9
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;