From a91ea35083d79d63e925e3d5fe8f4735b90a17ce Mon Sep 17 00:00:00 2001 From: Tor Egge Date: Mon, 18 Mar 2024 14:15:16 +0100 Subject: Change parent class of search::streaming::SameElementQueryNode from search::streaming::AndQueryNode to search:streaming::MultiTerm. --- .../vespa/searchlib/query/streaming/querynode.cpp | 28 ++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) (limited to 'searchlib/src/vespa/searchlib/query/streaming/querynode.cpp') 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 #include #include +#include #include #include #include @@ -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::build_same_element_term(const QueryNodeResultFactory& factory, SimpleQueryStackDumpIterator& queryRep, bool allow_rewrite) +{ + auto sen = std::make_unique(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(qn.get()); + assert(qtp != nullptr); + qn.release(); + std::unique_ptr qt(qtp); + sen->add_term(std::move(qt)); + } + return sen; +} + void QueryNode::skip_unknown(SimpleQueryStackDumpIterator& queryRep) { -- cgit v1.2.3 From 4b5012817431e6cb91a2d19235ffa768cf6cf88f Mon Sep 17 00:00:00 2001 From: Tor Egge Date: Mon, 18 Mar 2024 14:34:03 +0100 Subject: Rewrite is disabled for nodes below SameElementQueryNode. --- searchlib/src/vespa/searchlib/query/streaming/querynode.cpp | 10 ++++------ searchlib/src/vespa/searchlib/query/streaming/querynode.h | 2 +- 2 files changed, 5 insertions(+), 7 deletions(-) (limited to 'searchlib/src/vespa/searchlib/query/streaming/querynode.cpp') diff --git a/searchlib/src/vespa/searchlib/query/streaming/querynode.cpp b/searchlib/src/vespa/searchlib/query/streaming/querynode.cpp index 37f3b07058b..94a479fd2d3 100644 --- a/searchlib/src/vespa/searchlib/query/streaming/querynode.cpp +++ b/searchlib/src/vespa/searchlib/query/streaming/querynode.cpp @@ -27,9 +27,7 @@ namespace search::streaming { namespace { bool disableRewrite(const QueryNode * qn) { - return dynamic_cast (qn) || - dynamic_cast (qn) || - dynamic_cast(qn); + return dynamic_cast (qn); } bool possibleFloat(const QueryTerm & qt, const QueryTerm::string & term) { @@ -196,7 +194,7 @@ QueryNode::Build(const QueryNode * parent, const QueryNodeResultFactory & factor qn = build_equiv_term(factory, queryRep, allowRewrite); break; case ParseItem::ITEM_SAME_ELEMENT: - qn = build_same_element_term(factory, queryRep, allowRewrite); + qn = build_same_element_term(factory, queryRep); break; default: skip_unknown(queryRep); @@ -337,7 +335,7 @@ QueryNode::build_equiv_term(const QueryNodeResultFactory& factory, SimpleQuerySt } std::unique_ptr -QueryNode::build_same_element_term(const QueryNodeResultFactory& factory, SimpleQueryStackDumpIterator& queryRep, bool allow_rewrite) +QueryNode::build_same_element_term(const QueryNodeResultFactory& factory, SimpleQueryStackDumpIterator& queryRep) { auto sen = std::make_unique(factory.create(), queryRep.getIndexName(), queryRep.getArity()); auto arity = queryRep.getArity(); @@ -345,7 +343,7 @@ QueryNode::build_same_element_term(const QueryNodeResultFactory& factory, Simple sen->setUniqueId(queryRep.getUniqueId()); for (size_t i = 0; i < arity; ++i) { queryRep.next(); - auto qn = Build(sen.get(), factory, queryRep, allow_rewrite); + auto qn = Build(sen.get(), factory, queryRep, false); auto qtp = dynamic_cast(qn.get()); assert(qtp != nullptr); qn.release(); diff --git a/searchlib/src/vespa/searchlib/query/streaming/querynode.h b/searchlib/src/vespa/searchlib/query/streaming/querynode.h index c891cd44363..20e701e5c50 100644 --- a/searchlib/src/vespa/searchlib/query/streaming/querynode.h +++ b/searchlib/src/vespa/searchlib/query/streaming/querynode.h @@ -35,7 +35,7 @@ class QueryNode static std::unique_ptr build_weighted_set_term(const QueryNodeResultFactory& factory, SimpleQueryStackDumpIterator& queryRep); static std::unique_ptr build_phrase_term(const QueryNodeResultFactory& factory, SimpleQueryStackDumpIterator& queryRep); static std::unique_ptr build_equiv_term(const QueryNodeResultFactory& factory, SimpleQueryStackDumpIterator& queryRep, bool allow_rewrite); - static std::unique_ptr build_same_element_term(const QueryNodeResultFactory& factory, SimpleQueryStackDumpIterator& queryRep, bool allow_rewrite); + static std::unique_ptr build_same_element_term(const QueryNodeResultFactory& factory, SimpleQueryStackDumpIterator& queryRep); static void skip_unknown(SimpleQueryStackDumpIterator& queryRep); public: using UP = std::unique_ptr; -- cgit v1.2.3