aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib/src/vespa/searchlib/query/streaming/querynode.cpp
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@online.no>2024-02-02 14:20:03 +0100
committerTor Egge <Tor.Egge@online.no>2024-02-02 14:20:03 +0100
commit41502ddacbfc64c2ef883f8be16b88d80a8f33c8 (patch)
tree393f8f3ede3ad501583ca1dbfa9464b632d00bfa /searchlib/src/vespa/searchlib/query/streaming/querynode.cpp
parentd005a092da0e5f352a9ede03ab48989a1d5dbb2b (diff)
Change parent class of search::streaming::PhraseQueryNode from
search::streaming::AndQueryNode to search::streaming::MultiTerm.
Diffstat (limited to 'searchlib/src/vespa/searchlib/query/streaming/querynode.cpp')
-rw-r--r--searchlib/src/vespa/searchlib/query/streaming/querynode.cpp27
1 files changed, 23 insertions, 4 deletions
diff --git a/searchlib/src/vespa/searchlib/query/streaming/querynode.cpp b/searchlib/src/vespa/searchlib/query/streaming/querynode.cpp
index 32e3ec16b16..69fe77d3fd5 100644
--- a/searchlib/src/vespa/searchlib/query/streaming/querynode.cpp
+++ b/searchlib/src/vespa/searchlib/query/streaming/querynode.cpp
@@ -47,7 +47,6 @@ QueryNode::Build(const QueryNode * parent, const QueryNodeResultFactory & factor
case ParseItem::ITEM_WEAK_AND:
case ParseItem::ITEM_EQUIV:
case ParseItem::ITEM_NOT:
- case ParseItem::ITEM_PHRASE:
case ParseItem::ITEM_SAME_ELEMENT:
case ParseItem::ITEM_NEAR:
case ParseItem::ITEM_ONEAR:
@@ -163,10 +162,10 @@ QueryNode::Build(const QueryNode * parent, const QueryNodeResultFactory & factor
qt->setWeight(queryRep.GetWeight());
qt->setUniqueId(queryRep.getUniqueId());
if (allowRewrite && possibleFloat(*qt, ssTerm) && factory.allow_float_terms_rewrite(ssIndex)) {
- auto phrase = std::make_unique<PhraseQueryNode>();
+ auto phrase = std::make_unique<PhraseQueryNode>(factory.create(), ssIndex, arity);
auto dotPos = ssTerm.find('.');
- phrase->addChild(std::make_unique<QueryTerm>(factory.create(), ssTerm.substr(0, dotPos), ssIndex, TermType::WORD, normalize_mode));
- phrase->addChild(std::make_unique<QueryTerm>(factory.create(), ssTerm.substr(dotPos + 1), ssIndex, TermType::WORD, normalize_mode));
+ 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));
@@ -193,6 +192,9 @@ QueryNode::Build(const QueryNode * parent, const QueryNodeResultFactory & factor
case ParseItem::ITEM_WEIGHTED_SET:
qn = build_weighted_set_term(factory, queryRep);
break;
+ case ParseItem::ITEM_PHRASE:
+ qn = build_phrase_term(factory, queryRep);
+ break;
default:
skip_unknown(queryRep);
break;
@@ -281,6 +283,23 @@ QueryNode::build_weighted_set_term(const QueryNodeResultFactory& factory, Simple
return ws;
}
+std::unique_ptr<QueryNode>
+QueryNode::build_phrase_term(const QueryNodeResultFactory& factory, SimpleQueryStackDumpIterator& queryRep)
+{
+ auto phrase = std::make_unique<PhraseQueryNode>(factory.create(), queryRep.getIndexName(), queryRep.getArity());
+ auto arity = queryRep.getArity();
+ for (size_t i = 0; i < arity; ++i) {
+ queryRep.next();
+ auto qn = Build(phrase.get(), factory, queryRep, false);
+ auto qtp = dynamic_cast<QueryTerm*>(qn.get());
+ assert(qtp != nullptr);
+ qn.release();
+ std::unique_ptr<QueryTerm> qt(qtp);
+ phrase->add_term(std::move(qt));
+ }
+ return phrase;
+}
+
void
QueryNode::skip_unknown(SimpleQueryStackDumpIterator& queryRep)
{