summaryrefslogtreecommitdiffstats
path: root/searchcore
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@broadpark.no>2018-10-08 19:19:00 +0200
committerTor Egge <Tor.Egge@broadpark.no>2018-10-09 10:35:12 +0200
commit3e5e495e56a261ceb19d9c2af0aedec135e635f4 (patch)
treed9185ea463c3189a6bd0677b0051a761044fb33e /searchcore
parentfb3ff51c1aaa7f90041e6c7fd148a4a46d6618cb (diff)
Test that document retriever removes document field when
corresponding multivalue attribute vector has zero values.
Diffstat (limited to 'searchcore')
-rw-r--r--searchcore/src/tests/proton/server/documentretriever_test.cpp38
1 files changed, 38 insertions, 0 deletions
diff --git a/searchcore/src/tests/proton/server/documentretriever_test.cpp b/searchcore/src/tests/proton/server/documentretriever_test.cpp
index f8ec0d20d33..abf595f87eb 100644
--- a/searchcore/src/tests/proton/server/documentretriever_test.cpp
+++ b/searchcore/src/tests/proton/server/documentretriever_test.cpp
@@ -114,11 +114,24 @@ const int64_t static_zcurve_value = 1118035438880ll;
const int64_t dynamic_zcurve_value = 6145423666930817152ll;
struct MyDocumentStore : proton::test::DummyDocumentStore {
+ mutable std::unique_ptr<Document> _testDoc;
+
+ MyDocumentStore()
+ : proton::test::DummyDocumentStore(),
+ _testDoc()
+ {
+ }
+
+ ~MyDocumentStore() override;
+
virtual Document::UP read(DocumentIdT lid,
const DocumentTypeRepo &r) const override {
if (lid == 0) {
return Document::UP();
}
+ if (_testDoc) {
+ return std::move(_testDoc);
+ }
const DocumentType *doc_type = r.getDocumentType(doc_type_name);
Document::UP doc(new Document(*doc_type, doc_id));
ASSERT_TRUE(doc.get());
@@ -145,6 +158,8 @@ struct MyDocumentStore : proton::test::DummyDocumentStore {
}
};
+MyDocumentStore::~MyDocumentStore() = default;
+
document::DocumenttypesConfig getRepoConfig() {
const int32_t doc_type_id = 787121340;
@@ -317,6 +332,14 @@ struct Fixture {
dyn_wset_field_n, DataType::FLOAT, ct);
_retriever = std::make_unique<DocumentRetriever>(_dtName, repo, schema, meta_store, attr_manager, doc_store);
}
+
+ void clearAttributes(std::vector<vespalib::string> names) {
+ for (const auto &name : names) {
+ auto guard = *attr_manager.getAttribute(name);
+ guard->clearDoc(lid);
+ guard->commit();
+ }
+ }
};
TEST_F("require that document retriever can retrieve document meta data",
@@ -451,6 +474,21 @@ TEST_F("require that predicate attributes can be retrieved", Fixture) {
ASSERT_TRUE(predicate_value);
}
+TEST_F("require that zero values in multivalue attribute removes fields", Fixture)
+{
+ auto meta_data = f._retriever->getDocumentMetaData(doc_id);
+ auto doc = f._retriever->getDocument(meta_data.lid);
+ ASSERT_TRUE(doc);
+ const Document *docPtr = doc.get();
+ ASSERT_TRUE(doc->hasValue(dyn_arr_field_i));
+ ASSERT_TRUE(doc->hasValue(dyn_wset_field_i));
+ f.doc_store._testDoc = std::move(doc);
+ f.clearAttributes({ dyn_arr_field_i, dyn_wset_field_i });
+ doc = f._retriever->getDocument(meta_data.lid);
+ EXPECT_EQUAL(docPtr, doc.get());
+ ASSERT_FALSE(doc->hasValue(dyn_arr_field_i));
+ ASSERT_FALSE(doc->hasValue(dyn_wset_field_i));
+}
} // namespace