diff options
author | Arne Juul <arnej@yahooinc.com> | 2024-01-19 10:11:05 +0000 |
---|---|---|
committer | Arne Juul <arnej@yahooinc.com> | 2024-01-19 10:11:05 +0000 |
commit | a95035ecb51735fc4eca8f4258602cb8d7e1e984 (patch) | |
tree | ceaa32f18afc404fe5ab40bf5cdd7a7e43e90934 | |
parent | d5c66a3900e0c6555e18dc2ac4f2d8501bb7595d (diff) |
write vsmfields.cfg and add smoke test
-rw-r--r-- | searchcore/src/tests/proton/verify_ranksetup/verify_ranksetup_test.cpp | 54 |
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()) { |