1 // Copyright (C) 2019 Google LLC 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 #ifndef ICING_INDEX_ITERATOR_DOC_HIT_INFO_ITERATOR_AND_H_ 16 #define ICING_INDEX_ITERATOR_DOC_HIT_INFO_ITERATOR_AND_H_ 17 18 #include <cstdint> 19 #include <memory> 20 #include <string> 21 #include <utility> 22 #include <vector> 23 24 #include "icing/text_classifier/lib3/utils/base/status.h" 25 #include "icing/index/iterator/doc-hit-info-iterator.h" 26 27 namespace icing { 28 namespace lib { 29 30 // Given n iterators, will decide what the fastest And-iterator implementation 31 // will be. 32 std::unique_ptr<DocHitInfoIterator> CreateAndIterator( 33 std::vector<std::unique_ptr<DocHitInfoIterator>> iterators); 34 35 // Iterate over a logical AND of two child iterators. 36 class DocHitInfoIteratorAnd : public DocHitInfoIterator { 37 public: 38 // Set the shorter iterator to short_it to get performance benefits 39 // for when an underlying iterator has a more efficient AdvanceTo. 40 explicit DocHitInfoIteratorAnd(std::unique_ptr<DocHitInfoIterator> short_it, 41 std::unique_ptr<DocHitInfoIterator> long_it); 42 libtextclassifier3::Status Advance() override; 43 44 libtextclassifier3::StatusOr<TrimmedNode> TrimRightMostNode() && override; 45 GetCallStats()46 CallStats GetCallStats() const override { 47 return short_->GetCallStats() + long_->GetCallStats(); 48 } 49 50 std::string ToString() const override; 51 MapChildren(const ChildrenMapper & mapper)52 void MapChildren(const ChildrenMapper& mapper) override { 53 short_ = mapper(std::move(short_)); 54 long_ = mapper(std::move(long_)); 55 } 56 57 void PopulateMatchedTermsStats( 58 std::vector<TermMatchInfo>* matched_terms_stats, 59 SectionIdMask filtering_section_mask = kSectionIdMaskAll) const override { 60 if (doc_hit_info_.document_id() == kInvalidDocumentId) { 61 // Current hit isn't valid, return. 62 return; 63 } 64 short_->PopulateMatchedTermsStats(matched_terms_stats, 65 filtering_section_mask); 66 long_->PopulateMatchedTermsStats(matched_terms_stats, 67 filtering_section_mask); 68 } 69 70 private: 71 std::unique_ptr<DocHitInfoIterator> short_; 72 std::unique_ptr<DocHitInfoIterator> long_; 73 }; 74 75 // Iterate over a logical AND of multiple child iterators. 76 // NOTE: DocHitInfoIteratorAnd is a faster alternative to AND exactly 2 77 // iterators. 78 class DocHitInfoIteratorAndNary : public DocHitInfoIterator { 79 public: 80 explicit DocHitInfoIteratorAndNary( 81 std::vector<std::unique_ptr<DocHitInfoIterator>> iterators); 82 83 libtextclassifier3::Status Advance() override; 84 85 libtextclassifier3::StatusOr<TrimmedNode> TrimRightMostNode() && override; 86 87 CallStats GetCallStats() const override; 88 89 std::string ToString() const override; 90 MapChildren(const ChildrenMapper & mapper)91 void MapChildren(const ChildrenMapper& mapper) override { 92 for (int i = 0; i < iterators_.size(); ++i) { 93 iterators_[i] = mapper(std::move(iterators_[i])); 94 } 95 } 96 97 void PopulateMatchedTermsStats( 98 std::vector<TermMatchInfo>* matched_terms_stats, 99 SectionIdMask filtering_section_mask = kSectionIdMaskAll) const override { 100 if (doc_hit_info_.document_id() == kInvalidDocumentId) { 101 // Current hit isn't valid, return. 102 return; 103 } 104 for (size_t i = 0; i < iterators_.size(); ++i) { 105 iterators_.at(i)->PopulateMatchedTermsStats(matched_terms_stats, 106 filtering_section_mask); 107 } 108 } 109 110 private: 111 std::vector<std::unique_ptr<DocHitInfoIterator>> iterators_; 112 }; 113 114 } // namespace lib 115 } // namespace icing 116 117 #endif // ICING_INDEX_ITERATOR_DOC_HIT_INFO_ITERATOR_AND_H_ 118