aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib/src/vespa/searchlib/query/streaming/same_element_query_node.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'searchlib/src/vespa/searchlib/query/streaming/same_element_query_node.cpp')
-rw-r--r--searchlib/src/vespa/searchlib/query/streaming/same_element_query_node.cpp51
1 files changed, 42 insertions, 9 deletions
diff --git a/searchlib/src/vespa/searchlib/query/streaming/same_element_query_node.cpp b/searchlib/src/vespa/searchlib/query/streaming/same_element_query_node.cpp
index 49d5fb0f9fb..cd9c693ca1c 100644
--- a/searchlib/src/vespa/searchlib/query/streaming/same_element_query_node.cpp
+++ b/searchlib/src/vespa/searchlib/query/streaming/same_element_query_node.cpp
@@ -1,30 +1,36 @@
// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
#include "same_element_query_node.h"
+#include <vespa/searchlib/fef/itermdata.h>
+#include <vespa/searchlib/fef/matchdata.h>
#include <cassert>
namespace search::streaming {
+SameElementQueryNode::SameElementQueryNode(std::unique_ptr<QueryNodeResultBase> result_base, const string& index, uint32_t num_terms) noexcept
+ : MultiTerm(std::move(result_base), index, num_terms)
+{
+}
+
+SameElementQueryNode::~SameElementQueryNode() = default;
+
bool
SameElementQueryNode::evaluate() const {
HitList hl;
return ! evaluateHits(hl).empty();
}
-void
-SameElementQueryNode::addChild(QueryNode::UP child) {
- assert(dynamic_cast<const QueryTerm *>(child.get()) != nullptr);
- AndQueryNode::addChild(std::move(child));
-}
-
const HitList &
SameElementQueryNode::evaluateHits(HitList & hl) const
{
hl.clear();
- if ( !AndQueryNode::evaluate()) return hl;
-
+ const auto & children = get_terms();
+ for (auto& child : children) {
+ if ( ! child->evaluate() ) {
+ return hl;
+ }
+ }
HitList tmpHL;
- const auto & children = getChildren();
unsigned int numFields = children.size();
unsigned int currMatchCount = 0;
std::vector<unsigned int> indexVector(numFields, 0);
@@ -62,4 +68,31 @@ SameElementQueryNode::evaluateHits(HitList & hl) const
return hl;
}
+void
+SameElementQueryNode::unpack_match_data(uint32_t docid, const fef::ITermData& td, fef::MatchData& match_data, const fef::IIndexEnvironment&)
+{
+ HitList list;
+ const HitList & hit_list = evaluateHits(list);
+ if (!hit_list.empty()) {
+ auto num_fields = td.numFields();
+ /*
+ * Currently reports hit for all fields for query node instead of
+ * just the fields where the related subfields had matches.
+ */
+ for (size_t field_idx = 0; field_idx < num_fields; ++field_idx) {
+ auto& tfd = td.field(field_idx);
+ auto field_id = tfd.getFieldId();
+ auto tmd = match_data.resolveTermField(tfd.getHandle());
+ tmd->setFieldId(field_id);
+ tmd->reset(docid);
+ }
+ }
+}
+
+bool
+SameElementQueryNode::multi_index_terms() const noexcept
+{
+ return true;
+}
+
}