diff options
author | Arne Juul <arnej@vespa.ai> | 2024-01-23 13:27:37 +0000 |
---|---|---|
committer | Arne Juul <arnej@vespa.ai> | 2024-01-23 13:27:37 +0000 |
commit | c6d05ea19ed4dc8083cb9d760d9101ab6db5e005 (patch) | |
tree | a4b043f6884e7d3453186aacde018b5aa0bfc7c3 | |
parent | 056a486a55fd66c39b9b30065865d29655f338f7 (diff) |
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 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())); |