summaryrefslogtreecommitdiffstats
path: root/searchlib/src/tests
diff options
context:
space:
mode:
Diffstat (limited to 'searchlib/src/tests')
-rw-r--r--searchlib/src/tests/attribute/bitvector/bitvector_test.cpp25
-rw-r--r--searchlib/src/tests/attribute/searchable/attribute_searchable_adapter_test.cpp40
-rw-r--r--searchlib/src/tests/attribute/searchable/attribute_weighted_set_blueprint_test.cpp66
-rw-r--r--searchlib/src/tests/query/customtypevisitor_test.cpp73
-rw-r--r--searchlib/src/tests/query/query_visitor_test.cpp31
-rw-r--r--searchlib/src/tests/query/querybuilder_test.cpp132
-rw-r--r--searchlib/src/tests/queryeval/dot_product/dot_product_test.cpp4
-rw-r--r--searchlib/src/tests/queryeval/fake_searchable/fake_searchable_test.cpp6
-rw-r--r--searchlib/src/tests/queryeval/getnodeweight/getnodeweight_test.cpp6
-rw-r--r--searchlib/src/tests/queryeval/parallel_weak_and/parallel_weak_and_test.cpp5
-rw-r--r--searchlib/src/tests/queryeval/weighted_set_term/weighted_set_term_test.cpp4
11 files changed, 205 insertions, 187 deletions
diff --git a/searchlib/src/tests/attribute/bitvector/bitvector_test.cpp b/searchlib/src/tests/attribute/bitvector/bitvector_test.cpp
index 3bf16aa3e7e..d965f555b79 100644
--- a/searchlib/src/tests/attribute/bitvector/bitvector_test.cpp
+++ b/searchlib/src/tests/attribute/bitvector/bitvector_test.cpp
@@ -474,20 +474,16 @@ BitVectorTest::test(BasicType bt,
bool filter)
{
Config cfg(bt, ct);
- AttributePtr v = make(cfg, pref, fastSearch,
- enableBitVectors, enableOnlyBitVector, filter);
+ AttributePtr v = make(cfg, pref, fastSearch, enableBitVectors, enableOnlyBitVector, filter);
addDocs(v, 1024);
VectorType &tv = as<VectorType>(v);
populate(tv, 2, 1023, true);
SearchContextPtr sc = getSearch<VectorType>(tv, true);
- checkSearch(v, std::move(sc), 2, 1022, 205, !enableBitVectors && !filter,
- true);
+ checkSearch(v, std::move(sc), 2, 1022, 205, !enableBitVectors && !filter, true);
sc = getSearch<VectorType>(tv, false);
- checkSearch(v, std::move(sc), 2, 1022, 205, !enableOnlyBitVector &&
- !filter, true);
- const search::IDocumentWeightAttribute *dwa =
- v->asDocumentWeightAttribute();
+ checkSearch(v, std::move(sc), 2, 1022, 205, !enableOnlyBitVector && !filter, true);
+ const search::IDocumentWeightAttribute *dwa = v->asDocumentWeightAttribute();
if (dwa != nullptr) {
search::IDocumentWeightAttribute::LookupResult lres =
dwa->lookup(getSearchStr<VectorType>(), dwa->get_dictionary_snapshot());
@@ -504,21 +500,16 @@ BitVectorTest::test(BasicType bt,
}
populate(tv, 2, 973, false);
sc = getSearch<VectorType>(tv, true);
- checkSearch(v, std::move(sc), 977, 1022, 10, !enableOnlyBitVector &&
- !filter, true);
+ checkSearch(v, std::move(sc), 977, 1022, 10, !enableOnlyBitVector &&!filter, true);
populate(tv, 2, 973, true);
sc = getSearch<VectorType>(tv, true);
- checkSearch(v, std::move(sc), 2, 1022, 205, !enableBitVectors && !filter,
- true);
+ checkSearch(v, std::move(sc), 2, 1022, 205, !enableBitVectors && !filter, true);
addDocs(v, 15000);
sc = getSearch<VectorType>(tv, true);
- checkSearch(v, std::move(sc), 2, 1022, 205, !enableOnlyBitVector &&
- !filter, true);
+ checkSearch(v, std::move(sc), 2, 1022, 205, !enableOnlyBitVector && !filter, true);
populateAll(tv, 10, 15000, true);
sc = getSearch<VectorType>(tv, true);
- checkSearch(v, std::move(sc), 2, 14999, 14992,
- !enableBitVectors && !filter,
- false);
+ checkSearch(v, std::move(sc), 2, 14999, 14992, !enableBitVectors && !filter, false);
}
diff --git a/searchlib/src/tests/attribute/searchable/attribute_searchable_adapter_test.cpp b/searchlib/src/tests/attribute/searchable/attribute_searchable_adapter_test.cpp
index 04b16a73029..29ef4e9e6ef 100644
--- a/searchlib/src/tests/attribute/searchable/attribute_searchable_adapter_test.cpp
+++ b/searchlib/src/tests/attribute/searchable/attribute_searchable_adapter_test.cpp
@@ -425,11 +425,11 @@ TEST("require that attribute dot product works") {
bool fast_search = ((i & 0x1) != 0);
bool strict = ((i & 0x2) != 0);
MyAttributeManager attribute_manager = make_weighted_string_attribute_manager(fast_search);
- SimpleDotProduct node(field, 0, Weight(1));
- node.append(Node::UP(new SimpleStringTerm("foo", "", 0, Weight(1))));
- node.append(Node::UP(new SimpleStringTerm("bar", "", 0, Weight(1))));
- node.append(Node::UP(new SimpleStringTerm("baz", "", 0, Weight(1))));
- node.append(Node::UP(new SimpleStringTerm("fox", "", 0, Weight(1))));
+ SimpleDotProduct node(4, field, 0, Weight(1));
+ node.addTerm("foo", Weight(1));
+ node.addTerm("bar", Weight(1));
+ node.addTerm("baz", Weight(1));
+ node.addTerm("fox", Weight(1));
Result result = do_search(attribute_manager, node, strict);
ASSERT_EQUAL(5u, result.hits.size());
if (fast_search) {
@@ -457,11 +457,11 @@ TEST("require that attribute dot product can produce no hits") {
bool fast_search = ((i & 0x1) != 0);
bool strict = ((i & 0x2) != 0);
MyAttributeManager attribute_manager = make_weighted_string_attribute_manager(fast_search);
- SimpleDotProduct node(field, 0, Weight(1));
- node.append(Node::UP(new SimpleStringTerm("notfoo", "", 0, Weight(1))));
- node.append(Node::UP(new SimpleStringTerm("notbar", "", 0, Weight(1))));
- node.append(Node::UP(new SimpleStringTerm("notbaz", "", 0, Weight(1))));
- node.append(Node::UP(new SimpleStringTerm("notfox", "", 0, Weight(1))));
+ SimpleDotProduct node(4, field, 0, Weight(1));
+ node.addTerm("notfoo", Weight(1));
+ node.addTerm("notbar", Weight(1));
+ node.addTerm("notbaz", Weight(1));
+ node.addTerm("notfox", Weight(1));
Result result = do_search(attribute_manager, node, strict);
ASSERT_EQUAL(0u, result.hits.size());
EXPECT_EQUAL(0u, result.est_hits);
@@ -525,11 +525,11 @@ TEST("require that attribute parallel wand works") {
bool fast_search = ((i & 0x1) != 0);
bool strict = ((i & 0x2) != 0);
MyAttributeManager attribute_manager = make_weighted_string_attribute_manager(fast_search);
- SimpleWandTerm node(field, 0, Weight(1), 10, 500, 1.5);
- node.append(Node::UP(new SimpleStringTerm("foo", "", 0, Weight(1))));
- node.append(Node::UP(new SimpleStringTerm("bar", "", 0, Weight(1))));
- node.append(Node::UP(new SimpleStringTerm("baz", "", 0, Weight(1))));
- node.append(Node::UP(new SimpleStringTerm("fox", "", 0, Weight(1))));
+ SimpleWandTerm node(4, field, 0, Weight(1), 10, 500, 1.5);
+ node.addTerm("foo", Weight(1));
+ node.addTerm("bar", Weight(1));
+ node.addTerm("baz", Weight(1));
+ node.addTerm("fox", Weight(1));
Result result = do_search(attribute_manager, node, strict);
EXPECT_FALSE(result.est_empty);
if (fast_search) {
@@ -561,11 +561,11 @@ TEST("require that attribute weighted set term works") {
bool fast_search = ((i & 0x1) != 0);
bool strict = ((i & 0x2) != 0);
MyAttributeManager attribute_manager = make_weighted_string_attribute_manager(fast_search);
- SimpleWeightedSetTerm node(field, 0, Weight(1));
- node.append(Node::UP(new SimpleStringTerm("foo", "", 0, Weight(10))));
- node.append(Node::UP(new SimpleStringTerm("bar", "", 0, Weight(20))));
- node.append(Node::UP(new SimpleStringTerm("baz", "", 0, Weight(30))));
- node.append(Node::UP(new SimpleStringTerm("fox", "", 0, Weight(40))));
+ SimpleWeightedSetTerm node(4, field, 0, Weight(1));
+ node.addTerm("foo", Weight(10));
+ node.addTerm("bar", Weight(20));
+ node.addTerm("baz", Weight(30));
+ node.addTerm("fox", Weight(40));
Result result = do_search(attribute_manager, node, strict);
EXPECT_FALSE(result.est_empty);
ASSERT_EQUAL(5u, result.hits.size());
diff --git a/searchlib/src/tests/attribute/searchable/attribute_weighted_set_blueprint_test.cpp b/searchlib/src/tests/attribute/searchable/attribute_weighted_set_blueprint_test.cpp
index fe5014b6607..328cdcf663f 100644
--- a/searchlib/src/tests/attribute/searchable/attribute_weighted_set_blueprint_test.cpp
+++ b/searchlib/src/tests/attribute/searchable/attribute_weighted_set_blueprint_test.cpp
@@ -89,9 +89,9 @@ struct WS {
}
Node::UP createNode() const {
- SimpleWeightedSetTerm *node = new SimpleWeightedSetTerm("view", 0, Weight(0));
+ SimpleWeightedSetTerm *node = new SimpleWeightedSetTerm(tokens.size(), "view", 0, Weight(0));
for (size_t i = 0; i < tokens.size(); ++i) {
- node->append(Node::UP(new SimpleStringTerm(tokens[i].first, "view", 0, Weight(tokens[i].second))));
+ node->addTerm(tokens[i].first, Weight(tokens[i].second));
}
return Node::UP(node);
}
@@ -138,42 +138,30 @@ struct WS {
} // namespace <unnamed>
-class Test : public vespalib::TestApp
-{
-public:
- int Main() override;
-};
-
-int
-Test::Main()
-{
- TEST_INIT("attribute_weighted_set_test");
- {
- MockAttributeManager manager;
- setupAttributeManager(manager);
- AttributeBlueprintFactory adapter;
-
- FakeResult expect = FakeResult()
- .doc(3).elem(0).weight(30).pos(0)
- .doc(5).elem(0).weight(50).pos(0)
- .doc(7).elem(0).weight(70).pos(0);
- WS ws = WS(manager).add("7", 70).add("5", 50).add("3", 30);
-
- EXPECT_TRUE(ws.isGenericSearch(adapter, "integer", true));
- EXPECT_TRUE(!ws.isGenericSearch(adapter, "integer", false));
- EXPECT_TRUE(ws.isGenericSearch(adapter, "string", true));
- EXPECT_TRUE(!ws.isGenericSearch(adapter, "string", false));
- EXPECT_TRUE(ws.isGenericSearch(adapter, "multi", true));
- EXPECT_TRUE(ws.isGenericSearch(adapter, "multi", false));
-
- EXPECT_EQUAL(expect, ws.search(adapter, "integer", true));
- EXPECT_EQUAL(expect, ws.search(adapter, "integer", false));
- EXPECT_EQUAL(expect, ws.search(adapter, "string", true));
- EXPECT_EQUAL(expect, ws.search(adapter, "string", false));
- EXPECT_EQUAL(expect, ws.search(adapter, "multi", true));
- EXPECT_EQUAL(expect, ws.search(adapter, "multi", false));
- }
- TEST_DONE();
+TEST("attribute_weighted_set_test") {
+ MockAttributeManager manager;
+ setupAttributeManager(manager);
+ AttributeBlueprintFactory adapter;
+
+ FakeResult expect = FakeResult()
+ .doc(3).elem(0).weight(30).pos(0)
+ .doc(5).elem(0).weight(50).pos(0)
+ .doc(7).elem(0).weight(70).pos(0);
+ WS ws = WS(manager).add("7", 70).add("5", 50).add("3", 30);
+
+ EXPECT_TRUE(ws.isGenericSearch(adapter, "integer", true));
+ EXPECT_TRUE(!ws.isGenericSearch(adapter, "integer", false));
+ EXPECT_TRUE(ws.isGenericSearch(adapter, "string", true));
+ EXPECT_TRUE(!ws.isGenericSearch(adapter, "string", false));
+ EXPECT_TRUE(ws.isGenericSearch(adapter, "multi", true));
+ EXPECT_TRUE(ws.isGenericSearch(adapter, "multi", false));
+
+ EXPECT_EQUAL(expect, ws.search(adapter, "integer", true));
+ EXPECT_EQUAL(expect, ws.search(adapter, "integer", false));
+ EXPECT_EQUAL(expect, ws.search(adapter, "string", true));
+ EXPECT_EQUAL(expect, ws.search(adapter, "string", false));
+ EXPECT_EQUAL(expect, ws.search(adapter, "multi", true));
+ EXPECT_EQUAL(expect, ws.search(adapter, "multi", false));
}
-TEST_APPHOOK(Test);
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/searchlib/src/tests/query/customtypevisitor_test.cpp b/searchlib/src/tests/query/customtypevisitor_test.cpp
index 3f7d57b7aa4..d0812a00ebf 100644
--- a/searchlib/src/tests/query/customtypevisitor_test.cpp
+++ b/searchlib/src/tests/query/customtypevisitor_test.cpp
@@ -15,18 +15,6 @@ using namespace search::query;
namespace {
-class Test : public vespalib::TestApp {
- const char *current_state;
- virtual void DumpState(bool) {
- fprintf(stderr, "%s: ERROR: in %s\n", GetName(), current_state);
- }
-
- template <class T> void requireThatNodeIsVisited();
-
-public:
- int Main() override;
-};
-
template <class Base>
struct InitTerm : Base {
InitTerm() : Base(typename Base::Type(), "view", 0, Weight(0)) {}
@@ -49,9 +37,9 @@ struct MyStringTerm : InitTerm<StringTerm> {};
struct MySubstrTerm : InitTerm<SubstringTerm> {};
struct MySuffixTerm : InitTerm<SuffixTerm> {};
struct MyWeakAnd : WeakAnd { MyWeakAnd() : WeakAnd(1234, "view") {} };
-struct MyWeightedSetTerm : WeightedSetTerm { MyWeightedSetTerm() : WeightedSetTerm("view", 0, Weight(42)) {} };
-struct MyDotProduct : DotProduct { MyDotProduct() : DotProduct("view", 0, Weight(42)) {} };
-struct MyWandTerm : WandTerm { MyWandTerm() : WandTerm("view", 0, Weight(42), 57, 67, 77.7) {} };
+struct MyWeightedSetTerm : WeightedSetTerm { MyWeightedSetTerm() : WeightedSetTerm(0, "view", 0, Weight(42)) {} };
+struct MyDotProduct : DotProduct { MyDotProduct() : DotProduct(0, "view", 0, Weight(42)) {} };
+struct MyWandTerm : WandTerm { MyWandTerm() : WandTerm(0, "view", 0, Weight(42), 57, 67, 77.7) {} };
struct MyPredicateQuery : InitTerm<PredicateQuery> {};
struct MyRegExpTerm : InitTerm<RegExpTerm> {};
struct MyNearestNeighborTerm : NearestNeighborTerm {};
@@ -119,7 +107,7 @@ public:
};
template <class T>
-void Test::requireThatNodeIsVisited() {
+void requireThatNodeIsVisited() {
MyCustomVisitor visitor;
Node::UP query(new T);
visitor.isVisited<T>() = false;
@@ -127,37 +115,28 @@ void Test::requireThatNodeIsVisited() {
ASSERT_TRUE(visitor.isVisited<T>());
}
-#define TEST_CALL(func) \
- current_state = #func; \
- func();
-
-int
-Test::Main()
-{
- TEST_INIT("customtypevisitor_test");
-
- TEST_CALL(requireThatNodeIsVisited<MyAnd>);
- TEST_CALL(requireThatNodeIsVisited<MyAndNot>);
- TEST_CALL(requireThatNodeIsVisited<MyNear>);
- TEST_CALL(requireThatNodeIsVisited<MyONear>);
- TEST_CALL(requireThatNodeIsVisited<MyOr>);
- TEST_CALL(requireThatNodeIsVisited<MyPhrase>);
- TEST_CALL(requireThatNodeIsVisited<MySameElement>);
- TEST_CALL(requireThatNodeIsVisited<MyRangeTerm>);
- TEST_CALL(requireThatNodeIsVisited<MyRank>);
- TEST_CALL(requireThatNodeIsVisited<MyNumberTerm>);
- TEST_CALL(requireThatNodeIsVisited<MyPrefixTerm>);
- TEST_CALL(requireThatNodeIsVisited<MyStringTerm>);
- TEST_CALL(requireThatNodeIsVisited<MySubstrTerm>);
- TEST_CALL(requireThatNodeIsVisited<MySuffixTerm>);
- TEST_CALL(requireThatNodeIsVisited<MyWeightedSetTerm>);
- TEST_CALL(requireThatNodeIsVisited<MyDotProduct>);
- TEST_CALL(requireThatNodeIsVisited<MyWandTerm>);
- TEST_CALL(requireThatNodeIsVisited<MyPredicateQuery>);
- TEST_CALL(requireThatNodeIsVisited<MyRegExpTerm>);
-
- TEST_DONE();
+TEST("customtypevisitor_test") {
+
+ requireThatNodeIsVisited<MyAnd>();
+ requireThatNodeIsVisited<MyAndNot>();
+ requireThatNodeIsVisited<MyNear>();
+ requireThatNodeIsVisited<MyONear>();
+ requireThatNodeIsVisited<MyOr>();
+ requireThatNodeIsVisited<MyPhrase>();
+ requireThatNodeIsVisited<MySameElement>();
+ requireThatNodeIsVisited<MyRangeTerm>();
+ requireThatNodeIsVisited<MyRank>();
+ requireThatNodeIsVisited<MyNumberTerm>();
+ requireThatNodeIsVisited<MyPrefixTerm>();
+ requireThatNodeIsVisited<MyStringTerm>();
+ requireThatNodeIsVisited<MySubstrTerm>();
+ requireThatNodeIsVisited<MySuffixTerm>();
+ requireThatNodeIsVisited<MyWeightedSetTerm>();
+ requireThatNodeIsVisited<MyDotProduct>();
+ requireThatNodeIsVisited<MyWandTerm>();
+ requireThatNodeIsVisited<MyPredicateQuery>();
+ requireThatNodeIsVisited<MyRegExpTerm>();
}
} // namespace
-TEST_APPHOOK(Test);
+TEST_MAIN() { TEST_RUN_ALL(); } \ No newline at end of file
diff --git a/searchlib/src/tests/query/query_visitor_test.cpp b/searchlib/src/tests/query/query_visitor_test.cpp
index 946ad17352d..ef255ad6878 100644
--- a/searchlib/src/tests/query/query_visitor_test.cpp
+++ b/searchlib/src/tests/query/query_visitor_test.cpp
@@ -15,25 +15,6 @@ using namespace search::query;
namespace {
-class Test : public vespalib::TestApp {
- void requireThatAllNodesCanBeVisited();
-
- template <class T> void checkVisit(T *node);
-
-public:
- int Main() override;
-};
-
-int
-Test::Main()
-{
- TEST_INIT("query_visitor_test");
-
- TEST_DO(requireThatAllNodesCanBeVisited());
-
- TEST_DONE();
-}
-
class MyVisitor : public QueryVisitor
{
public:
@@ -69,7 +50,7 @@ public:
};
template <class T>
-void Test::checkVisit(T *node) {
+void checkVisit(T *node) {
Node::UP query(node);
MyVisitor visitor;
visitor.isVisited<T>() = false;
@@ -77,7 +58,7 @@ void Test::checkVisit(T *node) {
ASSERT_TRUE(visitor.isVisited<T>());
}
-void Test::requireThatAllNodesCanBeVisited() {
+TEST("requireThatAllNodesCanBeVisited") {
checkVisit<And>(new SimpleAnd);
checkVisit<AndNot>(new SimpleAndNot);
checkVisit<Near>(new SimpleNear(0));
@@ -85,9 +66,9 @@ void Test::requireThatAllNodesCanBeVisited() {
checkVisit<Or>(new SimpleOr);
checkVisit<Phrase>(new SimplePhrase("field", 0, Weight(42)));
checkVisit<SameElement>(new SimpleSameElement("field"));
- checkVisit<WeightedSetTerm>(new SimpleWeightedSetTerm("field", 0, Weight(42)));
- checkVisit<DotProduct>(new SimpleDotProduct("field", 0, Weight(42)));
- checkVisit<WandTerm>(new SimpleWandTerm("field", 0, Weight(42), 57, 67, 77.7));
+ checkVisit<WeightedSetTerm>(new SimpleWeightedSetTerm(0, "field", 0, Weight(42)));
+ checkVisit<DotProduct>(new SimpleDotProduct(0, "field", 0, Weight(42)));
+ checkVisit<WandTerm>(new SimpleWandTerm(0, "field", 0, Weight(42), 57, 67, 77.7));
checkVisit<Rank>(new SimpleRank);
checkVisit<NumberTerm>(new SimpleNumberTerm("0.42", "field", 0, Weight(0)));
const Location location(Point{10, 10}, 20, 0);
@@ -104,4 +85,4 @@ void Test::requireThatAllNodesCanBeVisited() {
} // namespace
-TEST_APPHOOK(Test);
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/searchlib/src/tests/query/querybuilder_test.cpp b/searchlib/src/tests/query/querybuilder_test.cpp
index 055d245e420..47dccc76603 100644
--- a/searchlib/src/tests/query/querybuilder_test.cpp
+++ b/searchlib/src/tests/query/querybuilder_test.cpp
@@ -90,18 +90,17 @@ Node::UP createQueryTree() {
builder.addStringTerm(str[4], view[4], id[4], weight[4]);
builder.addStringTerm(str[5], view[5], id[5], weight[5]);
}
- builder.addPredicateQuery(getPredicateQueryTerm(),
- view[3], id[3], weight[3]);
- builder.addDotProduct(3, view[2], id[2], weight[2]);
+ builder.addPredicateQuery(getPredicateQueryTerm(), view[3], id[3], weight[3]);
{
- builder.addStringTerm(str[3], view[3], id[3], weight[3]);
- builder.addStringTerm(str[4], view[4], id[4], weight[4]);
- builder.addStringTerm(str[5], view[5], id[5], weight[5]);
+ auto & n = builder.addDotProduct(3, view[2], id[2], weight[2]);
+ n.addTerm(str[3], weight[3]);
+ n.addTerm(str[4], weight[4]);
+ n.addTerm(str[5], weight[5]);
}
- builder.addWandTerm(2, view[0], id[0], weight[0], 57, 67, 77.7);
{
- builder.addStringTerm(str[1], view[1], id[1], weight[1]);
- builder.addStringTerm(str[2], view[2], id[2], weight[2]);
+ auto & n = builder.addWandTerm(2, view[0], id[0], weight[0], 57, 67, 77.7);
+ n.addTerm(str[1], weight[1]);
+ n.addTerm(str[2], weight[2]);
}
builder.addRegExpTerm(str[5], view[5], id[5], weight[5]);
builder.addSameElement(3, view[4]);
@@ -246,23 +245,33 @@ void checkQueryTreeTypes(Node *node) {
EXPECT_TRUE(checkTerm(predicateQuery, getPredicateQueryTerm(), view[3], id[3], weight[3]));
auto* dotProduct = as_node<DotProduct>(and_node->getChildren()[6]);
- EXPECT_EQUAL(3u, dotProduct->getChildren().size());
- string_term = as_node<StringTerm>(dotProduct->getChildren()[0]);
- EXPECT_TRUE(checkTerm(string_term, str[3], view[3], id[3], weight[3]));
- string_term = as_node<StringTerm>(dotProduct->getChildren()[1]);
- EXPECT_TRUE(checkTerm(string_term, str[4], view[4], id[4], weight[4]));
- string_term = as_node<StringTerm>(dotProduct->getChildren()[2]);
- EXPECT_TRUE(checkTerm(string_term, str[5], view[5], id[5], weight[5]));
+ EXPECT_EQUAL(3u, dotProduct->getNumTerms());
+
+ {
+ const auto &w1 = dotProduct->getAsString(0);
+ EXPECT_EQUAL(w1.first, str[3]);
+ EXPECT_TRUE(w1.second == weight[3]);
+ const auto &w2 = dotProduct->getAsString(1);
+ EXPECT_EQUAL(w2.first, str[4]);
+ EXPECT_TRUE(w2.second == weight[4]);
+ const auto &w3 = dotProduct->getAsString(2);
+ EXPECT_EQUAL(w3.first, str[5]);
+ EXPECT_TRUE(w3.second == weight[5]);
+ }
auto* wandTerm = as_node<WandTerm>(and_node->getChildren()[7]);
EXPECT_EQUAL(57u, wandTerm->getTargetNumHits());
EXPECT_EQUAL(67, wandTerm->getScoreThreshold());
EXPECT_EQUAL(77.7, wandTerm->getThresholdBoostFactor());
- EXPECT_EQUAL(2u, wandTerm->getChildren().size());
- string_term = as_node<StringTerm>(wandTerm->getChildren()[0]);
- EXPECT_TRUE(checkTerm(string_term, str[1], view[1], id[1], weight[1]));
- string_term = as_node<StringTerm>(wandTerm->getChildren()[1]);
- EXPECT_TRUE(checkTerm(string_term, str[2], view[2], id[2], weight[2]));
+ EXPECT_EQUAL(2u, wandTerm->getNumTerms());
+ {
+ const auto &w1 = wandTerm->getAsString(0);
+ EXPECT_EQUAL(w1.first, str[1]);
+ EXPECT_TRUE(w1.second == weight[1]);
+ const auto &w2 = wandTerm->getAsString(1);
+ EXPECT_EQUAL(w2.first, str[2]);
+ EXPECT_TRUE(w2.second == weight[2]);
+ }
auto* regexp_term = as_node<RegExpTerm>(and_node->getChildren()[8]);
EXPECT_TRUE(checkTerm(regexp_term, str[5], view[5], id[5], weight[5]));
@@ -336,15 +345,15 @@ struct MyPhrase : Phrase { MyPhrase(const string &f, int32_t i, Weight w) : Phra
struct MySameElement : SameElement { MySameElement(const string &f) : SameElement(f) {}};
struct MyWeightedSetTerm : WeightedSetTerm {
- MyWeightedSetTerm(const string &f, int32_t i, Weight w) : WeightedSetTerm(f, i, w) {}
+ MyWeightedSetTerm(uint32_t n, const string &f, int32_t i, Weight w) : WeightedSetTerm(n, f, i, w) {}
};
struct MyDotProduct : DotProduct {
- MyDotProduct(const string &f, int32_t i, Weight w) : DotProduct(f, i, w) {}
+ MyDotProduct(uint32_t n, const string &f, int32_t i, Weight w) : DotProduct(n, f, i, w) {}
};
struct MyWandTerm : WandTerm {
- MyWandTerm(const string &f, int32_t i, Weight w, uint32_t targetNumHits,
+ MyWandTerm(uint32_t n, const string &f, int32_t i, Weight w, uint32_t targetNumHits,
int64_t scoreThreshold, double thresholdBoostFactor)
- : WandTerm(f, i, w, targetNumHits, scoreThreshold, thresholdBoostFactor) {}
+ : WandTerm(n, f, i, w, targetNumHits, scoreThreshold, thresholdBoostFactor) {}
};
struct MyRank : Rank {};
struct MyNumberTerm : NumberTerm {
@@ -593,7 +602,7 @@ TEST("require that empty intermediate node can be added") {
}
TEST("control size of SimpleQueryStackDumpIterator") {
- EXPECT_EQUAL(144u, sizeof(SimpleQueryStackDumpIterator));
+ EXPECT_EQUAL(128u, sizeof(SimpleQueryStackDumpIterator));
}
TEST("test query parsing error") {
@@ -633,6 +642,77 @@ TEST("test query parsing error") {
EXPECT_FALSE(new_node);
}
+class SimpleMultiTerm : public MultiTerm {
+public:
+ SimpleMultiTerm(size_t numTerms) : MultiTerm(numTerms) {}
+ void accept(QueryVisitor & ) override { }
+};
+
+TEST("initial state of MultiTerm") {
+ SimpleMultiTerm mt(7);
+ EXPECT_EQUAL(7u, mt.getNumTerms());
+ EXPECT_TRUE(MultiTerm::Type::UNKNOWN == mt.getType());
+}
+
+void
+verify_multiterm_get(const MultiTerm & mt) {
+ EXPECT_EQUAL(7u, mt.getNumTerms());
+ for (int64_t i(0); i < mt.getNumTerms(); i++) {
+ auto v = mt.getAsInteger(i);
+ EXPECT_EQUAL(v.first, i-3);
+ EXPECT_EQUAL(v.second.percent(), i-4);
+ }
+ for (int64_t i(0); i < mt.getNumTerms(); i++) {
+ auto v = mt.getAsString(i);
+ char buf[24];
+ auto res = std::to_chars(buf, buf + sizeof(buf), i-3);
+ EXPECT_EQUAL(v.first, vespalib::stringref(buf, res.ptr - buf));
+ EXPECT_EQUAL(v.second.percent(), i-4);
+ }
+}
+
+TEST("add and get of integer MultiTerm") {
+ SimpleMultiTerm mt(7);
+ for (int64_t i(0); i < mt.getNumTerms(); i++) {
+ mt.addTerm(i-3, Weight(i-4));
+ }
+ EXPECT_TRUE(MultiTerm::Type::INTEGER == mt.getType());
+ verify_multiterm_get(mt);
+}
+
+TEST("add and get of string MultiTerm") {
+ SimpleMultiTerm mt(7);
+ for (int64_t i(0); i < mt.getNumTerms(); i++) {
+ char buf[24];
+ auto res = std::to_chars(buf, buf + sizeof(buf), i-3);
+ mt.addTerm(vespalib::stringref(buf, res.ptr - buf), Weight(i-4));
+ }
+ EXPECT_TRUE(MultiTerm::Type::STRING == mt.getType());
+ verify_multiterm_get(mt);
+}
+
+TEST("first string then integer MultiTerm") {
+ SimpleMultiTerm mt(7);
+ mt.addTerm("-3", Weight(-4));
+ for (int64_t i(1); i < mt.getNumTerms(); i++) {
+ mt.addTerm(i-3, Weight(i-4));
+ }
+ EXPECT_TRUE(MultiTerm::Type::STRING == mt.getType());
+ verify_multiterm_get(mt);
+}
+
+TEST("first integer then string MultiTerm") {
+ SimpleMultiTerm mt(7);
+ mt.addTerm(-3, Weight(-4));
+ for (int64_t i(1); i < mt.getNumTerms(); i++) {
+ char buf[24];
+ auto res = std::to_chars(buf, buf + sizeof(buf), i-3);
+ mt.addTerm(vespalib::stringref(buf, res.ptr - buf), Weight(i-4));
+ }
+ EXPECT_TRUE(MultiTerm::Type::INTEGER == mt.getType());
+ verify_multiterm_get(mt);
+}
+
} // namespace
TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/searchlib/src/tests/queryeval/dot_product/dot_product_test.cpp b/searchlib/src/tests/queryeval/dot_product/dot_product_test.cpp
index 7414e8b10f2..a05dcc4c6ea 100644
--- a/searchlib/src/tests/queryeval/dot_product/dot_product_test.cpp
+++ b/searchlib/src/tests/queryeval/dot_product/dot_product_test.cpp
@@ -45,9 +45,9 @@ struct DP {
}
Node::UP createNode() const {
- SimpleDotProduct *node = new SimpleDotProduct("view", 0, Weight(0));
+ SimpleDotProduct *node = new SimpleDotProduct(tokens.size(), "view", 0, Weight(0));
for (size_t i = 0; i < tokens.size(); ++i) {
- node->append(Node::UP(new SimpleStringTerm(tokens[i].first, "view", 0, Weight(tokens[i].second))));
+ node->addTerm(tokens[i].first, Weight(tokens[i].second));
}
return Node::UP(node);
}
diff --git a/searchlib/src/tests/queryeval/fake_searchable/fake_searchable_test.cpp b/searchlib/src/tests/queryeval/fake_searchable/fake_searchable_test.cpp
index cbad6de25bb..167fc706f4d 100644
--- a/searchlib/src/tests/queryeval/fake_searchable/fake_searchable_test.cpp
+++ b/searchlib/src/tests/queryeval/fake_searchable/fake_searchable_test.cpp
@@ -156,9 +156,9 @@ TEST_F(FakeSearchableTest, require_that_weigheted_set_search_works) {
source.addResult("fieldfoo", "friend3",
FakeResult().doc(5));
- SimpleWeightedSetTerm weightedSet("fieldfoo", 1, w);
- weightedSet.append(Node::UP(new SimpleStringTerm("friend1", "fieldfoo", 2, Weight(1))));
- weightedSet.append(Node::UP(new SimpleStringTerm("friend2", "fieldfoo", 3, Weight(2))));
+ SimpleWeightedSetTerm weightedSet(2, "fieldfoo", 1, w);
+ weightedSet.addTerm("friend1", Weight(1));
+ weightedSet.addTerm("friend2", Weight(2));
FieldSpecList fields;
fields.add(FieldSpec("fieldfoo", 1, 1));
diff --git a/searchlib/src/tests/queryeval/getnodeweight/getnodeweight_test.cpp b/searchlib/src/tests/queryeval/getnodeweight/getnodeweight_test.cpp
index 359a7f9c074..24253469dfc 100644
--- a/searchlib/src/tests/queryeval/getnodeweight/getnodeweight_test.cpp
+++ b/searchlib/src/tests/queryeval/getnodeweight/getnodeweight_test.cpp
@@ -34,9 +34,9 @@ TEST("test variations of getWeight")
EXPECT_EQUAL(42, getWeight(SimpleStringTerm("foo", "bar", 1, Weight(42))));
EXPECT_EQUAL(42, getWeight(SimpleSubstringTerm("foo", "bar", 1, Weight(42))));
EXPECT_EQUAL(42, getWeight(SimpleSuffixTerm("foo", "bar", 1, Weight(42))));
- EXPECT_EQUAL(42, getWeight(SimpleWeightedSetTerm("bar", 1, Weight(42))));
- EXPECT_EQUAL(42, getWeight(SimpleDotProduct("bar", 1, Weight(42))));
- EXPECT_EQUAL(42, getWeight(SimpleWandTerm("bar", 1, Weight(42), 57, 67, 77.7)));
+ EXPECT_EQUAL(42, getWeight(SimpleWeightedSetTerm(0, "bar", 1, Weight(42))));
+ EXPECT_EQUAL(42, getWeight(SimpleDotProduct(0, "bar", 1, Weight(42))));
+ EXPECT_EQUAL(42, getWeight(SimpleWandTerm(0, "bar", 1, Weight(42), 57, 67, 77.7)));
}
TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/searchlib/src/tests/queryeval/parallel_weak_and/parallel_weak_and_test.cpp b/searchlib/src/tests/queryeval/parallel_weak_and/parallel_weak_and_test.cpp
index f2c02d02080..b820a96fab6 100644
--- a/searchlib/src/tests/queryeval/parallel_weak_and/parallel_weak_and_test.cpp
+++ b/searchlib/src/tests/queryeval/parallel_weak_and/parallel_weak_and_test.cpp
@@ -158,11 +158,10 @@ struct WandBlueprintSpec
Node::UP createNode(uint32_t scoresToTrack = 100,
score_t scoreThreshold = 0,
double thresholdBoostFactor = 1) const {
- SimpleWandTerm *node = new SimpleWandTerm("view", 0, Weight(0),
+ SimpleWandTerm *node = new SimpleWandTerm(tokens.size(), "view", 0, Weight(0),
scoresToTrack, scoreThreshold, thresholdBoostFactor);
for (size_t i = 0; i < tokens.size(); ++i) {
- node->append(Node::UP(new SimpleStringTerm(tokens[i].first, "view", 0,
- Weight(tokens[i].second))));
+ node->addTerm(tokens[i].first, Weight(tokens[i].second));
}
return Node::UP(node);
}
diff --git a/searchlib/src/tests/queryeval/weighted_set_term/weighted_set_term_test.cpp b/searchlib/src/tests/queryeval/weighted_set_term/weighted_set_term_test.cpp
index 8514a221230..95553f68cbc 100644
--- a/searchlib/src/tests/queryeval/weighted_set_term/weighted_set_term_test.cpp
+++ b/searchlib/src/tests/queryeval/weighted_set_term/weighted_set_term_test.cpp
@@ -53,9 +53,9 @@ struct WS {
}
Node::UP createNode() const {
- SimpleWeightedSetTerm *node = new SimpleWeightedSetTerm("view", 0, Weight(0));
+ SimpleWeightedSetTerm *node = new SimpleWeightedSetTerm(tokens.size(), "view", 0, Weight(0));
for (size_t i = 0; i < tokens.size(); ++i) {
- node->append(Node::UP(new SimpleStringTerm(tokens[i].first, "view", 0, Weight(tokens[i].second))));
+ node->addTerm(tokens[i].first,Weight(tokens[i].second));
}
return Node::UP(node);
}