// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. // Unit tests for query_visitor. #include #include #include #include #include #include #include #include LOG_SETUP("query_visitor_test"); using namespace search::query; namespace { class MyVisitor : public QueryVisitor { public: template bool &isVisited() { static bool b; return b; } void visit(And &) override { isVisited() = true; } void visit(AndNot &) override { isVisited() = true; } void visit(Equiv &) override { isVisited() = true; } void visit(NumberTerm &) override { isVisited() = true; } void visit(LocationTerm &) override { isVisited() = true; } void visit(Near &) override { isVisited() = true; } void visit(ONear &) override { isVisited() = true; } void visit(Or &) override { isVisited() = true; } void visit(Phrase &) override { isVisited() = true; } void visit(SameElement &) override { isVisited() = true; } void visit(PrefixTerm &) override { isVisited() = true; } void visit(RangeTerm &) override { isVisited() = true; } void visit(Rank &) override { isVisited() = true; } void visit(StringTerm &) override { isVisited() = true; } void visit(SubstringTerm &) override { isVisited() = true; } void visit(SuffixTerm &) override { isVisited() = true; } void visit(WeakAnd &) override { isVisited() = true; } void visit(WeightedSetTerm &) override { isVisited() = true; } void visit(DotProduct &) override { isVisited() = true; } void visit(WandTerm &) override { isVisited() = true; } void visit(PredicateQuery &) override { isVisited() = true; } void visit(RegExpTerm &) override { isVisited() = true; } void visit(NearestNeighborTerm &) override { isVisited() = true; } void visit(TrueQueryNode &) override { isVisited() = true; } void visit(FalseQueryNode &) override { isVisited() = true; } void visit(FuzzyTerm &) override { isVisited() = true; } void visit(InTerm&) override { isVisited() = true; } }; template void checkVisit(T *node) { Node::UP query(node); MyVisitor visitor; visitor.isVisited() = false; query->accept(visitor); ASSERT_TRUE(visitor.isVisited()); } TEST("requireThatAllNodesCanBeVisited") { checkVisit(new SimpleAnd); checkVisit(new SimpleAndNot); checkVisit(new SimpleNear(0)); checkVisit(new SimpleONear(0)); checkVisit(new SimpleOr); checkVisit(new SimplePhrase("field", 0, Weight(42))); checkVisit(new SimpleSameElement("field", 0, Weight(42))); checkVisit(new SimpleWeightedSetTerm(0, "field", 0, Weight(42))); checkVisit(new SimpleDotProduct(0, "field", 0, Weight(42))); checkVisit(new SimpleWandTerm(0, "field", 0, Weight(42), 57, 67, 77.7)); checkVisit(new SimpleRank); checkVisit(new SimpleNumberTerm("0.42", "field", 0, Weight(0))); const Location location(Point{10, 10}, 20, 0); checkVisit(new SimpleLocationTerm(location, "field", 0, Weight(0))); checkVisit(new SimplePrefixTerm("t", "field", 0, Weight(0))); checkVisit(new SimpleRangeTerm(Range(0, 1), "field", 0, Weight(0))); checkVisit(new SimpleStringTerm("t", "field", 0, Weight(0))); checkVisit(new SimpleSubstringTerm("t", "field", 0, Weight(0))); checkVisit(new SimpleSuffixTerm("t", "field", 0, Weight(0))); checkVisit(new SimplePredicateQuery(PredicateQueryTerm::UP(), "field", 0, Weight(0))); checkVisit(new SimpleRegExpTerm("t", "field", 0, Weight(0))); checkVisit(new SimpleNearestNeighborTerm("query_tensor", "doc_tensor", 0, Weight(0), 123, true, 321, 100100.25)); checkVisit(new SimpleTrue()); checkVisit(new SimpleFalse()); checkVisit(new SimpleFuzzyTerm("t", "field", 0, Weight(0), 2, 0)); checkVisit(new SimpleInTerm(std::make_unique(0), MultiTerm::Type::STRING, "field", 0, Weight(0))); } } // namespace TEST_MAIN() { TEST_RUN_ALL(); }