diff options
Diffstat (limited to 'searchlib/src/vespa/searchlib/query/tree')
12 files changed, 85 insertions, 0 deletions
diff --git a/searchlib/src/vespa/searchlib/query/tree/CMakeLists.txt b/searchlib/src/vespa/searchlib/query/tree/CMakeLists.txt index ef2003e4ae1..ec9156fbb52 100644 --- a/searchlib/src/vespa/searchlib/query/tree/CMakeLists.txt +++ b/searchlib/src/vespa/searchlib/query/tree/CMakeLists.txt @@ -1,6 +1,7 @@ # Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. vespa_add_library(searchlib_query_tree OBJECT SOURCES + const_bool_nodes.cpp intermediate.cpp intermediatenodes.cpp querybuilder.cpp diff --git a/searchlib/src/vespa/searchlib/query/tree/const_bool_nodes.cpp b/searchlib/src/vespa/searchlib/query/tree/const_bool_nodes.cpp new file mode 100644 index 00000000000..78d8c69a1b5 --- /dev/null +++ b/searchlib/src/vespa/searchlib/query/tree/const_bool_nodes.cpp @@ -0,0 +1,10 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#include "const_bool_nodes.h" + +namespace search::query { + +TrueQueryNode::~TrueQueryNode() = default; +FalseQueryNode::~FalseQueryNode() = default; + +} diff --git a/searchlib/src/vespa/searchlib/query/tree/const_bool_nodes.h b/searchlib/src/vespa/searchlib/query/tree/const_bool_nodes.h new file mode 100644 index 00000000000..fd31f3bf8f2 --- /dev/null +++ b/searchlib/src/vespa/searchlib/query/tree/const_bool_nodes.h @@ -0,0 +1,21 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +#pragma once + +#include "node.h" +#include "queryvisitor.h" + +namespace search::query { + +class TrueQueryNode : public Node { +public: + ~TrueQueryNode(); + void accept(QueryVisitor &visitor) override { visitor.visit(*this); } +}; + +class FalseQueryNode : public Node { +public: + ~FalseQueryNode(); + void accept(QueryVisitor &visitor) override { visitor.visit(*this); } +}; + +} diff --git a/searchlib/src/vespa/searchlib/query/tree/customtypetermvisitor.h b/searchlib/src/vespa/searchlib/query/tree/customtypetermvisitor.h index de4ae416504..bf92f0ae04c 100644 --- a/searchlib/src/vespa/searchlib/query/tree/customtypetermvisitor.h +++ b/searchlib/src/vespa/searchlib/query/tree/customtypetermvisitor.h @@ -28,6 +28,10 @@ private: void visit(typename NodeTypes::WeakAnd &n) override { visitChildren(n); } void visit(typename NodeTypes::SameElement &n) override { visitChildren(n); } + // leaf nodes without terms: + void visit(typename NodeTypes::TrueQueryNode &) override {} + void visit(typename NodeTypes::FalseQueryNode &) override {} + // phrases and weighted set terms are conceptual leaf nodes and // should be handled that way. }; diff --git a/searchlib/src/vespa/searchlib/query/tree/customtypevisitor.h b/searchlib/src/vespa/searchlib/query/tree/customtypevisitor.h index aa4408d0dbe..9f29c34aa05 100644 --- a/searchlib/src/vespa/searchlib/query/tree/customtypevisitor.h +++ b/searchlib/src/vespa/searchlib/query/tree/customtypevisitor.h @@ -50,6 +50,8 @@ public: virtual void visit(typename NodeTypes::PredicateQuery &) = 0; virtual void visit(typename NodeTypes::RegExpTerm &) = 0; virtual void visit(typename NodeTypes::NearestNeighborTerm &) = 0; + virtual void visit(typename NodeTypes::TrueQueryNode &) = 0; + virtual void visit(typename NodeTypes::FalseQueryNode &) = 0; private: // Route QueryVisit requests to the correct custom type. @@ -77,6 +79,8 @@ private: typedef typename NodeTypes::PredicateQuery TPredicateQuery; typedef typename NodeTypes::RegExpTerm TRegExpTerm; typedef typename NodeTypes::NearestNeighborTerm TNearestNeighborTerm; + typedef typename NodeTypes::TrueQueryNode TTrueQueryNode; + typedef typename NodeTypes::FalseQueryNode TFalseQueryNode; void visit(And &n) override { visit(static_cast<TAnd&>(n)); } void visit(AndNot &n) override { visit(static_cast<TAndNot&>(n)); } @@ -101,6 +105,8 @@ private: void visit(PredicateQuery &n) override { visit(static_cast<TPredicateQuery&>(n)); } void visit(RegExpTerm &n) override { visit(static_cast<TRegExpTerm&>(n)); } void visit(NearestNeighborTerm &n) override { visit(static_cast<TNearestNeighborTerm&>(n)); } + void visit(TrueQueryNode &n) override { visit(static_cast<TTrueQueryNode&>(n)); } + void visit(FalseQueryNode &n) override { visit(static_cast<TFalseQueryNode&>(n)); } }; } diff --git a/searchlib/src/vespa/searchlib/query/tree/querybuilder.h b/searchlib/src/vespa/searchlib/query/tree/querybuilder.h index a0788f0a777..9631e2afded 100644 --- a/searchlib/src/vespa/searchlib/query/tree/querybuilder.h +++ b/searchlib/src/vespa/searchlib/query/tree/querybuilder.h @@ -21,6 +21,7 @@ #include "predicate_query_term.h" #include "node.h" +#include "const_bool_nodes.h" #include <vespa/searchlib/query/weight.h> #include <stack> @@ -98,6 +99,12 @@ public: // You may specialize these functions for your own traits class to have full // control of the query node instantiation. +template <class NodeTypes> +typename NodeTypes::TrueQueryNode *create_true() { return new typename NodeTypes::TrueQueryNode; } + +template <class NodeTypes> +typename NodeTypes::FalseQueryNode *create_false() { return new typename NodeTypes::FalseQueryNode; } + // Intermediate nodes template <class NodeTypes> typename NodeTypes::And *createAnd() { return new typename NodeTypes::And; } @@ -328,6 +335,12 @@ public: adjustWeight(weight); return addTerm(create_nearest_neighbor_term<NodeTypes>(query_tensor_name, field_name, id, weight, target_num_hits, allow_approximate, explore_additional_hits, distance_threshold)); } + typename NodeTypes::TrueQueryNode &add_true_node() { + return addTerm(create_true<NodeTypes>()); + } + typename NodeTypes::FalseQueryNode &add_false_node() { + return addTerm(create_false<NodeTypes>()); + } }; } diff --git a/searchlib/src/vespa/searchlib/query/tree/queryreplicator.h b/searchlib/src/vespa/searchlib/query/tree/queryreplicator.h index 7501cd2c6f2..3fb72f93b23 100644 --- a/searchlib/src/vespa/searchlib/query/tree/queryreplicator.h +++ b/searchlib/src/vespa/searchlib/query/tree/queryreplicator.h @@ -185,6 +185,14 @@ private: node.get_allow_approximate(), node.get_explore_additional_hits(), node.get_distance_threshold())); } + + void visit(TrueQueryNode &) override { + _builder.add_true_node(); + } + + void visit(FalseQueryNode &) override { + _builder.add_false_node(); + } }; } diff --git a/searchlib/src/vespa/searchlib/query/tree/queryvisitor.h b/searchlib/src/vespa/searchlib/query/tree/queryvisitor.h index 3d53c1181ed..02887975085 100644 --- a/searchlib/src/vespa/searchlib/query/tree/queryvisitor.h +++ b/searchlib/src/vespa/searchlib/query/tree/queryvisitor.h @@ -27,6 +27,8 @@ class PredicateQuery; class RegExpTerm; class SameElement; class NearestNeighborTerm; +class TrueQueryNode; +class FalseQueryNode; struct QueryVisitor { virtual ~QueryVisitor() {} @@ -54,6 +56,8 @@ struct QueryVisitor { virtual void visit(PredicateQuery &) = 0; virtual void visit(RegExpTerm &) = 0; virtual void visit(NearestNeighborTerm &) = 0; + virtual void visit(TrueQueryNode &) = 0; + virtual void visit(FalseQueryNode &) = 0; }; } diff --git a/searchlib/src/vespa/searchlib/query/tree/simplequery.h b/searchlib/src/vespa/searchlib/query/tree/simplequery.h index 44d869bc8bf..0e52698c915 100644 --- a/searchlib/src/vespa/searchlib/query/tree/simplequery.h +++ b/searchlib/src/vespa/searchlib/query/tree/simplequery.h @@ -7,11 +7,14 @@ #pragma once +#include "const_bool_nodes.h" #include "intermediatenodes.h" #include "termnodes.h" namespace search::query { +struct SimpleTrue : TrueQueryNode {}; +struct SimpleFalse : FalseQueryNode {}; struct SimpleAnd : And {}; struct SimpleAndNot : AndNot {}; struct SimpleNear : Near { SimpleNear(size_t dist) : Near(dist) {} }; @@ -119,6 +122,8 @@ struct SimpleQueryNodeTypes { using And = SimpleAnd; using AndNot = SimpleAndNot; using Equiv = SimpleEquiv; + using TrueQueryNode = SimpleTrue; + using FalseQueryNode = SimpleFalse; using NumberTerm = SimpleNumberTerm; using LocationTerm = SimpleLocationTerm; using Near = SimpleNear; diff --git a/searchlib/src/vespa/searchlib/query/tree/stackdumpcreator.cpp b/searchlib/src/vespa/searchlib/query/tree/stackdumpcreator.cpp index 4b89a7f9425..d45a72d316a 100644 --- a/searchlib/src/vespa/searchlib/query/tree/stackdumpcreator.cpp +++ b/searchlib/src/vespa/searchlib/query/tree/stackdumpcreator.cpp @@ -242,6 +242,14 @@ class QueryNodeConverter : public QueryVisitor { createTerm(node, ParseItem::ITEM_GEO_LOCATION_TERM); } + void visit(TrueQueryNode &) override { + appendByte(ParseItem::ITEM_TRUE); + } + + void visit(FalseQueryNode &) override { + appendByte(ParseItem::ITEM_FALSE); + } + void visit(PrefixTerm &node) override { createTerm(node, ParseItem::ITEM_PREFIXTERM); } diff --git a/searchlib/src/vespa/searchlib/query/tree/stackdumpquerycreator.h b/searchlib/src/vespa/searchlib/query/tree/stackdumpquerycreator.h index f8254186900..5a6f315205e 100644 --- a/searchlib/src/vespa/searchlib/query/tree/stackdumpquerycreator.h +++ b/searchlib/src/vespa/searchlib/query/tree/stackdumpquerycreator.h @@ -153,6 +153,10 @@ private: builder.add_nearest_neighbor_term(query_tensor_name, field_name, id, weight, target_num_hits, allow_approximate, explore_additional_hits, distance_threshold); + } else if (type == ParseItem::ITEM_TRUE) { + builder.add_true_node(); + } else if (type == ParseItem::ITEM_FALSE) { + builder.add_false_node(); } else { vespalib::stringref term = queryStack.getTerm(); vespalib::stringref view = queryStack.getIndexName(); diff --git a/searchlib/src/vespa/searchlib/query/tree/termnodes.h b/searchlib/src/vespa/searchlib/query/tree/termnodes.h index 51667de9530..a728b674999 100644 --- a/searchlib/src/vespa/searchlib/query/tree/termnodes.h +++ b/searchlib/src/vespa/searchlib/query/tree/termnodes.h @@ -7,6 +7,7 @@ #include "querynodemixin.h" #include "range.h" #include "term.h" +#include "const_bool_nodes.h" namespace search::query { |