aboutsummaryrefslogtreecommitdiffstats
path: root/searchcore/src/tests/proton/attribute
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@yahooinc.com>2023-04-14 13:29:38 +0200
committerTor Egge <Tor.Egge@yahooinc.com>2023-04-14 13:29:38 +0200
commitaf5510ee4e0fefb516cf2198d684cc399f0d3cd5 (patch)
tree3ac76a56ced74d70efdc08dafef3daf8caf408ef /searchcore/src/tests/proton/attribute
parentb66f35888ad413800ac16f841582da5bf067cb7f (diff)
Set reserved doc values after attribute vector has been loaded.
Diffstat (limited to 'searchcore/src/tests/proton/attribute')
-rw-r--r--searchcore/src/tests/proton/attribute/attribute_initializer/attribute_initializer_test.cpp36
1 files changed, 35 insertions, 1 deletions
diff --git a/searchcore/src/tests/proton/attribute/attribute_initializer/attribute_initializer_test.cpp b/searchcore/src/tests/proton/attribute/attribute_initializer/attribute_initializer_test.cpp
index 52b7a7ce60a..4af23a1d7fb 100644
--- a/searchcore/src/tests/proton/attribute/attribute_initializer/attribute_initializer_test.cpp
+++ b/searchcore/src/tests/proton/attribute/attribute_initializer/attribute_initializer_test.cpp
@@ -7,8 +7,11 @@
#include <vespa/searchcore/proton/test/attribute_utils.h>
#include <vespa/searchlib/attribute/attributefactory.h>
#include <vespa/searchlib/attribute/integerbase.h>
+#include <vespa/searchlib/attribute/stringbase.h>
#include <vespa/searchlib/test/directory_handler.h>
#include <vespa/searchcommon/attribute/config.h>
+#include <vespa/searchcommon/attribute/i_multi_value_attribute.h>
+#include <vespa/vespalib/util/stash.h>
#include <vespa/vespalib/util/threadstackexecutor.h>
#include <vespa/vespalib/testkit/testapp.h>
@@ -18,8 +21,10 @@ LOG_SETUP("attribute_initializer_test");
using search::attribute::Config;
using search::attribute::BasicType;
using search::attribute::CollectionType;
+using search::attribute::IMultiValueAttribute;
using search::SerialNum;
using search::test::DirectoryHandler;
+using vespalib::Stash;
const vespalib::string test_dir = "test_output";
@@ -60,7 +65,7 @@ Config get_int32_wset_fs()
}
void
-saveAttr(const vespalib::string &name, const Config &cfg, SerialNum serialNum, SerialNum createSerialNum)
+saveAttr(const vespalib::string &name, const Config &cfg, SerialNum serialNum, SerialNum createSerialNum, bool mutate_reserved_doc = false)
{
auto diskLayout = AttributeDiskLayout::create(test_dir);
auto dir = diskLayout->createAttributeDir(name);
@@ -81,6 +86,15 @@ saveAttr(const vespalib::string &name, const Config &cfg, SerialNum serialNum, S
iav.append(docId, 10, 1);
iav.append(docId, 11, 1);
}
+ if (mutate_reserved_doc) {
+ av->clearDoc(0u);
+ if (cfg.basicType().type() == BasicType::Type::STRING &&
+ cfg.collectionType().type() == CollectionType::Type::WSET) {
+ auto &sav = dynamic_cast<search::StringAttribute &>(*av);
+ sav.append(0u, "badly", 15);
+ sav.append(0u, "broken", 20);
+ }
+ }
av->save();
writer->markValidSnapshot(serialNum);
}
@@ -250,6 +264,26 @@ TEST("require that saved attribute is ignored when serial num is not set")
EXPECT_EQUAL(1u, av->getNumDocs());
}
+TEST("require that reserved document is reinitialized during load")
+{
+ saveAttr("a", string_wset, 10, 2, true);
+ Fixture f;
+ auto av = f.createInitializer({"a", string_wset}, 5)->init().getAttribute();
+ EXPECT_EQUAL(2u, av->getCreateSerialNum());
+ EXPECT_EQUAL(2u, av->getNumDocs());
+ auto mvav = av->as_multi_value_attribute();
+ ASSERT_TRUE(mvav != nullptr);
+ Stash stash;
+ auto read_view = mvav->make_read_view(IMultiValueAttribute::WeightedSetTag<const char*>(), stash);
+ ASSERT_TRUE(read_view != nullptr);
+ auto reserved_values = read_view->get_values(0u);
+ EXPECT_EQUAL(1u, reserved_values.size());
+ if (reserved_values.size() >= 1) {
+ EXPECT_EQUAL(1, reserved_values[0].weight());
+ EXPECT_EQUAL(vespalib::string(""), vespalib::string(reserved_values[0].value()));
+ }
+}
+
}
TEST_MAIN()