aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArne Juul <arnej@vespa.ai>2024-01-23 13:27:37 +0000
committerArne Juul <arnej@vespa.ai>2024-01-23 13:27:37 +0000
commitc6d05ea19ed4dc8083cb9d760d9101ab6db5e005 (patch)
treea4b043f6884e7d3453186aacde018b5aa0bfc7c3
parent056a486a55fd66c39b9b30065865d29655f338f7 (diff)
actually implement RANK operator
-rw-r--r--searchlib/src/vespa/searchlib/query/streaming/query.cpp13
-rw-r--r--searchlib/src/vespa/searchlib/query/streaming/query.h12
-rw-r--r--searchlib/src/vespa/searchlib/query/streaming/querynode.cpp12
3 files changed, 26 insertions, 11 deletions
diff --git a/searchlib/src/vespa/searchlib/query/streaming/query.cpp b/searchlib/src/vespa/searchlib/query/streaming/query.cpp
index c58e1e62e57..03a512adc09 100644
--- a/searchlib/src/vespa/searchlib/query/streaming/query.cpp
+++ b/searchlib/src/vespa/searchlib/query/streaming/query.cpp
@@ -114,6 +114,7 @@ QueryConnector::create(ParseItem::ItemType type)
case search::ParseItem::ITEM_SAME_ELEMENT: return std::make_unique<SameElementQueryNode>();
case search::ParseItem::ITEM_NEAR: return std::make_unique<NearQueryNode>();
case search::ParseItem::ITEM_ONEAR: return std::make_unique<ONearQueryNode>();
+ case search::ParseItem::ITEM_RANK: return std::make_unique<RankWithQueryNode>();
default: return nullptr;
}
}
@@ -159,6 +160,18 @@ OrQueryNode::evaluate() const {
return false;
}
+bool
+RankWithQueryNode::evaluate() const {
+ bool first = true;
+ bool firstOk = false;
+ for (const auto & qn : getChildren()) {
+ if (qn->evaluate()) {
+ if (first) firstOk = true;
+ }
+ first = false;
+ }
+ return firstOk;
+}
bool
EquivQueryNode::evaluate() const
diff --git a/searchlib/src/vespa/searchlib/query/streaming/query.h b/searchlib/src/vespa/searchlib/query/streaming/query.h
index 84c693b86d0..2a8c75b91ff 100644
--- a/searchlib/src/vespa/searchlib/query/streaming/query.h
+++ b/searchlib/src/vespa/searchlib/query/streaming/query.h
@@ -95,6 +95,18 @@ public:
};
/**
+ N-ary RankWith operator
+*/
+class RankWithQueryNode : public QueryConnector
+{
+public:
+ RankWithQueryNode() noexcept : QueryConnector("RANK") { }
+ explicit RankWithQueryNode(const char * opName) noexcept : QueryConnector(opName) { }
+ bool evaluate() const override;
+};
+
+
+/**
N-ary "EQUIV" operator that merges terms from nodes below.
*/
class EquivQueryNode : public OrQueryNode
diff --git a/searchlib/src/vespa/searchlib/query/streaming/querynode.cpp b/searchlib/src/vespa/searchlib/query/streaming/querynode.cpp
index e71529a8aca..8b896ddf471 100644
--- a/searchlib/src/vespa/searchlib/query/streaming/querynode.cpp
+++ b/searchlib/src/vespa/searchlib/query/streaming/querynode.cpp
@@ -48,6 +48,7 @@ QueryNode::Build(const QueryNode * parent, const QueryNodeResultFactory & factor
case ParseItem::ITEM_SAME_ELEMENT:
case ParseItem::ITEM_NEAR:
case ParseItem::ITEM_ONEAR:
+ case ParseItem::ITEM_RANK:
{
qn = QueryConnector::create(type);
if (qn) {
@@ -173,17 +174,6 @@ QueryNode::Build(const QueryNode * parent, const QueryNodeResultFactory & factor
}
}
break;
- case ParseItem::ITEM_RANK:
- {
- if (arity >= 1) {
- queryRep.next();
- qn = Build(parent, factory, queryRep, false);
- for (uint32_t skipCount = arity-1; (skipCount > 0) && queryRep.next(); skipCount--) {
- skipCount += queryRep.getArity();
- }
- }
- }
- break;
case ParseItem::ITEM_STRING_IN:
qn = std::make_unique<InTerm>(factory.create(), queryRep.getIndexName(), queryRep.get_terms(),
factory.normalizing_mode(queryRep.getIndexName()));