diff options
author | Tor Egge <Tor.Egge@online.no> | 2024-03-18 14:15:16 +0100 |
---|---|---|
committer | Tor Egge <Tor.Egge@online.no> | 2024-03-18 14:15:16 +0100 |
commit | a91ea35083d79d63e925e3d5fe8f4735b90a17ce (patch) | |
tree | 06616a20ff3a0f90e0753dbc5a7f2d14a398c767 /searchlib/src/vespa/searchlib/query/streaming/querynode.cpp | |
parent | b199f8bf2bd09f0a2fcff3dfa85861e24f69d647 (diff) |
Change parent class of search::streaming::SameElementQueryNode 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 | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/searchlib/src/vespa/searchlib/query/streaming/querynode.cpp b/searchlib/src/vespa/searchlib/query/streaming/querynode.cpp index 611e8d67d76..37f3b07058b 100644 --- a/searchlib/src/vespa/searchlib/query/streaming/querynode.cpp +++ b/searchlib/src/vespa/searchlib/query/streaming/querynode.cpp @@ -11,6 +11,7 @@ #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/same_element_query_node.h> #include <vespa/searchlib/query/streaming/wand_term.h> #include <vespa/searchlib/query/streaming/weighted_set_term.h> #include <vespa/searchlib/query/tree/term_vector.h> @@ -49,7 +50,6 @@ QueryNode::Build(const QueryNode * parent, const QueryNodeResultFactory & factor case ParseItem::ITEM_OR: case ParseItem::ITEM_WEAK_AND: case ParseItem::ITEM_NOT: - case ParseItem::ITEM_SAME_ELEMENT: case ParseItem::ITEM_NEAR: case ParseItem::ITEM_ONEAR: case ParseItem::ITEM_RANK: @@ -61,9 +61,7 @@ QueryNode::Build(const QueryNode * parent, const QueryNodeResultFactory & factor if (nqn) { nqn->distance(queryRep.getNearDistance()); } - if ((type == ParseItem::ITEM_WEAK_AND) || - (type == ParseItem::ITEM_SAME_ELEMENT)) - { + if (type == ParseItem::ITEM_WEAK_AND) { qn->setIndex(queryRep.getIndexName()); } for (size_t i=0; i < arity; i++) { @@ -197,6 +195,9 @@ QueryNode::Build(const QueryNode * parent, const QueryNodeResultFactory & factor case ParseItem::ITEM_EQUIV: qn = build_equiv_term(factory, queryRep, allowRewrite); break; + case ParseItem::ITEM_SAME_ELEMENT: + qn = build_same_element_term(factory, queryRep, allowRewrite); + break; default: skip_unknown(queryRep); break; @@ -335,6 +336,25 @@ QueryNode::build_equiv_term(const QueryNodeResultFactory& factory, SimpleQuerySt return eqn; } +std::unique_ptr<QueryNode> +QueryNode::build_same_element_term(const QueryNodeResultFactory& factory, SimpleQueryStackDumpIterator& queryRep, bool allow_rewrite) +{ + auto sen = std::make_unique<SameElementQueryNode>(factory.create(), queryRep.getIndexName(), queryRep.getArity()); + auto arity = queryRep.getArity(); + sen->setWeight(queryRep.GetWeight()); + sen->setUniqueId(queryRep.getUniqueId()); + for (size_t i = 0; i < arity; ++i) { + queryRep.next(); + auto qn = Build(sen.get(), factory, queryRep, allow_rewrite); + auto qtp = dynamic_cast<QueryTerm*>(qn.get()); + assert(qtp != nullptr); + qn.release(); + std::unique_ptr<QueryTerm> qt(qtp); + sen->add_term(std::move(qt)); + } + return sen; +} + void QueryNode::skip_unknown(SimpleQueryStackDumpIterator& queryRep) { |