diff options
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.cpp | 51 |
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; +} + } |