diff options
author | Tor Egge <Tor.Egge@online.no> | 2024-02-02 14:20:03 +0100 |
---|---|---|
committer | Tor Egge <Tor.Egge@online.no> | 2024-02-02 14:20:03 +0100 |
commit | 41502ddacbfc64c2ef883f8be16b88d80a8f33c8 (patch) | |
tree | 393f8f3ede3ad501583ca1dbfa9464b632d00bfa /searchlib/src/vespa/searchlib/query/streaming/querynode.cpp | |
parent | d005a092da0e5f352a9ede03ab48989a1d5dbb2b (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.cpp | 27 |
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) { |