aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib/src/vespa/searchlib
diff options
context:
space:
mode:
Diffstat (limited to 'searchlib/src/vespa/searchlib')
-rw-r--r--searchlib/src/vespa/searchlib/parsequery/parse.h6
-rw-r--r--searchlib/src/vespa/searchlib/parsequery/stackdumpiterator.cpp4
-rw-r--r--searchlib/src/vespa/searchlib/query/streaming/query.cpp4
-rw-r--r--searchlib/src/vespa/searchlib/query/streaming/query.h8
-rw-r--r--searchlib/src/vespa/searchlib/query/streaming/querynode.cpp6
-rw-r--r--searchlib/src/vespa/searchlib/query/tree/CMakeLists.txt1
-rw-r--r--searchlib/src/vespa/searchlib/query/tree/const_bool_nodes.cpp10
-rw-r--r--searchlib/src/vespa/searchlib/query/tree/const_bool_nodes.h21
-rw-r--r--searchlib/src/vespa/searchlib/query/tree/customtypetermvisitor.h4
-rw-r--r--searchlib/src/vespa/searchlib/query/tree/customtypevisitor.h6
-rw-r--r--searchlib/src/vespa/searchlib/query/tree/querybuilder.h13
-rw-r--r--searchlib/src/vespa/searchlib/query/tree/queryreplicator.h8
-rw-r--r--searchlib/src/vespa/searchlib/query/tree/queryvisitor.h4
-rw-r--r--searchlib/src/vespa/searchlib/query/tree/simplequery.h5
-rw-r--r--searchlib/src/vespa/searchlib/query/tree/stackdumpcreator.cpp8
-rw-r--r--searchlib/src/vespa/searchlib/query/tree/stackdumpquerycreator.h4
-rw-r--r--searchlib/src/vespa/searchlib/query/tree/termnodes.h1
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/create_blueprint_visitor_helper.cpp8
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/create_blueprint_visitor_helper.h3
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/leaf_blueprints.cpp19
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/leaf_blueprints.h9
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/termasstring.cpp4
22 files changed, 154 insertions, 2 deletions
diff --git a/searchlib/src/vespa/searchlib/parsequery/parse.h b/searchlib/src/vespa/searchlib/parsequery/parse.h
index 7b9fd610ee5..7db9f0e43ea 100644
--- a/searchlib/src/vespa/searchlib/parsequery/parse.h
+++ b/searchlib/src/vespa/searchlib/parsequery/parse.h
@@ -53,8 +53,10 @@ public:
ITEM_REGEXP = 24,
ITEM_WORD_ALTERNATIVES = 25,
ITEM_NEAREST_NEIGHBOR = 26,
- ITEM_GEO_LOCATION_TERM = 27,
- ITEM_MAX = 28, // Indicates how long tables must be.
+ ITEM_GEO_LOCATION_TERM = 27,
+ ITEM_TRUE = 28,
+ ITEM_FALSE = 29,
+ ITEM_MAX = 30, // Indicates how long tables must be.
ITEM_UNDEF = 31,
};
diff --git a/searchlib/src/vespa/searchlib/parsequery/stackdumpiterator.cpp b/searchlib/src/vespa/searchlib/parsequery/stackdumpiterator.cpp
index 2ec392e0078..aa13c93810a 100644
--- a/searchlib/src/vespa/searchlib/parsequery/stackdumpiterator.cpp
+++ b/searchlib/src/vespa/searchlib/parsequery/stackdumpiterator.cpp
@@ -187,6 +187,10 @@ bool SimpleQueryStackDumpIterator::readNext() {
case ParseItem::ITEM_NEAREST_NEIGHBOR:
if ( ! readNN(p)) return false;
break;
+ case ParseItem::ITEM_TRUE:
+ case ParseItem::ITEM_FALSE:
+ // no content
+ break;
default:
// Unknown item, so report that no more are available
return false;
diff --git a/searchlib/src/vespa/searchlib/query/streaming/query.cpp b/searchlib/src/vespa/searchlib/query/streaming/query.cpp
index 4773827c036..309edf4d472 100644
--- a/searchlib/src/vespa/searchlib/query/streaming/query.cpp
+++ b/searchlib/src/vespa/searchlib/query/streaming/query.cpp
@@ -126,6 +126,10 @@ TrueNode::evaluate() const
return true;
}
+bool FalseNode::evaluate() const {
+ return false;
+}
+
bool
AndQueryNode::evaluate() const
{
diff --git a/searchlib/src/vespa/searchlib/query/streaming/query.h b/searchlib/src/vespa/searchlib/query/streaming/query.h
index 75388d564ee..d77bb7f0f65 100644
--- a/searchlib/src/vespa/searchlib/query/streaming/query.h
+++ b/searchlib/src/vespa/searchlib/query/streaming/query.h
@@ -49,6 +49,14 @@ public:
bool evaluate() const override;
};
+/** False operator. Matches nothing. */
+class FalseNode : public QueryConnector
+{
+public:
+ FalseNode() : QueryConnector("AND") { }
+ bool evaluate() const override;
+};
+
/**
N-ary Or operator that simply ANDs all the nodes together.
*/
diff --git a/searchlib/src/vespa/searchlib/query/streaming/querynode.cpp b/searchlib/src/vespa/searchlib/query/streaming/querynode.cpp
index 38939e3a8a4..060573861d9 100644
--- a/searchlib/src/vespa/searchlib/query/streaming/querynode.cpp
+++ b/searchlib/src/vespa/searchlib/query/streaming/querynode.cpp
@@ -64,6 +64,12 @@ QueryNode::Build(const QueryNode * parent, const QueryNodeResultFactory & factor
}
}
break;
+ case ParseItem::ITEM_TRUE:
+ qn = std::make_unique<TrueNode>();
+ break;
+ case ParseItem::ITEM_FALSE:
+ qn = std::make_unique<FalseNode>();
+ break;
case ParseItem::ITEM_GEO_LOCATION_TERM:
// TODO implement this:
// vespalib::string field = queryRep.getIndexName();
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 {
diff --git a/searchlib/src/vespa/searchlib/queryeval/create_blueprint_visitor_helper.cpp b/searchlib/src/vespa/searchlib/queryeval/create_blueprint_visitor_helper.cpp
index e1322d04081..5b8757411bd 100644
--- a/searchlib/src/vespa/searchlib/queryeval/create_blueprint_visitor_helper.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/create_blueprint_visitor_helper.cpp
@@ -90,4 +90,12 @@ CreateBlueprintVisitorHelper::visitWandTerm(query::WandTerm &n) {
n);
}
+void CreateBlueprintVisitorHelper::visit(query::TrueQueryNode &) {
+ setResult(std::make_unique<AlwaysTrueBlueprint>());
+}
+
+void CreateBlueprintVisitorHelper::visit(query::FalseQueryNode &) {
+ setResult(std::make_unique<EmptyBlueprint>());
+}
+
}
diff --git a/searchlib/src/vespa/searchlib/queryeval/create_blueprint_visitor_helper.h b/searchlib/src/vespa/searchlib/queryeval/create_blueprint_visitor_helper.h
index ceca605b2e6..86cde64a197 100644
--- a/searchlib/src/vespa/searchlib/queryeval/create_blueprint_visitor_helper.h
+++ b/searchlib/src/vespa/searchlib/queryeval/create_blueprint_visitor_helper.h
@@ -73,6 +73,9 @@ public:
void visit(query::SuffixTerm &n) override = 0;
void visit(query::RegExpTerm &n) override = 0;
void visit(query::NearestNeighborTerm &n) override = 0;
+
+ void visit(query::TrueQueryNode &) final override;
+ void visit(query::FalseQueryNode &) final override;
};
}
diff --git a/searchlib/src/vespa/searchlib/queryeval/leaf_blueprints.cpp b/searchlib/src/vespa/searchlib/queryeval/leaf_blueprints.cpp
index a72fbc8d57a..53ffe839a72 100644
--- a/searchlib/src/vespa/searchlib/queryeval/leaf_blueprints.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/leaf_blueprints.cpp
@@ -2,6 +2,7 @@
#include "leaf_blueprints.h"
#include "emptysearch.h"
+#include "full_search.h"
#include "simplesearch.h"
#include "fake_search.h"
@@ -37,6 +38,24 @@ EmptyBlueprint::EmptyBlueprint()
{
}
+
+SearchIterator::UP
+AlwaysTrueBlueprint::createLeafSearch(const search::fef::TermFieldMatchDataArray &, bool) const
+{
+ return std::make_unique<FullSearch>();
+}
+
+SearchIterator::UP
+AlwaysTrueBlueprint::createFilterSearch(bool /*strict*/, FilterConstraint /* constraint */) const
+{
+ return std::make_unique<FullSearch>();
+}
+
+AlwaysTrueBlueprint::AlwaysTrueBlueprint() : SimpleLeafBlueprint(FieldSpecBaseList())
+{
+ setEstimate(HitEstimate(search::endDocId, false));
+}
+
//-----------------------------------------------------------------------------
SearchIterator::UP
diff --git a/searchlib/src/vespa/searchlib/queryeval/leaf_blueprints.h b/searchlib/src/vespa/searchlib/queryeval/leaf_blueprints.h
index 288f4dec1c8..7a1d8f3d253 100644
--- a/searchlib/src/vespa/searchlib/queryeval/leaf_blueprints.h
+++ b/searchlib/src/vespa/searchlib/queryeval/leaf_blueprints.h
@@ -22,6 +22,15 @@ public:
SearchIterator::UP createFilterSearch(bool strict, FilterConstraint constraint) const override;
};
+class AlwaysTrueBlueprint : public SimpleLeafBlueprint
+{
+protected:
+ SearchIterator::UP createLeafSearch(const search::fef::TermFieldMatchDataArray &tfmda, bool strict) const override;
+public:
+ AlwaysTrueBlueprint();
+ SearchIterator::UP createFilterSearch(bool strict, FilterConstraint constraint) const override;
+};
+
//-----------------------------------------------------------------------------
class SimpleBlueprint : public SimpleLeafBlueprint
diff --git a/searchlib/src/vespa/searchlib/queryeval/termasstring.cpp b/searchlib/src/vespa/searchlib/queryeval/termasstring.cpp
index bcf3fb8e86d..08c0280ee68 100644
--- a/searchlib/src/vespa/searchlib/queryeval/termasstring.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/termasstring.cpp
@@ -16,6 +16,7 @@ using search::query::And;
using search::query::AndNot;
using search::query::DotProduct;
using search::query::Equiv;
+using search::query::FalseQueryNode;
using search::query::LocationTerm;
using search::query::Near;
using search::query::NearestNeighborTerm;
@@ -34,6 +35,7 @@ using search::query::SameElement;
using search::query::StringTerm;
using search::query::SubstringTerm;
using search::query::SuffixTerm;
+using search::query::TrueQueryNode;
using search::query::WandTerm;
using search::query::WeakAnd;
using search::query::WeightedSetTerm;
@@ -105,6 +107,8 @@ struct TermAsStringVisitor : public QueryVisitor {
void visit(RegExpTerm &n) override {visitTerm(n); }
void visit(PredicateQuery &) override {illegalVisit(); }
void visit(NearestNeighborTerm &) override { illegalVisit(); }
+ void visit(TrueQueryNode &) override { illegalVisit(); }
+ void visit(FalseQueryNode &) override { illegalVisit(); }
};
void throwFailure(const search::query::Node &term_node) __attribute((noinline));