summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArne Juul <arnej@yahooinc.com>2024-01-19 10:11:05 +0000
committerArne Juul <arnej@yahooinc.com>2024-01-19 10:11:05 +0000
commita95035ecb51735fc4eca8f4258602cb8d7e1e984 (patch)
treeceaa32f18afc404fe5ab40bf5cdd7a7e43e90934
parentd5c66a3900e0c6555e18dc2ac4f2d8501bb7595d (diff)
write vsmfields.cfg and add smoke test
-rw-r--r--searchcore/src/tests/proton/verify_ranksetup/verify_ranksetup_test.cpp54
1 files changed, 48 insertions, 6 deletions
diff --git a/searchcore/src/tests/proton/verify_ranksetup/verify_ranksetup_test.cpp b/searchcore/src/tests/proton/verify_ranksetup/verify_ranksetup_test.cpp
index 159ae339aa9..82d96054e3d 100644
--- a/searchcore/src/tests/proton/verify_ranksetup/verify_ranksetup_test.cpp
+++ b/searchcore/src/tests/proton/verify_ranksetup/verify_ranksetup_test.cpp
@@ -8,6 +8,7 @@
#include <string>
#include <vector>
#include <map>
+#include <set>
#include <initializer_list>
const char *prog = "../../../apps/verify_ranksetup/vespa-verify-ranksetup-bin";
@@ -25,6 +26,8 @@ using search::index::schema::DataType;
using vespalib::make_string_short::fmt;
+enum class SearchMode { INDEXED, STREAMING };
+
struct Writer {
FILE *file;
explicit Writer(const std::string &file_name) {
@@ -145,6 +148,39 @@ struct Setup {
out.fmt("indexfield[%zu].collectiontype %s\n", i, pos->second.second.c_str());
}
}
+ void write_vsmfield(const Writer &out, size_t idx, std::string name, std::string dataType) {
+ out.fmt("fieldspec[%zu].name \"%s\"\n", idx, name.c_str());
+ if (dataType == "STRING") {
+ out.fmt("fieldspec[%zu].searchmethod AUTOUTF8\n", idx);
+ out.fmt("fieldspec[%zu].normalize LOWERCASE\n", idx);
+ } else {
+ out.fmt("fieldspec[%zu].searchmethod %s\n", idx, dataType.c_str());
+ }
+ }
+ void write_vsmfields(const Writer &out) {
+ std::set<std::string> allFields;
+ size_t i = 0;
+ for (const auto & field : indexes) {
+ write_vsmfield(out, i, field.first, field.second.first);
+ out.fmt("fieldspec[%zu].fieldtype INDEX\n", i);
+ i++;
+ allFields.insert(field.first);
+ }
+ for (const auto & field : attributes) {
+ if (allFields.count(field.first) != 0) continue;
+ write_vsmfield(out, i, field.first, field.second.dataType);
+ out.fmt("fieldspec[%zu].fieldtype ATTRIBUTE\n", i);
+ i++;
+ allFields.insert(field.first);
+ }
+ out.fmt("documenttype[0].name \"foobar\"\n");
+ size_t j = 0;
+ for (const auto & field : allFields) {
+ out.fmt("documenttype[0].index[%zu].name \"%s\"\n", j, field.c_str());
+ out.fmt("documenttype[0].index[%zu].field[0].name \"%s\"\n", j, field.c_str());
+ j++;
+ }
+ }
void write_rank_profiles(const Writer &out) {
out.fmt("rankprofile[%zu]\n", extra_profiles.size() + 1);
out.fmt("rankprofile[0].name \"default\"\n");
@@ -165,7 +201,7 @@ struct Setup {
for (const auto &entry: constants) {
out.fmt("constant[%zu].name \"%s\"\n", idx, entry.first.c_str());
out.fmt("constant[%zu].fileref \"12345\"\n", idx);
- out.fmt("constant[%zu].type \"%s\"\n", idx, entry.second.c_str());
+ out.fmt("constant[%zu].type \"%s\"\n", idx, entry.second.c_str());
++idx;
}
}
@@ -215,15 +251,18 @@ struct Setup {
void generate() {
write_attributes(Writer(gen_dir + "/attributes.cfg"));
write_indexschema(Writer(gen_dir + "/indexschema.cfg"));
+ write_vsmfields(Writer(gen_dir + "/vsmfields.cfg"));
write_rank_profiles(Writer(gen_dir + "/rank-profiles.cfg"));
write_ranking_constants(Writer(gen_dir + "/ranking-constants.cfg"));
write_ranking_expressions(Writer(gen_dir + "/ranking-expressions.cfg"));
write_onnx_models(Writer(gen_dir + "/onnx-models.cfg"));
write_self_cfg(Writer(gen_dir + "/verify-ranksetup.cfg"));
}
- bool verify() {
+ bool verify(SearchMode mode = SearchMode::INDEXED) {
generate();
- vespalib::Process process(fmt("%s dir:%s", prog, gen_dir.c_str()), true);
+ vespalib::Process process(fmt("%s dir:%s%s", prog, gen_dir.c_str(),
+ (mode == SearchMode::STREAMING ? " -S" : "")),
+ true);
for (auto line = process.read_line(); !line.empty(); line = process.read_line()) {
fprintf(stderr, "> %s\n", line.c_str());
}
@@ -307,15 +346,18 @@ TEST_F("setup output directory", Setup()) {
//-----------------------------------------------------------------------------
TEST_F("require that empty setup passes validation", EmptySetup()) {
- EXPECT_TRUE(f.verify());
+ EXPECT_TRUE(f.verify(SearchMode::INDEXED));
+ EXPECT_TRUE(f.verify(SearchMode::STREAMING));
}
TEST_F("require that we can verify multiple rank profiles", SimpleSetup()) {
f.first_phase(valid_feature);
f.good_profile();
- EXPECT_TRUE(f.verify());
+ EXPECT_TRUE(f.verify(SearchMode::INDEXED));
+ EXPECT_TRUE(f.verify(SearchMode::STREAMING));
f.bad_profile();
- EXPECT_TRUE(!f.verify());
+ EXPECT_TRUE(!f.verify(SearchMode::INDEXED));
+ EXPECT_TRUE(!f.verify(SearchMode::STREAMING));
}
TEST_F("require that first phase can break validation", SimpleSetup()) {