aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2024-01-23 15:04:28 +0100
committerGitHub <noreply@github.com>2024-01-23 15:04:28 +0100
commitc5d10339306e912b1ac26a8a32dd2934b5383365 (patch)
treeb2476b08c1058293e4a0b80d8aebe760d0b3633f
parentcaff978863720954c25c0a64437d4c63003e8d1d (diff)
parentc6d05ea19ed4dc8083cb9d760d9101ab6db5e005 (diff)
Merge pull request #30027 from vespa-engine/arnej/implement-rank-with-operator
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 679141dbc2f..5b0076a30c5 100644
--- a/searchlib/src/vespa/searchlib/query/streaming/query.cpp
+++ b/searchlib/src/vespa/searchlib/query/streaming/query.cpp
@@ -117,6 +117,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;
}
}
@@ -162,6 +163,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 0f15c536d44..4ab33a01d86 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 6ef63dcdd7a..32e3ec16b16 100644
--- a/searchlib/src/vespa/searchlib/query/streaming/querynode.cpp
+++ b/searchlib/src/vespa/searchlib/query/streaming/querynode.cpp
@@ -51,6 +51,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) {
@@ -176,17 +177,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()));