summaryrefslogtreecommitdiffstats
path: root/searchlib/src/tests/query/querybuilder_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'searchlib/src/tests/query/querybuilder_test.cpp')
-rw-r--r--searchlib/src/tests/query/querybuilder_test.cpp78
1 files changed, 77 insertions, 1 deletions
diff --git a/searchlib/src/tests/query/querybuilder_test.cpp b/searchlib/src/tests/query/querybuilder_test.cpp
index 40af60d4a04..116496fbc70 100644
--- a/searchlib/src/tests/query/querybuilder_test.cpp
+++ b/searchlib/src/tests/query/querybuilder_test.cpp
@@ -456,6 +456,13 @@ struct MyFuzzyTerm : FuzzyTerm {
: FuzzyTerm(t, f, i, w, m, p) {
}
};
+struct MyInTerm : InTerm {
+ MyInTerm(std::unique_ptr<TermVector> terms, MultiTerm::Type type,
+ const string& f, int32_t i, Weight w)
+ : InTerm(std::move(terms), type, f, i, w)
+ {
+ }
+};
struct MyQueryNodeTypes {
using And = MyAnd;
@@ -484,6 +491,7 @@ struct MyQueryNodeTypes {
using TrueQueryNode = MyTrue;
using FalseQueryNode = MyFalse;
using FuzzyTerm = MyFuzzyTerm;
+ using InTerm = MyInTerm;
};
TEST("require that Custom Query Trees Can Be Built") {
@@ -673,7 +681,7 @@ TEST("require that empty intermediate node can be added") {
}
TEST("control size of SimpleQueryStackDumpIterator") {
- EXPECT_EQUAL(120u, sizeof(SimpleQueryStackDumpIterator));
+ EXPECT_EQUAL(128u, sizeof(SimpleQueryStackDumpIterator));
}
TEST("test query parsing error") {
@@ -785,6 +793,74 @@ TEST("first integer then string MultiTerm") {
verify_multiterm_get(mt);
}
+namespace {
+
+std::vector<vespalib::string> in_strings = { "this", "is", "a", "test" };
+
+std::vector<int64_t> in_integers = { 24, INT64_C(93000000000) };
+
+template <typename TermType>
+std::unique_ptr<TermVector>
+make_subterms(const std::vector<TermType>& values)
+{
+ using TermVectorType = std::conditional_t<std::is_same_v<TermType,int64_t>,IntegerTermVector,StringTermVector>;
+ auto terms = std::make_unique<TermVectorType>(in_strings.size());
+ for (auto term : values) {
+ terms->addTerm(term);
+ }
+ return terms;
+}
+
+template <typename TermType>
+void
+verify_subterms(InTerm& in_term, const std::vector<TermType>& values)
+{
+ EXPECT_EQUAL(values.size(), in_term.getNumTerms());
+ uint32_t i = 0;
+ for (auto term : values) {
+ if constexpr (std::is_same_v<TermType, int64_t>) {
+ EXPECT_EQUAL(term, in_term.getAsInteger(i).first);
+ } else {
+ EXPECT_EQUAL(term, in_term.getAsString(i).first);
+ }
+ ++i;
+ }
+}
+
+template <typename TermType>
+void
+verify_in_node(Node& node, const std::vector<TermType>& values)
+{
+ auto in_term = as_node<InTerm>(&node);
+ verify_subterms(*in_term, values);
+}
+
+template <typename TermType>
+void
+test_in_node(const std::vector<TermType>& values)
+{
+ QueryBuilder<SimpleQueryNodeTypes> builder;
+ builder.add_in_term(make_subterms(values), MultiTerm::Type::STRING,
+ "view", 0, Weight(0));
+ auto node = builder.build();
+ string stack_dump = StackDumpCreator::create(*node);
+ SimpleQueryStackDumpIterator iterator(stack_dump);
+ verify_in_node(*QueryTreeCreator<SimpleQueryNodeTypes>::create(iterator), values);
+ verify_in_node(*QueryTreeCreator<SimpleQueryNodeTypes>::replicate(*node), values);
+}
+
+}
+
+TEST("require that in_term with strings can be created")
+{
+ test_in_node(in_strings);
+}
+
+TEST("require that in_term with integers can be created")
+{
+ test_in_node(in_integers);
+}
+
} // namespace
TEST_MAIN() { TEST_RUN_ALL(); }