summaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorArne H Juul <arnej@yahooinc.com>2021-10-18 13:53:55 +0000
committerArne H Juul <arnej@yahooinc.com>2021-10-18 13:55:00 +0000
commit0c76851a13f75fdca3f859ea6135b29e2179656f (patch)
treea5ea1fe5d97bfb8e86d5ebad850ae6f90294477d /searchlib
parenta6784673e65b55a7812d208c06f76ad903b81cab (diff)
add ITEM_TRUE and ITEM_FALSE query nodes
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/tests/query/customtypevisitor_test.cpp4
-rw-r--r--searchlib/src/tests/query/query_visitor_test.cpp2
-rw-r--r--searchlib/src/vespa/searchlib/memoryindex/memory_index.cpp2
-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.h19
-rw-r--r--searchlib/src/vespa/searchlib/query/tree/customtypetermvisitor.h4
-rw-r--r--searchlib/src/vespa/searchlib/query/tree/querybuilder.h3
-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/stackdumpcreator.cpp8
-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/fake_searchable.cpp2
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/leaf_blueprints.cpp19
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/leaf_blueprints.h11
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/termasstring.cpp4
23 files changed, 138 insertions, 3 deletions
diff --git a/searchlib/src/tests/query/customtypevisitor_test.cpp b/searchlib/src/tests/query/customtypevisitor_test.cpp
index 747b376777a..112e49cd1c1 100644
--- a/searchlib/src/tests/query/customtypevisitor_test.cpp
+++ b/searchlib/src/tests/query/customtypevisitor_test.cpp
@@ -104,6 +104,8 @@ public:
void visit(MyPredicateQuery &) override { setVisited<MyPredicateQuery>(); }
void visit(MyRegExpTerm &) override { setVisited<MyRegExpTerm>(); }
void visit(MyNearestNeighborTerm &) override { setVisited<MyNearestNeighborTerm>(); }
+ void visit(TrueQueryNode &) override {}
+ void visit(FalseQueryNode &) override {}
};
template <class T>
@@ -139,4 +141,4 @@ TEST("customtypevisitor_test") {
}
} // namespace
-TEST_MAIN() { TEST_RUN_ALL(); } \ No newline at end of file
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/searchlib/src/tests/query/query_visitor_test.cpp b/searchlib/src/tests/query/query_visitor_test.cpp
index 9090575bd44..b9d530eec5b 100644
--- a/searchlib/src/tests/query/query_visitor_test.cpp
+++ b/searchlib/src/tests/query/query_visitor_test.cpp
@@ -47,6 +47,8 @@ public:
void visit(PredicateQuery &) override { isVisited<PredicateQuery>() = true; }
void visit(RegExpTerm &) override { isVisited<RegExpTerm>() = true; }
void visit(NearestNeighborTerm &) override { isVisited<NearestNeighborTerm>() = true; }
+ void visit(TrueQueryNode &) override { isVisited<TrueQueryNode>() = true; }
+ void visit(FalseQueryNode &) override { isVisited<FalseQueryNode>() = true; }
};
template <class T>
diff --git a/searchlib/src/vespa/searchlib/memoryindex/memory_index.cpp b/searchlib/src/vespa/searchlib/memoryindex/memory_index.cpp
index 1574c94e164..8870a498a55 100644
--- a/searchlib/src/vespa/searchlib/memoryindex/memory_index.cpp
+++ b/searchlib/src/vespa/searchlib/memoryindex/memory_index.cpp
@@ -37,6 +37,8 @@ using query::RegExpTerm;
using query::StringTerm;
using query::SubstringTerm;
using query::SuffixTerm;
+using query::TrueQueryNode;
+using query::FalseQueryNode;
using queryeval::Blueprint;
using queryeval::CreateBlueprintVisitorHelper;
using queryeval::EmptyBlueprint;
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..fae7c943319
--- /dev/null
+++ b/searchlib/src/vespa/searchlib/query/tree/const_bool_nodes.h
@@ -0,0 +1,19 @@
+// 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 {
+ ~TrueQueryNode();
+ void accept(QueryVisitor &visitor) override { visitor.visit(*this); }
+};
+
+class FalseQueryNode : public Node {
+ ~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..cc593840d87 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(TrueQueryNode &) override {}
+ void visit(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/querybuilder.h b/searchlib/src/vespa/searchlib/query/tree/querybuilder.h
index a0788f0a777..3da8b32b9ee 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>
@@ -328,6 +329,8 @@ 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));
}
+ void add_true_node() { addTerm(new TrueQueryNode()); }
+ void add_false_node() { addTerm(new TrueQueryNode()); }
};
}
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/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/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/fake_searchable.cpp b/searchlib/src/vespa/searchlib/queryeval/fake_searchable.cpp
index 519f6e81774..838a95d483a 100644
--- a/searchlib/src/vespa/searchlib/queryeval/fake_searchable.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/fake_searchable.cpp
@@ -6,6 +6,7 @@
#include "create_blueprint_visitor_helper.h"
#include <vespa/vespalib/objects/visit.h>
+using search::query::FalseQueryNode;
using search::query::LocationTerm;
using search::query::NearestNeighborTerm;
using search::query::Node;
@@ -17,6 +18,7 @@ using search::query::RegExpTerm;
using search::query::StringTerm;
using search::query::SubstringTerm;
using search::query::SuffixTerm;
+using search::query::TrueQueryNode;
namespace search::queryeval {
diff --git a/searchlib/src/vespa/searchlib/queryeval/leaf_blueprints.cpp b/searchlib/src/vespa/searchlib/queryeval/leaf_blueprints.cpp
index a72fbc8d57a..cf96ec5a6d9 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(std::numeric_limits<int32_t>::max(), 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..61b173fa5b2 100644
--- a/searchlib/src/vespa/searchlib/queryeval/leaf_blueprints.h
+++ b/searchlib/src/vespa/searchlib/queryeval/leaf_blueprints.h
@@ -22,6 +22,17 @@ 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(const FieldSpecBaseList &fields);
+ //AlwaysTrueBlueprint(const FieldSpecBase &field);
+ 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));