diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2024-01-23 15:04:28 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-23 15:04:28 +0100 |
commit | c5d10339306e912b1ac26a8a32dd2934b5383365 (patch) | |
tree | b2476b08c1058293e4a0b80d8aebe760d0b3633f | |
parent | caff978863720954c25c0a64437d4c63003e8d1d (diff) | |
parent | c6d05ea19ed4dc8083cb9d760d9101ab6db5e005 (diff) |
Merge pull request #30027 from vespa-engine/arnej/implement-rank-with-operator
actually implement RANK operator
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())); |