aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib/src/vespa/searchlib/query/streaming/querynode.cpp
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@online.no>2024-03-18 14:15:16 +0100
committerTor Egge <Tor.Egge@online.no>2024-03-18 14:15:16 +0100
commita91ea35083d79d63e925e3d5fe8f4735b90a17ce (patch)
tree06616a20ff3a0f90e0753dbc5a7f2d14a398c767 /searchlib/src/vespa/searchlib/query/streaming/querynode.cpp
parentb199f8bf2bd09f0a2fcff3dfa85861e24f69d647 (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.cpp28
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)
{