diff options
author | Tor Egge <Tor.Egge@online.no> | 2024-02-09 13:12:45 +0100 |
---|---|---|
committer | Tor Egge <Tor.Egge@online.no> | 2024-02-09 13:12:45 +0100 |
commit | 332bdd44a075c16418b49ddfe66965e5a46e2e8c (patch) | |
tree | d1a848f04b0deda0937687a041898faf55f199f8 /searchlib/src/vespa/searchlib/query/streaming/querynode.cpp | |
parent | 6e03787d79b327915dff98815db777d879986396 (diff) |
Handle search::streaming::EquivQueryNode as a leaf in the query tree.
Diffstat (limited to 'searchlib/src/vespa/searchlib/query/streaming/querynode.cpp')
-rw-r--r-- | searchlib/src/vespa/searchlib/query/streaming/querynode.cpp | 40 |
1 files changed, 35 insertions, 5 deletions
diff --git a/searchlib/src/vespa/searchlib/query/streaming/querynode.cpp b/searchlib/src/vespa/searchlib/query/streaming/querynode.cpp index 0b277dbe221..dd3b1f84ad9 100644 --- a/searchlib/src/vespa/searchlib/query/streaming/querynode.cpp +++ b/searchlib/src/vespa/searchlib/query/streaming/querynode.cpp @@ -9,6 +9,7 @@ #include "same_element_query_node.h" #include <vespa/searchlib/parsequery/stackdumpiterator.h> #include <vespa/searchlib/query/streaming/dot_product_term.h> +#include <vespa/searchlib/query/streaming/equiv_query_node.h> #include <vespa/searchlib/query/streaming/in_term.h> #include <vespa/searchlib/query/streaming/wand_term.h> #include <vespa/searchlib/query/streaming/weighted_set_term.h> @@ -44,7 +45,6 @@ QueryNode::Build(const QueryNode * parent, const QueryNodeResultFactory & factor case ParseItem::ITEM_AND: case ParseItem::ITEM_OR: case ParseItem::ITEM_WEAK_AND: - case ParseItem::ITEM_EQUIV: case ParseItem::ITEM_NOT: case ParseItem::ITEM_SAME_ELEMENT: case ParseItem::ITEM_NEAR: @@ -142,10 +142,10 @@ QueryNode::Build(const QueryNode * parent, const QueryNodeResultFactory & factor auto dotPos = ssTerm.find('.'); phrase->add_term(std::make_unique<QueryTerm>(factory.create(), ssTerm.substr(0, dotPos), ssIndex, TermType::WORD, normalize_mode)); phrase->add_term(std::make_unique<QueryTerm>(factory.create(), ssTerm.substr(dotPos + 1), ssIndex, TermType::WORD, normalize_mode)); - auto orqn = std::make_unique<EquivQueryNode>(); - orqn->addChild(std::move(qt)); - orqn->addChild(std::move(phrase)); - qn = std::move(orqn); + auto eqn = std::make_unique<EquivQueryNode>(factory.create(), 2); + eqn->add_term(std::move(qt)); + eqn->add_term(std::move(phrase)); + qn = std::move(eqn); } else { qn = std::move(qt); } @@ -171,6 +171,9 @@ QueryNode::Build(const QueryNode * parent, const QueryNodeResultFactory & factor case ParseItem::ITEM_PHRASE: qn = build_phrase_term(factory, queryRep); break; + case ParseItem::ITEM_EQUIV: + qn = build_equiv_term(factory, queryRep, allowRewrite); + break; default: skip_unknown(queryRep); break; @@ -282,6 +285,33 @@ QueryNode::build_phrase_term(const QueryNodeResultFactory& factory, SimpleQueryS return phrase; } +std::unique_ptr<QueryNode> +QueryNode::build_equiv_term(const QueryNodeResultFactory& factory, SimpleQueryStackDumpIterator& queryRep, bool allow_rewrite) +{ + auto eqn = std::make_unique<EquivQueryNode>(factory.create(), queryRep.getArity()); + auto arity = queryRep.getArity(); + eqn->setWeight(queryRep.GetWeight()); + eqn->setUniqueId(queryRep.getUniqueId()); + for (size_t i = 0; i < arity; ++i) { + queryRep.next(); + auto qn = Build(eqn.get(), factory, queryRep, allow_rewrite); + auto nested_eqn = dynamic_cast<EquivQueryNode*>(qn.get()); + if (nested_eqn != nullptr) { + auto stolen_terms = nested_eqn->steal_terms(); + for (auto& term : stolen_terms) { + eqn->add_term(std::move(term)); + } + continue; + } + auto qtp = dynamic_cast<QueryTerm*>(qn.get()); + assert(qtp != nullptr); + qn.release(); + std::unique_ptr<QueryTerm> qt(qtp); + eqn->add_term(std::move(qt)); + } + return eqn; +} + void QueryNode::skip_unknown(SimpleQueryStackDumpIterator& queryRep) { |