aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib/src/vespa/searchlib/query/streaming/querynode.cpp
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@online.no>2024-02-09 13:12:45 +0100
committerTor Egge <Tor.Egge@online.no>2024-02-09 13:12:45 +0100
commit332bdd44a075c16418b49ddfe66965e5a46e2e8c (patch)
treed1a848f04b0deda0937687a041898faf55f199f8 /searchlib/src/vespa/searchlib/query/streaming/querynode.cpp
parent6e03787d79b327915dff98815db777d879986396 (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.cpp40
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)
{