From 1fbd4658790ef11337b1df5619e0ac6de22d6e11 Mon Sep 17 00:00:00 2001 From: Tor Egge Date: Mon, 5 Feb 2024 11:35:33 +0100 Subject: Non-const evaluate() and evaluateHits() member functions in streaming search query nodes. --- .../vespa/searchlib/query/streaming/multi_term.cpp | 2 +- .../vespa/searchlib/query/streaming/multi_term.h | 2 +- .../searchlib/query/streaming/near_query_node.cpp | 2 +- .../searchlib/query/streaming/near_query_node.h | 2 +- .../streaming/nearest_neighbor_query_node.cpp | 2 +- .../query/streaming/nearest_neighbor_query_node.h | 2 +- .../searchlib/query/streaming/onear_query_node.cpp | 2 +- .../searchlib/query/streaming/onear_query_node.h | 2 +- .../query/streaming/phrase_query_node.cpp | 4 +-- .../searchlib/query/streaming/phrase_query_node.h | 4 +-- .../src/vespa/searchlib/query/streaming/query.cpp | 18 ++++++------- .../src/vespa/searchlib/query/streaming/query.h | 18 ++++++------- .../vespa/searchlib/query/streaming/querynode.cpp | 2 +- .../vespa/searchlib/query/streaming/querynode.h | 4 +-- .../vespa/searchlib/query/streaming/queryterm.cpp | 4 +-- .../vespa/searchlib/query/streaming/queryterm.h | 4 +-- .../query/streaming/same_element_query_node.cpp | 10 ++++---- .../query/streaming/same_element_query_node.h | 4 +-- .../vespa/searchlib/query/streaming/wand_term.cpp | 2 +- .../vespa/searchlib/query/streaming/wand_term.h | 2 +- .../nearest_neighbor_field_searcher_test.cpp | 12 ++++----- .../searchvisitor/matching_elements_filler.cpp | 30 +++++++++++----------- 22 files changed, 67 insertions(+), 67 deletions(-) diff --git a/searchlib/src/vespa/searchlib/query/streaming/multi_term.cpp b/searchlib/src/vespa/searchlib/query/streaming/multi_term.cpp index f5a09892551..df6b2330ddd 100644 --- a/searchlib/src/vespa/searchlib/query/streaming/multi_term.cpp +++ b/searchlib/src/vespa/searchlib/query/streaming/multi_term.cpp @@ -43,7 +43,7 @@ MultiTerm::reset() } bool -MultiTerm::evaluate() const +MultiTerm::evaluate() { for (const auto& term : _terms) { if (term->evaluate()) return true; diff --git a/searchlib/src/vespa/searchlib/query/streaming/multi_term.h b/searchlib/src/vespa/searchlib/query/streaming/multi_term.h index 6f795c31356..5c146d1b916 100644 --- a/searchlib/src/vespa/searchlib/query/streaming/multi_term.h +++ b/searchlib/src/vespa/searchlib/query/streaming/multi_term.h @@ -31,7 +31,7 @@ public: void add_term(std::unique_ptr term); MultiTerm* as_multi_term() noexcept override { return this; } void reset() override; - bool evaluate() const override; + bool evaluate() override; virtual void unpack_match_data(uint32_t docid, const fef::ITermData& td, fef::MatchData& match_data) = 0; const std::vector>& get_terms() const noexcept { return _terms; } }; diff --git a/searchlib/src/vespa/searchlib/query/streaming/near_query_node.cpp b/searchlib/src/vespa/searchlib/query/streaming/near_query_node.cpp index a777841bd70..80b2609b0b3 100644 --- a/searchlib/src/vespa/searchlib/query/streaming/near_query_node.cpp +++ b/searchlib/src/vespa/searchlib/query/streaming/near_query_node.cpp @@ -47,7 +47,7 @@ NearQueryNode::evaluate_helper() const } bool -NearQueryNode::evaluate() const +NearQueryNode::evaluate() { return evaluate_helper(); } diff --git a/searchlib/src/vespa/searchlib/query/streaming/near_query_node.h b/searchlib/src/vespa/searchlib/query/streaming/near_query_node.h index 9258c3efe27..867f0d96194 100644 --- a/searchlib/src/vespa/searchlib/query/streaming/near_query_node.h +++ b/searchlib/src/vespa/searchlib/query/streaming/near_query_node.h @@ -17,7 +17,7 @@ protected: public: NearQueryNode() noexcept : AndQueryNode("NEAR"), _distance(0) { } explicit NearQueryNode(const char * opName) noexcept : AndQueryNode(opName), _distance(0) { } - bool evaluate() const override; + bool evaluate() override; void distance(size_t dist) { _distance = dist; } size_t distance() const { return _distance; } void visitMembers(vespalib::ObjectVisitor &visitor) const override; diff --git a/searchlib/src/vespa/searchlib/query/streaming/nearest_neighbor_query_node.cpp b/searchlib/src/vespa/searchlib/query/streaming/nearest_neighbor_query_node.cpp index 1317d1c0651..efbd6c935dc 100644 --- a/searchlib/src/vespa/searchlib/query/streaming/nearest_neighbor_query_node.cpp +++ b/searchlib/src/vespa/searchlib/query/streaming/nearest_neighbor_query_node.cpp @@ -22,7 +22,7 @@ NearestNeighborQueryNode::NearestNeighborQueryNode(std::unique_ptr(); } diff --git a/searchlib/src/vespa/searchlib/query/streaming/onear_query_node.h b/searchlib/src/vespa/searchlib/query/streaming/onear_query_node.h index 649496b62d9..754b3da2f7b 100644 --- a/searchlib/src/vespa/searchlib/query/streaming/onear_query_node.h +++ b/searchlib/src/vespa/searchlib/query/streaming/onear_query_node.h @@ -14,7 +14,7 @@ class ONearQueryNode : public NearQueryNode { public: ONearQueryNode() noexcept : NearQueryNode("ONEAR") { } - bool evaluate() const override; + bool evaluate() override; }; } diff --git a/searchlib/src/vespa/searchlib/query/streaming/phrase_query_node.cpp b/searchlib/src/vespa/searchlib/query/streaming/phrase_query_node.cpp index 0020089ef62..92016b9e50b 100644 --- a/searchlib/src/vespa/searchlib/query/streaming/phrase_query_node.cpp +++ b/searchlib/src/vespa/searchlib/query/streaming/phrase_query_node.cpp @@ -15,7 +15,7 @@ PhraseQueryNode::PhraseQueryNode(std::unique_ptr result_bas PhraseQueryNode::~PhraseQueryNode() = default; bool -PhraseQueryNode::evaluate() const +PhraseQueryNode::evaluate() { HitList hl; return ! evaluateHits(hl).empty(); @@ -62,7 +62,7 @@ PhraseQueryNode::as_multi_term() noexcept } const HitList & -PhraseQueryNode::evaluateHits(HitList & hl) const +PhraseQueryNode::evaluateHits(HitList & hl) { hl.clear(); _fieldInfo.clear(); diff --git a/searchlib/src/vespa/searchlib/query/streaming/phrase_query_node.h b/searchlib/src/vespa/searchlib/query/streaming/phrase_query_node.h index 594eab3deba..ab95528c151 100644 --- a/searchlib/src/vespa/searchlib/query/streaming/phrase_query_node.h +++ b/searchlib/src/vespa/searchlib/query/streaming/phrase_query_node.h @@ -15,8 +15,8 @@ class PhraseQueryNode : public MultiTerm public: PhraseQueryNode(std::unique_ptr result_base, const string& index, uint32_t num_terms); ~PhraseQueryNode() override; - bool evaluate() const override; - const HitList & evaluateHits(HitList & hl) const override; + bool evaluate() override; + const HitList & evaluateHits(HitList & hl) override; void getPhrases(QueryNodeRefList & tl) override; void getPhrases(ConstQueryNodeRefList & tl) const override; const QueryTerm::FieldInfo & getFieldInfo(size_t fid) const { return _fieldInfo[fid]; } diff --git a/searchlib/src/vespa/searchlib/query/streaming/query.cpp b/searchlib/src/vespa/searchlib/query/streaming/query.cpp index f1b3a804c50..afb5db481c6 100644 --- a/searchlib/src/vespa/searchlib/query/streaming/query.cpp +++ b/searchlib/src/vespa/searchlib/query/streaming/query.cpp @@ -31,7 +31,7 @@ QueryConnector::addChild(QueryNode::UP child) { QueryConnector::~QueryConnector() = default; const HitList & -QueryConnector::evaluateHits(HitList & hl) const +QueryConnector::evaluateHits(HitList & hl) { if (evaluate()) { hl.emplace_back(0, 0, 1, 1); @@ -121,17 +121,17 @@ QueryConnector::create(ParseItem::ItemType type) } bool -TrueNode::evaluate() const +TrueNode::evaluate() { return true; } -bool FalseNode::evaluate() const { +bool FalseNode::evaluate() { return false; } bool -AndQueryNode::evaluate() const +AndQueryNode::evaluate() { for (const auto & qn : getChildren()) { if ( ! qn->evaluate() ) return false; @@ -140,7 +140,7 @@ AndQueryNode::evaluate() const } bool -AndNotQueryNode::evaluate() const { +AndNotQueryNode::evaluate() { if (getChildren().empty()) return true; auto it = getChildren().begin(); auto mt = getChildren().end(); @@ -154,7 +154,7 @@ AndNotQueryNode::evaluate() const { } bool -OrQueryNode::evaluate() const { +OrQueryNode::evaluate() { for (const auto & qn : getChildren()) { if (qn->evaluate()) return true; } @@ -162,7 +162,7 @@ OrQueryNode::evaluate() const { } bool -RankWithQueryNode::evaluate() const { +RankWithQueryNode::evaluate() { bool first = true; bool firstOk = false; for (const auto & qn : getChildren()) { @@ -175,7 +175,7 @@ RankWithQueryNode::evaluate() const { } bool -EquivQueryNode::evaluate() const +EquivQueryNode::evaluate() { return OrQueryNode::evaluate(); } @@ -189,7 +189,7 @@ Query::Query(const QueryNodeResultFactory & factory, vespalib::stringref queryRe } bool -Query::evaluate() const { +Query::evaluate() { return valid() && _root->evaluate(); } diff --git a/searchlib/src/vespa/searchlib/query/streaming/query.h b/searchlib/src/vespa/searchlib/query/streaming/query.h index 5296d3a4f69..e3988f1dac8 100644 --- a/searchlib/src/vespa/searchlib/query/streaming/query.h +++ b/searchlib/src/vespa/searchlib/query/streaming/query.h @@ -15,7 +15,7 @@ class QueryConnector : public QueryNode public: explicit QueryConnector(const char * opName) noexcept; ~QueryConnector() override; - const HitList & evaluateHits(HitList & hl) const override; + const HitList & evaluateHits(HitList & hl) override; void reset() override; void getLeaves(QueryTermList & tl) override; void getLeaves(ConstQueryTermList & tl) const override; @@ -45,7 +45,7 @@ class TrueNode : public QueryConnector { public: TrueNode() noexcept : QueryConnector("AND") { } - bool evaluate() const override; + bool evaluate() override; }; /** False operator. Matches nothing. */ @@ -53,7 +53,7 @@ class FalseNode : public QueryConnector { public: FalseNode() noexcept : QueryConnector("AND") { } - bool evaluate() const override; + bool evaluate() override; }; /** @@ -64,7 +64,7 @@ class AndQueryNode : public QueryConnector public: AndQueryNode() noexcept : QueryConnector("AND") { } explicit AndQueryNode(const char * opName) noexcept : QueryConnector(opName) { } - bool evaluate() const override; + bool evaluate() override; bool isFlattenable(ParseItem::ItemType type) const override { return type == ParseItem::ITEM_AND; } }; @@ -75,7 +75,7 @@ class AndNotQueryNode : public QueryConnector { public: AndNotQueryNode() noexcept : QueryConnector("ANDNOT") { } - bool evaluate() const override; + bool evaluate() override; bool isFlattenable(ParseItem::ItemType) const override { return false; } }; @@ -87,7 +87,7 @@ class OrQueryNode : public QueryConnector public: OrQueryNode() noexcept : QueryConnector("OR") { } explicit OrQueryNode(const char * opName) noexcept : QueryConnector(opName) { } - bool evaluate() const override; + bool evaluate() override; bool isFlattenable(ParseItem::ItemType type) const override { return (type == ParseItem::ITEM_OR) || (type == ParseItem::ITEM_WEAK_AND); @@ -102,7 +102,7 @@ class RankWithQueryNode : public QueryConnector public: RankWithQueryNode() noexcept : QueryConnector("RANK") { } explicit RankWithQueryNode(const char * opName) noexcept : QueryConnector(opName) { } - bool evaluate() const override; + bool evaluate() override; }; @@ -113,7 +113,7 @@ class EquivQueryNode : public OrQueryNode { public: EquivQueryNode() noexcept : OrQueryNode("EQUIV") { } - bool evaluate() const override; + bool evaluate() override; bool isFlattenable(ParseItem::ItemType type) const override { return (type == ParseItem::ITEM_EQUIV); } @@ -142,7 +142,7 @@ public: /// Gives you all phrases of this tree. void getPhrases(QueryNodeRefList & tl); void getPhrases(ConstQueryNodeRefList & tl) const; - bool evaluate() const; + bool evaluate(); size_t depth() const; size_t width() const; bool valid() const { return _root.get() != nullptr; } diff --git a/searchlib/src/vespa/searchlib/query/streaming/querynode.cpp b/searchlib/src/vespa/searchlib/query/streaming/querynode.cpp index 69fe77d3fd5..bbfc2bab1b0 100644 --- a/searchlib/src/vespa/searchlib/query/streaming/querynode.cpp +++ b/searchlib/src/vespa/searchlib/query/streaming/querynode.cpp @@ -202,7 +202,7 @@ QueryNode::Build(const QueryNode * parent, const QueryNodeResultFactory & factor return qn; } -const HitList & QueryNode::evaluateHits(HitList & hl) const +const HitList & QueryNode::evaluateHits(HitList & hl) { return hl; } diff --git a/searchlib/src/vespa/searchlib/query/streaming/querynode.h b/searchlib/src/vespa/searchlib/query/streaming/querynode.h index 01974c70843..8f39d7fe4cf 100644 --- a/searchlib/src/vespa/searchlib/query/streaming/querynode.h +++ b/searchlib/src/vespa/searchlib/query/streaming/querynode.h @@ -40,10 +40,10 @@ class QueryNode virtual ~QueryNode() = default; /// This evalutes if the subtree starting here evaluates to true. - virtual bool evaluate() const = 0; + virtual bool evaluate() = 0; /// This return the hitList for this subtree. Does only give meaning in a /// phrase search or any other search that requires position info. - virtual const HitList & evaluateHits(HitList & hl) const; + virtual const HitList & evaluateHits(HitList & hl); /// Clears all the hitlists so the query tree can be reused. virtual void reset() = 0; /// Gives you all leafs of this tree. diff --git a/searchlib/src/vespa/searchlib/query/streaming/queryterm.cpp b/searchlib/src/vespa/searchlib/query/streaming/queryterm.cpp index b7e619cfe4c..ee13151045d 100644 --- a/searchlib/src/vespa/searchlib/query/streaming/queryterm.cpp +++ b/searchlib/src/vespa/searchlib/query/streaming/queryterm.cpp @@ -151,9 +151,9 @@ void QueryTerm::getPhrases(QueryNodeRefList & tl) { (void) tl; } void QueryTerm::getPhrases(ConstQueryNodeRefList & tl) const { (void) tl; } void QueryTerm::getLeaves(QueryTermList & tl) { tl.push_back(this); } void QueryTerm::getLeaves(ConstQueryTermList & tl) const { tl.push_back(this); } -bool QueryTerm::evaluate() const { return !_hitList.empty(); } +bool QueryTerm::evaluate() { return !_hitList.empty(); } void QueryTerm::reset() { _hitList.clear(); } -const HitList & QueryTerm::evaluateHits(HitList &) const { return _hitList; } +const HitList & QueryTerm::evaluateHits(HitList &) { return _hitList; } void QueryTerm::resizeFieldId(size_t fieldNo) { diff --git a/searchlib/src/vespa/searchlib/query/streaming/queryterm.h b/searchlib/src/vespa/searchlib/query/streaming/queryterm.h index 108cc1c148d..893b55088d1 100644 --- a/searchlib/src/vespa/searchlib/query/streaming/queryterm.h +++ b/searchlib/src/vespa/searchlib/query/streaming/queryterm.h @@ -64,8 +64,8 @@ public: QueryTerm(QueryTerm &&) = delete; QueryTerm & operator = (QueryTerm &&) = delete; ~QueryTerm() override; - bool evaluate() const override; - const HitList & evaluateHits(HitList & hl) const override; + bool evaluate() override; + const HitList & evaluateHits(HitList & hl) override; void reset() override; void getLeaves(QueryTermList & tl) override; void getLeaves(ConstQueryTermList & tl) const override; 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..56706adc94c 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 @@ -6,7 +6,7 @@ namespace search::streaming { bool -SameElementQueryNode::evaluate() const { +SameElementQueryNode::evaluate() { HitList hl; return ! evaluateHits(hl).empty(); } @@ -18,7 +18,7 @@ SameElementQueryNode::addChild(QueryNode::UP child) { } const HitList & -SameElementQueryNode::evaluateHits(HitList & hl) const +SameElementQueryNode::evaluateHits(HitList & hl) { hl.clear(); if ( !AndQueryNode::evaluate()) return hl; @@ -28,10 +28,10 @@ SameElementQueryNode::evaluateHits(HitList & hl) const unsigned int numFields = children.size(); unsigned int currMatchCount = 0; std::vector indexVector(numFields, 0); - auto curr = static_cast (children[currMatchCount].get()); + auto curr = static_cast (children[currMatchCount].get()); bool exhausted( curr->evaluateHits(tmpHL).empty()); for (; !exhausted; ) { - auto next = static_cast(children[currMatchCount+1].get()); + auto next = static_cast(children[currMatchCount+1].get()); unsigned int & currIndex = indexVector[currMatchCount]; unsigned int & nextIndex = indexVector[currMatchCount+1]; @@ -56,7 +56,7 @@ SameElementQueryNode::evaluateHits(HitList & hl) const currMatchCount = 0; indexVector[currMatchCount]++; } - curr = static_cast(children[currMatchCount].get()); + curr = static_cast(children[currMatchCount].get()); exhausted = (nextIndex >= nextIndexMax) || (indexVector[currMatchCount] >= curr->evaluateHits(tmpHL).size()); } return hl; diff --git a/searchlib/src/vespa/searchlib/query/streaming/same_element_query_node.h b/searchlib/src/vespa/searchlib/query/streaming/same_element_query_node.h index 8e675feb569..c91dadf9703 100644 --- a/searchlib/src/vespa/searchlib/query/streaming/same_element_query_node.h +++ b/searchlib/src/vespa/searchlib/query/streaming/same_element_query_node.h @@ -13,8 +13,8 @@ class SameElementQueryNode : public AndQueryNode { public: SameElementQueryNode() noexcept : AndQueryNode("SAME_ELEMENT") { } - bool evaluate() const override; - const HitList & evaluateHits(HitList & hl) const override; + bool evaluate() override; + const HitList & evaluateHits(HitList & hl) override; bool isFlattenable(ParseItem::ItemType) const override { return false; } void addChild(QueryNode::UP child) override; }; diff --git a/searchlib/src/vespa/searchlib/query/streaming/wand_term.cpp b/searchlib/src/vespa/searchlib/query/streaming/wand_term.cpp index a561adf5b42..931658f60cd 100644 --- a/searchlib/src/vespa/searchlib/query/streaming/wand_term.cpp +++ b/searchlib/src/vespa/searchlib/query/streaming/wand_term.cpp @@ -18,7 +18,7 @@ WandTerm::WandTerm(std::unique_ptr result_base, const strin WandTerm::~WandTerm() = default; bool -WandTerm::evaluate() const +WandTerm::evaluate() { if (_score_threshold <= 0.0) { return DotProductTerm::evaluate(); diff --git a/searchlib/src/vespa/searchlib/query/streaming/wand_term.h b/searchlib/src/vespa/searchlib/query/streaming/wand_term.h index 1b342834216..e3cfe168a8a 100644 --- a/searchlib/src/vespa/searchlib/query/streaming/wand_term.h +++ b/searchlib/src/vespa/searchlib/query/streaming/wand_term.h @@ -15,7 +15,7 @@ public: WandTerm(std::unique_ptr result_base, const string& index, uint32_t num_terms); ~WandTerm() override; void set_score_threshold(double value) { _score_threshold = value; } - bool evaluate() const override; + bool evaluate() override; void unpack_match_data(uint32_t docid, const fef::ITermData& td, fef::MatchData& match_data) override; }; diff --git a/streamingvisitors/src/tests/nearest_neighbor_field_searcher/nearest_neighbor_field_searcher_test.cpp b/streamingvisitors/src/tests/nearest_neighbor_field_searcher/nearest_neighbor_field_searcher_test.cpp index 5c1e15e0c5c..8feea75c502 100644 --- a/streamingvisitors/src/tests/nearest_neighbor_field_searcher/nearest_neighbor_field_searcher_test.cpp +++ b/streamingvisitors/src/tests/nearest_neighbor_field_searcher/nearest_neighbor_field_searcher_test.cpp @@ -41,7 +41,7 @@ struct MockQuery { return *this; } ~MockQuery() {} - const NearestNeighborQueryNode& get(size_t idx) const { + NearestNeighborQueryNode& get(size_t idx) { assert(idx < nodes.size()); return *nodes[idx]; } @@ -90,17 +90,17 @@ public: query.reset(); searcher.onValue(fv); } - void expect_match(const vespalib::string& spec_expr, double exp_square_distance, const NearestNeighborQueryNode& node) { + void expect_match(const vespalib::string& spec_expr, double exp_square_distance, NearestNeighborQueryNode& node) { match(spec_expr); expect_match(exp_square_distance, node); } - void expect_match(double exp_square_distance, const NearestNeighborQueryNode& node) { + void expect_match(double exp_square_distance, NearestNeighborQueryNode& node) { double exp_raw_score = 1.0 / (1.0 + std::sqrt(exp_square_distance)); EXPECT_TRUE(node.evaluate()); EXPECT_DOUBLE_EQ(exp_square_distance, node.get_distance().value()); EXPECT_DOUBLE_EQ(exp_raw_score, node.get_raw_score().value()); } - void expect_not_match(const vespalib::string& spec_expr, const NearestNeighborQueryNode& node) { + void expect_not_match(const vespalib::string& spec_expr, NearestNeighborQueryNode& node) { match(spec_expr); EXPECT_FALSE(node.evaluate()); } @@ -109,7 +109,7 @@ public: TEST_F(NearestNeighborSearcherTest, distance_heap_keeps_the_best_target_hits) { query.add("qt1", 2, 100.0); - const auto& node = query.get(0); + auto& node = query.get(0); set_query_tensor("qt1", "tensor(x[2]):[1,3]"); prepare(); @@ -140,7 +140,7 @@ TEST_F(NearestNeighborSearcherTest, distance_heap_keeps_the_best_target_hits) TEST_F(NearestNeighborSearcherTest, raw_score_calculated_with_distance_threshold) { query.add("qt1", 10, 3.0); - const auto& node = query.get(0); + auto& node = query.get(0); set_query_tensor("qt1", "tensor(x[2]):[1,3]"); prepare(); diff --git a/streamingvisitors/src/vespa/searchvisitor/matching_elements_filler.cpp b/streamingvisitors/src/vespa/searchvisitor/matching_elements_filler.cpp index 79bacda3f3b..8a50804c786 100644 --- a/streamingvisitors/src/vespa/searchvisitor/matching_elements_filler.cpp +++ b/streamingvisitors/src/vespa/searchvisitor/matching_elements_filler.cpp @@ -31,40 +31,40 @@ namespace { struct SubFieldTerm { vespalib::string _field_name; - const QueryTerm* _term; + QueryTerm* _term; public: - SubFieldTerm(vespalib::string field_name, const QueryTerm* term) noexcept + SubFieldTerm(vespalib::string field_name, QueryTerm* term) noexcept : _field_name(std::move(field_name)), _term(term) { } const vespalib::string& get_field_name() const { return _field_name; } - const QueryTerm& get_term() const { return *_term; } + QueryTerm& get_term() const { return *_term; } }; class Matcher { - std::vector _same_element_nodes; + std::vector _same_element_nodes; std::vector _sub_field_terms; vsm::FieldIdTSearcherMap& _field_searcher_map; HitList _hit_list; std::vector _elements; - void select_query_nodes(const MatchingElementsFields& fields, const QueryNode& query_node); + void select_query_nodes(const MatchingElementsFields& fields, QueryNode& query_node); void add_matching_elements(const vespalib::string& field_name, uint32_t doc_lid, const HitList& hit_list, MatchingElements& matching_elements); - void find_matching_elements(const SameElementQueryNode& same_element, uint32_t doc_lid, MatchingElements& matching_elements); - void find_matching_elements(const SubFieldTerm& sub_field_term, uint32_t doc_lid, MatchingElements& matching_elements); + void find_matching_elements(SameElementQueryNode& same_element, uint32_t doc_lid, MatchingElements& matching_elements); + void find_matching_elements(SubFieldTerm& sub_field_term, uint32_t doc_lid, MatchingElements& matching_elements); public: - Matcher(vsm::FieldIdTSearcherMap& field_searcher_map, const MatchingElementsFields& fields, const Query& query); + Matcher(vsm::FieldIdTSearcherMap& field_searcher_map, const MatchingElementsFields& fields, Query& query); ~Matcher(); bool empty() const { return _same_element_nodes.empty() && _sub_field_terms.empty(); } void find_matching_elements(const vsm::StorageDocument& doc, uint32_t doc_lid, MatchingElements& matching_elements); }; template -const T* as(const QueryNode& query_node) { return dynamic_cast(&query_node); } +T* as(QueryNode& query_node) { return dynamic_cast(&query_node); } -Matcher::Matcher(FieldIdTSearcherMap& field_searcher_map, const MatchingElementsFields& fields, const Query& query) +Matcher::Matcher(FieldIdTSearcherMap& field_searcher_map, const MatchingElementsFields& fields, Query& query) : _same_element_nodes(), _sub_field_terms(), _field_searcher_map(field_searcher_map), @@ -76,7 +76,7 @@ Matcher::Matcher(FieldIdTSearcherMap& field_searcher_map, const MatchingElements Matcher::~Matcher() = default; void -Matcher::select_query_nodes(const MatchingElementsFields& fields, const QueryNode& query_node) +Matcher::select_query_nodes(const MatchingElementsFields& fields, QueryNode& query_node) { if (auto same_element = as(query_node)) { if (fields.has_field(same_element->getIndex())) { @@ -121,7 +121,7 @@ Matcher::add_matching_elements(const vespalib::string& field_name, uint32_t doc_ } void -Matcher::find_matching_elements(const SameElementQueryNode& same_element, uint32_t doc_lid, MatchingElements& matching_elements) +Matcher::find_matching_elements(SameElementQueryNode& same_element, uint32_t doc_lid, MatchingElements& matching_elements) { const HitList& hit_list = same_element.evaluateHits(_hit_list); if (!hit_list.empty()) { @@ -130,7 +130,7 @@ Matcher::find_matching_elements(const SameElementQueryNode& same_element, uint32 } void -Matcher::find_matching_elements(const SubFieldTerm& sub_field_term, uint32_t doc_lid, MatchingElements& matching_elements) +Matcher::find_matching_elements(SubFieldTerm& sub_field_term, uint32_t doc_lid, MatchingElements& matching_elements) { const HitList& hit_list = sub_field_term.get_term().evaluateHits(_hit_list); if (!hit_list.empty()) { @@ -144,10 +144,10 @@ Matcher::find_matching_elements(const StorageDocument& doc, uint32_t doc_lid, Ma for (vsm::FieldSearcherContainer& fSearch : _field_searcher_map) { fSearch->search(doc); } - for (const auto* same_element : _same_element_nodes) { + for (auto* same_element : _same_element_nodes) { find_matching_elements(*same_element, doc_lid, matching_elements); } - for (const auto& term : _sub_field_terms) { + for (auto& term : _sub_field_terms) { find_matching_elements(term, doc_lid, matching_elements); } } -- cgit v1.2.3