summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2020-08-12 11:58:14 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2020-08-12 11:58:14 +0000
commitbe4d955b8bc9ab94d8ed1b72b03d5a112e196da2 (patch)
tree2b1e4860f80d2f27c38edc91397c546f99d4b203
parent7af09657ed382216b3406e26c6f79bb43ba090e3 (diff)
Follow up of PR comment with renaming and refactoring.
-rw-r--r--searchcore/src/tests/proton/document_iterator/document_iterator_test.cpp12
-rw-r--r--searchcore/src/tests/proton/documentdb/documentbucketmover/documentbucketmover_test.cpp2
-rw-r--r--searchcore/src/tests/proton/documentdb/lid_space_compaction/lid_space_compaction_test.cpp2
-rw-r--r--searchcore/src/tests/proton/documentdb/maintenancecontroller/maintenancecontroller_test.cpp2
-rw-r--r--searchcore/src/tests/proton/persistenceengine/persistenceengine_test.cpp2
-rw-r--r--searchcore/src/vespa/searchcore/proton/persistenceengine/commit_and_wait_document_retriever.cpp10
-rw-r--r--searchcore/src/vespa/searchcore/proton/persistenceengine/commit_and_wait_document_retriever.h4
-rw-r--r--searchcore/src/vespa/searchcore/proton/persistenceengine/i_document_retriever.cpp22
-rw-r--r--searchcore/src/vespa/searchcore/proton/persistenceengine/i_document_retriever.h5
-rw-r--r--searchcore/src/vespa/searchcore/proton/persistenceengine/persistenceengine.cpp2
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/documentbucketmover.cpp2
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/documentretriever.cpp86
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/documentretriever.h32
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/documentretrieverbase.cpp9
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/documentretrieverbase.h1
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/lid_space_compaction_handler.cpp2
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/minimal_document_retriever.cpp2
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/minimal_document_retriever.h2
18 files changed, 97 insertions, 102 deletions
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 9834511eb6f..75c427aafd5 100644
--- a/searchcore/src/tests/proton/document_iterator/document_iterator_test.cpp
+++ b/searchcore/src/tests/proton/document_iterator/document_iterator_test.cpp
@@ -133,7 +133,7 @@ struct UnitDR : DocumentRetrieverBaseForTest {
}
return DocumentMetaData();
}
- document::Document::UP getDocumentByLidOnly(DocumentIdT lid) const override {
+ document::Document::UP getFullDocument(DocumentIdT lid) const override {
return Document::UP((lid == docid) ? document->clone() : nullptr);
}
@@ -179,11 +179,11 @@ struct VisitRecordingUnitDR : UnitDR {
{
}
- document::Document::UP getDocumentByLidOnly(DocumentIdT lid) const override {
+ document::Document::UP getFullDocument(DocumentIdT lid) const override {
if (lid == docid) {
visited_lids.insert(lid);
}
- return UnitDR::getDocumentByLidOnly(lid);
+ return UnitDR::getFullDocument(lid);
}
};
@@ -262,9 +262,9 @@ struct PairDR : DocumentRetrieverBaseForTest {
DocumentMetaData ret = first->getDocumentMetaData(id);
return (ret.valid()) ? ret : second->getDocumentMetaData(id);
}
- document::Document::UP getDocumentByLidOnly(DocumentIdT lid) const override {
- Document::UP ret = first->getDocumentByLidOnly(lid);
- return ret ? std::move(ret) : second->getDocumentByLidOnly(lid);
+ document::Document::UP getFullDocument(DocumentIdT lid) const override {
+ Document::UP ret = first->getFullDocument(lid);
+ return ret ? std::move(ret) : second->getFullDocument(lid);
}
CachedSelect::SP parseSelect(const vespalib::string &selection) const override {
diff --git a/searchcore/src/tests/proton/documentdb/documentbucketmover/documentbucketmover_test.cpp b/searchcore/src/tests/proton/documentdb/documentbucketmover/documentbucketmover_test.cpp
index ae8ee7686da..bdeb4a09685 100644
--- a/searchcore/src/tests/proton/documentdb/documentbucketmover/documentbucketmover_test.cpp
+++ b/searchcore/src/tests/proton/documentdb/documentbucketmover/documentbucketmover_test.cpp
@@ -104,7 +104,7 @@ struct MyDocumentRetriever : public DocumentRetrieverBaseForTest
const document::DocumentTypeRepo &getDocumentTypeRepo() const override { return *_repo; }
void getBucketMetaData(const storage::spi::Bucket &, DocumentMetaData::Vector &) const override {}
DocumentMetaData getDocumentMetaData(const DocumentId &) const override { return DocumentMetaData(); }
- Document::UP getDocumentByLidOnly(DocumentIdT lid) const override {
+ Document::UP getFullDocument(DocumentIdT lid) const override {
return Document::UP(_docs[lid]->clone());
}
diff --git a/searchcore/src/tests/proton/documentdb/lid_space_compaction/lid_space_compaction_test.cpp b/searchcore/src/tests/proton/documentdb/lid_space_compaction/lid_space_compaction_test.cpp
index 44e053b8019..e045ec31418 100644
--- a/searchcore/src/tests/proton/documentdb/lid_space_compaction/lid_space_compaction_test.cpp
+++ b/searchcore/src/tests/proton/documentdb/lid_space_compaction/lid_space_compaction_test.cpp
@@ -217,7 +217,7 @@ struct MyDocumentRetriever : public DocumentRetrieverBaseForTest {
const document::DocumentTypeRepo& getDocumentTypeRepo() const override { return *repo; }
void getBucketMetaData(const storage::spi::Bucket&, DocumentMetaData::Vector&) const override { abort(); }
DocumentMetaData getDocumentMetaData(const DocumentId&) const override { abort(); }
- Document::UP getDocumentByLidOnly(DocumentIdT lid) const override {
+ Document::UP getFullDocument(DocumentIdT lid) const override {
return store.read(lid, *repo);
}
CachedSelect::SP parseSelect(const vespalib::string&) const override { abort(); }
diff --git a/searchcore/src/tests/proton/documentdb/maintenancecontroller/maintenancecontroller_test.cpp b/searchcore/src/tests/proton/documentdb/maintenancecontroller/maintenancecontroller_test.cpp
index 9fc2450cb20..2540a991015 100644
--- a/searchcore/src/tests/proton/documentdb/maintenancecontroller/maintenancecontroller_test.cpp
+++ b/searchcore/src/tests/proton/documentdb/maintenancecontroller/maintenancecontroller_test.cpp
@@ -171,7 +171,7 @@ struct MyDocumentRetriever : public DocumentRetrieverBaseForTest
}
Document::UP
- getDocumentByLidOnly(DocumentIdT lid) const override
+ getFullDocument(DocumentIdT lid) const override
{
return _subDB.getDocument(lid);
}
diff --git a/searchcore/src/tests/proton/persistenceengine/persistenceengine_test.cpp b/searchcore/src/tests/proton/persistenceengine/persistenceengine_test.cpp
index d43622cced3..a31deca5d12 100644
--- a/searchcore/src/tests/proton/persistenceengine/persistenceengine_test.cpp
+++ b/searchcore/src/tests/proton/persistenceengine/persistenceengine_test.cpp
@@ -127,7 +127,7 @@ struct MyDocumentRetriever : DocumentRetrieverBaseForTest {
}
return DocumentMetaData();
}
- document::Document::UP getDocumentByLidOnly(search::DocumentIdT) const override {
+ document::Document::UP getFullDocument(search::DocumentIdT) const override {
if (document != nullptr) {
return Document::UP(document->clone());
}
diff --git a/searchcore/src/vespa/searchcore/proton/persistenceengine/commit_and_wait_document_retriever.cpp b/searchcore/src/vespa/searchcore/proton/persistenceengine/commit_and_wait_document_retriever.cpp
index 9b91ce0c2ce..bf0faab1cff 100644
--- a/searchcore/src/vespa/searchcore/proton/persistenceengine/commit_and_wait_document_retriever.cpp
+++ b/searchcore/src/vespa/searchcore/proton/persistenceengine/commit_and_wait_document_retriever.cpp
@@ -28,18 +28,18 @@ CommitAndWaitDocumentRetriever::getDocumentMetaData(const document::DocumentId &
}
document::Document::UP
-CommitAndWaitDocumentRetriever::getDocumentByLidOnly(search::DocumentIdT lid) const {
+CommitAndWaitDocumentRetriever::getFullDocument(search::DocumentIdT lid) const {
// Ensure that attribute vectors are committed
_commit.commitAndWait();
- return _retriever->getDocumentByLidOnly(lid);
+ return _retriever->getFullDocument(lid);
}
document::Document::UP
-CommitAndWaitDocumentRetriever::getDocument(search::DocumentIdT lid, const document::DocumentId & docId,
- const document::FieldSet & fieldSet) const
+CommitAndWaitDocumentRetriever::getPartialDocument(search::DocumentIdT lid, const document::DocumentId & docId,
+ const document::FieldSet & fieldSet) const
{
_commit.commitAndWait();
- return _retriever->getDocument(lid, docId, fieldSet);
+ return _retriever->getPartialDocument(lid, docId, fieldSet);
}
void
diff --git a/searchcore/src/vespa/searchcore/proton/persistenceengine/commit_and_wait_document_retriever.h b/searchcore/src/vespa/searchcore/proton/persistenceengine/commit_and_wait_document_retriever.h
index e558513a83c..c03330164c0 100644
--- a/searchcore/src/vespa/searchcore/proton/persistenceengine/commit_and_wait_document_retriever.h
+++ b/searchcore/src/vespa/searchcore/proton/persistenceengine/commit_and_wait_document_retriever.h
@@ -24,8 +24,8 @@ public:
const document::DocumentTypeRepo &getDocumentTypeRepo() const override;
void getBucketMetaData(const Bucket &bucket, search::DocumentMetaData::Vector &result) const override;
search::DocumentMetaData getDocumentMetaData(const document::DocumentId &id) const override;
- DocumentUP getDocumentByLidOnly(search::DocumentIdT lid) const override;
- DocumentUP getDocument(search::DocumentIdT lid, const document::DocumentId & docId, const document::FieldSet & fieldSet) const override;
+ DocumentUP getFullDocument(search::DocumentIdT lid) const override;
+ DocumentUP getPartialDocument(search::DocumentIdT lid, const document::DocumentId & docId, const document::FieldSet & fieldSet) const override;
void visitDocuments(const LidVector &lids, search::IDocumentVisitor &visitor, ReadConsistency readConsistency) const override;
CachedSelect::SP parseSelect(const vespalib::string &selection) const override;
ReadGuard getReadGuard() const override;
diff --git a/searchcore/src/vespa/searchcore/proton/persistenceengine/i_document_retriever.cpp b/searchcore/src/vespa/searchcore/proton/persistenceengine/i_document_retriever.cpp
index 4678353d09a..952d1e8a693 100644
--- a/searchcore/src/vespa/searchcore/proton/persistenceengine/i_document_retriever.cpp
+++ b/searchcore/src/vespa/searchcore/proton/persistenceengine/i_document_retriever.cpp
@@ -9,24 +9,24 @@ namespace proton {
document::Document::UP
IDocumentRetriever::getDocument(search::DocumentIdT lid, const document::DocumentId & docId) const {
- return getDocument(lid, docId, document::AllFields());
-}
-
-void
-DocumentRetrieverBaseForTest::visitDocuments(const LidVector &lids, search::IDocumentVisitor &visitor, ReadConsistency readConsistency) const {
- (void) readConsistency;
- for (uint32_t lid : lids) {
- visitor.visit(lid, getDocumentByLidOnly(lid));
- }
+ return getPartialDocument(lid, docId, document::AllFields());
}
document::Document::UP
-DocumentRetrieverBaseForTest::getDocument(search::DocumentIdT lid, const document::DocumentId &, const document::FieldSet & fieldSet) const {
- auto doc = getDocumentByLidOnly(lid);
+IDocumentRetriever::getPartialDocument(search::DocumentIdT lid, const document::DocumentId &, const document::FieldSet & fieldSet) const {
+ auto doc = getFullDocument(lid);
if (doc) {
document::FieldSet::stripFields(*doc, fieldSet);
}
return doc;
}
+void
+DocumentRetrieverBaseForTest::visitDocuments(const LidVector &lids, search::IDocumentVisitor &visitor, ReadConsistency readConsistency) const {
+ (void) readConsistency;
+ for (uint32_t lid : lids) {
+ visitor.visit(lid, getFullDocument(lid));
+ }
+}
+
}
diff --git a/searchcore/src/vespa/searchcore/proton/persistenceengine/i_document_retriever.h b/searchcore/src/vespa/searchcore/proton/persistenceengine/i_document_retriever.h
index 06e8288eaa3..2d20ed7bc89 100644
--- a/searchcore/src/vespa/searchcore/proton/persistenceengine/i_document_retriever.h
+++ b/searchcore/src/vespa/searchcore/proton/persistenceengine/i_document_retriever.h
@@ -38,11 +38,11 @@ public:
/**
* Extracts the full document based on the LID
*/
- virtual DocumentUP getDocumentByLidOnly(search::DocumentIdT lid) const = 0;
+ virtual DocumentUP getFullDocument(search::DocumentIdT lid) const = 0;
/**
* Fetches the necessary set of fields, allowing for more optimal fetch when combining only from attributes.
*/
- virtual DocumentUP getDocument(search::DocumentIdT lid, const document::DocumentId & docId, const document::FieldSet & fieldSet) const = 0;
+ virtual DocumentUP getPartialDocument(search::DocumentIdT lid, const document::DocumentId & docId, const document::FieldSet & fieldSet) const;
virtual ReadGuard getReadGuard() const = 0;
virtual uint32_t getDocIdLimit() const = 0;
/**
@@ -64,7 +64,6 @@ public:
void visitDocuments(const LidVector &lids, search::IDocumentVisitor &visitor, ReadConsistency readConsistency) const override;
ReadGuard getReadGuard() const override { return ReadGuard(); }
uint32_t getDocIdLimit() const override { return std::numeric_limits<uint32_t>::max(); }
- DocumentUP getDocument(search::DocumentIdT lid, const document::DocumentId &, const document::FieldSet &) const override;
};
} // namespace proton
diff --git a/searchcore/src/vespa/searchcore/proton/persistenceengine/persistenceengine.cpp b/searchcore/src/vespa/searchcore/proton/persistenceengine/persistenceengine.cpp
index acfec09e93b..b5166276e4a 100644
--- a/searchcore/src/vespa/searchcore/proton/persistenceengine/persistenceengine.cpp
+++ b/searchcore/src/vespa/searchcore/proton/persistenceengine/persistenceengine.cpp
@@ -439,7 +439,7 @@ PersistenceEngine::get(const Bucket& b, const document::FieldSet& fields, const
if (document::FieldSet::Type::NONE == fields.getType()) {
return GetResult::make_for_metadata_only(meta.timestamp);
}
- document::Document::UP doc = retriever.getDocument(meta.lid, did, fields);
+ document::Document::UP doc = retriever.getPartialDocument(meta.lid, did, fields);
if (!doc || doc->getId().getGlobalId() != meta.gid) {
return GetResult();
}
diff --git a/searchcore/src/vespa/searchcore/proton/server/documentbucketmover.cpp b/searchcore/src/vespa/searchcore/proton/server/documentbucketmover.cpp
index c5a1eb0c1e3..3d5c51c4346 100644
--- a/searchcore/src/vespa/searchcore/proton/server/documentbucketmover.cpp
+++ b/searchcore/src/vespa/searchcore/proton/server/documentbucketmover.cpp
@@ -24,7 +24,7 @@ DocumentBucketMover::moveDocument(DocumentIdT lid,
const document::GlobalId &gid,
Timestamp timestamp)
{
- Document::SP doc(_source->retriever()->getDocumentByLidOnly(lid).release());
+ Document::SP doc(_source->retriever()->getFullDocument(lid).release());
if (!doc || doc->getId().getGlobalId() != gid)
return; // Failed to retrieve document, removed or changed identity
// TODO(geirst): what if doc is NULL?
diff --git a/searchcore/src/vespa/searchcore/proton/server/documentretriever.cpp b/searchcore/src/vespa/searchcore/proton/server/documentretriever.cpp
index 83961033255..1560da124d7 100644
--- a/searchcore/src/vespa/searchcore/proton/server/documentretriever.cpp
+++ b/searchcore/src/vespa/searchcore/proton/server/documentretriever.cpp
@@ -45,6 +45,31 @@ bool is_array_of_position_type(const document::DataType& field_type) noexcept {
}
+FieldSetAttributeDB::FieldSetAttributeDB(const IFieldInfo & fieldInfo)
+ : _fieldInfo(fieldInfo),
+ _isFieldSetAttributeOnly(),
+ _lock()
+{}
+
+FieldSetAttributeDB::~FieldSetAttributeDB() = default;
+
+bool
+FieldSetAttributeDB::areAllFieldsAttributes(uint64_t key, const document::Field::Set & set) const {
+ std::lock_guard guard(_lock);
+ auto found = _isFieldSetAttributeOnly.find(key);
+ if (found != _isFieldSetAttributeOnly.end()) {
+ return ! found->second;
+ }
+
+ bool isAttributeOnly = true;
+ for (const document::Field * field : set) {
+ isAttributeOnly = _fieldInfo.isFieldAttribute(*field);
+ if (!isAttributeOnly) break;
+ }
+ _isFieldSetAttributeOnly[key] = isAttributeOnly;
+ return isAttributeOnly;
+}
+
DocumentRetriever
::DocumentRetriever(const DocTypeName &docTypeName,
const DocumentTypeRepo &repo,
@@ -58,8 +83,8 @@ DocumentRetriever
_doc_store(doc_store),
_possiblePositionFields(),
_attributeFields(),
- _areAllFieldsAttributes(false),
- _isFieldSetAttributeOnly()
+ _areAllFieldsAttributes(true),
+ _fieldSetAttributeInfo(*this)
{
const DocumentType * documentType = repo.getDocumentType(docTypeName.getName());
document::Field::Set fields = documentType->getFieldSet();
@@ -73,6 +98,8 @@ DocumentRetriever
if (attr && attr->valid()) {
LOG(debug, "Field '%s' is a registered attribute field", zcurve_name.c_str());
_possiblePositionFields.emplace_back(field, zcurve_name);
+ } else {
+ _areAllFieldsAttributes = false;
}
} else {
const vespalib::string &name = field->getName();
@@ -83,6 +110,8 @@ DocumentRetriever
&& ((*attr)->getBasicType() != BasicType::REFERENCE))
{
_attributeFields.insert(field);
+ } else {
+ _areAllFieldsAttributes = false;
}
}
}
@@ -92,18 +121,17 @@ bool
DocumentRetriever::needFetchFromDocStore(const document::FieldSet & fieldSet) const {
switch (fieldSet.getType()) {
case document::FieldSet::Type::NONE:
- return false;
case document::FieldSet::Type::DOCID:
return false;
case document::FieldSet::Type::ALL:
return ! _areAllFieldsAttributes;
case document::FieldSet::Type::FIELD: {
const auto & field = static_cast<const document::Field &>(fieldSet);
- return needFetchFromDocStore(field.getId(), field);
+ return ! isFieldAttribute(field);
}
case document::FieldSet::Type::SET: {
const auto &set = static_cast<const document::FieldCollection &>(fieldSet);
- return needFetchFromDocStore(set.hash(), set.getFields());
+ return ! _fieldSetAttributeInfo.areAllFieldsAttributes(set.hash(), set.getFields());
}
default:
abort();
@@ -113,51 +141,14 @@ DocumentRetriever::needFetchFromDocStore(const document::FieldSet & fieldSet) co
bool
DocumentRetriever::isFieldAttribute(const document::Field & field) const {
return _attributeFields.find(&field) != _attributeFields.end();
-#if 0
- for (const document::Field * attr : _attributeFields) {
- if (attr->getId() == field.getId()) {
- return true;
- }
- }
- return false;
-#endif
-}
-
-bool
-DocumentRetriever::needFetchFromDocStore(uint64_t key, const document::Field & field) const {
- std::lock_guard guard(_lock);
- auto found = _isFieldSetAttributeOnly.find(key);
- if (found != _isFieldSetAttributeOnly.end()) {
- return ! found->second;
- }
-
- bool isAttributeOnly = isFieldAttribute(field);
- _isFieldSetAttributeOnly[key] = isAttributeOnly;
- return isAttributeOnly;
-}
-
-bool
-DocumentRetriever::needFetchFromDocStore(uint64_t key, const document::Field::Set & set) const {
- std::lock_guard guard(_lock);
- auto found = _isFieldSetAttributeOnly.find(key);
- if (found != _isFieldSetAttributeOnly.end()) {
- return ! found->second;
- }
-
- bool isAttributeOnly = true;
- for (const document::Field * field : set) {
- isAttributeOnly = isFieldAttribute(*field);
- if (!isAttributeOnly) break;
- }
- _isFieldSetAttributeOnly[key] = isAttributeOnly;
- return isAttributeOnly;
}
DocumentRetriever::~DocumentRetriever() = default;
namespace {
-FieldValue::UP positionFromZcurve(int64_t zcurve) {
+std::unique_ptr<document::FieldValue>
+positionFromZcurve(int64_t zcurve) {
int32_t x, y;
ZCurve::decode(zcurve, &x, &y);
@@ -184,7 +175,8 @@ zcurve_array_attribute_to_field_value(const document::Field& field,
return new_fv;
}
-void fillInPositionFields(Document &doc, DocumentIdT lid, const DocumentRetriever::PositionFields & possiblePositionFields, const IAttributeManager & attr_manager)
+void
+fillInPositionFields(Document &doc, DocumentIdT lid, const DocumentRetriever::PositionFields & possiblePositionFields, const IAttributeManager & attr_manager)
{
for (const auto & it : possiblePositionFields) {
auto attr_guard = attr_manager.getAttribute(it.second);
@@ -228,7 +220,7 @@ private:
} // namespace
Document::UP
-DocumentRetriever::getDocumentByLidOnly(DocumentIdT lid) const
+DocumentRetriever::getFullDocument(DocumentIdT lid) const
{
Document::UP doc = _doc_store.read(lid, getDocumentTypeRepo());
if (doc) {
@@ -238,7 +230,7 @@ DocumentRetriever::getDocumentByLidOnly(DocumentIdT lid) const
}
Document::UP
-DocumentRetriever::getDocument(search::DocumentIdT lid, const document::DocumentId & docId, const document::FieldSet & fieldSet) const {
+DocumentRetriever::getPartialDocument(search::DocumentIdT lid, const document::DocumentId & docId, const document::FieldSet & fieldSet) const {
Document::UP doc;
if (needFetchFromDocStore(fieldSet)) {
doc = _doc_store.read(lid, getDocumentTypeRepo());
diff --git a/searchcore/src/vespa/searchcore/proton/server/documentretriever.h b/searchcore/src/vespa/searchcore/proton/server/documentretriever.h
index 8e7de1cf152..bab8898c8ea 100644
--- a/searchcore/src/vespa/searchcore/proton/server/documentretriever.h
+++ b/searchcore/src/vespa/searchcore/proton/server/documentretriever.h
@@ -14,7 +14,25 @@ namespace search::index { class Schema; }
namespace proton {
-class DocumentRetriever : public DocumentRetrieverBase {
+struct IFieldInfo {
+ virtual ~IFieldInfo() = default;
+ virtual bool isFieldAttribute(const document::Field & field) const = 0;
+};
+
+class FieldSetAttributeDB {
+public:
+ FieldSetAttributeDB(const IFieldInfo & fieldInfo);
+ ~FieldSetAttributeDB();
+ bool areAllFieldsAttributes(uint64_t key, const document::Field::Set & set) const;
+private:
+ using FieldSetAttributeMap = vespalib::hash_map<uint64_t, bool>;
+ const IFieldInfo & _fieldInfo;
+ mutable FieldSetAttributeMap _isFieldSetAttributeOnly;
+ mutable std::mutex _lock;
+};
+
+class DocumentRetriever : public DocumentRetrieverBase,
+ public IFieldInfo {
public:
typedef std::vector<std::pair<const document::Field *, vespalib::string>> PositionFields;
DocumentRetriever(const DocTypeName &docTypeName,
@@ -25,26 +43,22 @@ public:
const search::IDocumentStore &doc_store);
~DocumentRetriever() override;
- document::Document::UP getDocumentByLidOnly(search::DocumentIdT lid) const override;
+ document::Document::UP getFullDocument(search::DocumentIdT lid) const override;
void visitDocuments(const LidVector & lids, search::IDocumentVisitor & visitor, ReadConsistency) const override;
- DocumentUP getDocument(search::DocumentIdT lid, const document::DocumentId &, const document::FieldSet &) const override;
+ DocumentUP getPartialDocument(search::DocumentIdT lid, const document::DocumentId &, const document::FieldSet &) const override;
void populate(search::DocumentIdT lid, document::Document & doc) const;
bool needFetchFromDocStore(const document::FieldSet &) const;
private:
- using FieldSetAttributeMap = vespalib::hash_map<uint64_t, bool>;
- bool needFetchFromDocStore(uint64_t key, const document::Field &) const;
- bool needFetchFromDocStore(uint64_t key, const document::Field::Set &) const;
void populate(search::DocumentIdT lid, document::Document & doc, const document::Field::Set & attributeFields) const;
- bool isFieldAttribute(const document::Field & field) const;
+ bool isFieldAttribute(const document::Field & field) const override;
const search::index::Schema &_schema;
const search::IAttributeManager &_attr_manager;
const search::IDocumentStore &_doc_store;
PositionFields _possiblePositionFields;
document::Field::Set _attributeFields;
bool _areAllFieldsAttributes;
- mutable FieldSetAttributeMap _isFieldSetAttributeOnly;
- mutable std::mutex _lock;
+ FieldSetAttributeDB _fieldSetAttributeInfo;
const search::IAttributeManager * getAttrMgr() const override;
};
diff --git a/searchcore/src/vespa/searchcore/proton/server/documentretrieverbase.cpp b/searchcore/src/vespa/searchcore/proton/server/documentretrieverbase.cpp
index 698308c7610..1476a699adb 100644
--- a/searchcore/src/vespa/searchcore/proton/server/documentretrieverbase.cpp
+++ b/searchcore/src/vespa/searchcore/proton/server/documentretrieverbase.cpp
@@ -87,13 +87,4 @@ DocumentRetrieverBase::parseSelect(const vespalib::string &selection) const
return nselect;
}
-document::Document::UP
-DocumentRetrieverBase::getDocument(search::DocumentIdT lid, const document::DocumentId &, const document::FieldSet & fieldSet) const {
- auto doc = getDocumentByLidOnly(lid);
- if (doc) {
- document::FieldSet::stripFields(*doc, fieldSet);
- }
- return doc;
-}
-
} // namespace proton
diff --git a/searchcore/src/vespa/searchcore/proton/server/documentretrieverbase.h b/searchcore/src/vespa/searchcore/proton/server/documentretrieverbase.h
index b2780c89395..351a0c9142b 100644
--- a/searchcore/src/vespa/searchcore/proton/server/documentretrieverbase.h
+++ b/searchcore/src/vespa/searchcore/proton/server/documentretrieverbase.h
@@ -39,7 +39,6 @@ public:
const document::DocumentTypeRepo &getDocumentTypeRepo() const override;
void getBucketMetaData(const storage::spi::Bucket &bucket, search::DocumentMetaData::Vector &result) const override;
search::DocumentMetaData getDocumentMetaData(const document::DocumentId &id) const override;
- DocumentUP getDocument(search::DocumentIdT lid, const document::DocumentId &, const document::FieldSet &) const override;
CachedSelect::SP parseSelect(const vespalib::string &selection) const override;
ReadGuard getReadGuard() const override { return _meta_store.getReadGuard(); }
uint32_t getDocIdLimit() const override { return _meta_store.getReadGuard()->get().getCommittedDocIdLimit(); }
diff --git a/searchcore/src/vespa/searchcore/proton/server/lid_space_compaction_handler.cpp b/searchcore/src/vespa/searchcore/proton/server/lid_space_compaction_handler.cpp
index dfaf218036d..8aeaf7fd9e4 100644
--- a/searchcore/src/vespa/searchcore/proton/server/lid_space_compaction_handler.cpp
+++ b/searchcore/src/vespa/searchcore/proton/server/lid_space_compaction_handler.cpp
@@ -46,7 +46,7 @@ MoveOperation::UP
LidSpaceCompactionHandler::createMoveOperation(const search::DocumentMetaData &document, uint32_t moveToLid) const
{
const uint32_t moveFromLid = document.lid;
- auto doc = _subDb.retriever()->getDocumentByLidOnly(moveFromLid);
+ auto doc = _subDb.retriever()->getFullDocument(moveFromLid);
auto op = std::make_unique<MoveOperation>(document.bucketId, document.timestamp,
Document::SP(doc.release()),
DbDocumentId(_subDb.sub_db_id(), moveFromLid),
diff --git a/searchcore/src/vespa/searchcore/proton/server/minimal_document_retriever.cpp b/searchcore/src/vespa/searchcore/proton/server/minimal_document_retriever.cpp
index 5751a0ae4de..a9fab85ae0d 100644
--- a/searchcore/src/vespa/searchcore/proton/server/minimal_document_retriever.cpp
+++ b/searchcore/src/vespa/searchcore/proton/server/minimal_document_retriever.cpp
@@ -24,7 +24,7 @@ MinimalDocumentRetriever::MinimalDocumentRetriever(
MinimalDocumentRetriever::~MinimalDocumentRetriever() = default;
Document::UP
-MinimalDocumentRetriever::getDocumentByLidOnly(DocumentIdT lid) const {
+MinimalDocumentRetriever::getFullDocument(DocumentIdT lid) const {
return _doc_store.read(lid, *_repo);
}
diff --git a/searchcore/src/vespa/searchcore/proton/server/minimal_document_retriever.h b/searchcore/src/vespa/searchcore/proton/server/minimal_document_retriever.h
index 8a99ae0ac5e..d7265915753 100644
--- a/searchcore/src/vespa/searchcore/proton/server/minimal_document_retriever.h
+++ b/searchcore/src/vespa/searchcore/proton/server/minimal_document_retriever.h
@@ -27,7 +27,7 @@ public:
bool hasFields);
~MinimalDocumentRetriever() override;
- document::Document::UP getDocumentByLidOnly(search::DocumentIdT lid) const override;
+ document::Document::UP getFullDocument(search::DocumentIdT lid) const override;
void visitDocuments(const LidVector & lids, search::IDocumentVisitor & visitor, ReadConsistency) const override;
};
} // namespace proton