blob: 8ceff4476d168a0412f74f9a082d3faf539c310a [file] [log] [blame]
// Copyright (C) 2019 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef ICING_INDEX_ITERATOR_DOC_HIT_INFO_ITERATOR_AND_H_
#define ICING_INDEX_ITERATOR_DOC_HIT_INFO_ITERATOR_AND_H_
#include <cstdint>
#include <memory>
#include <string>
#include <vector>
#include "icing/text_classifier/lib3/utils/base/status.h"
#include "icing/index/iterator/doc-hit-info-iterator.h"
namespace icing {
namespace lib {
// Given n iterators, will decide what the fastest And-iterator implementation
// will be.
std::unique_ptr<DocHitInfoIterator> CreateAndIterator(
std::vector<std::unique_ptr<DocHitInfoIterator>> iterators);
// Iterate over a logical AND of two child iterators.
class DocHitInfoIteratorAnd : public DocHitInfoIterator {
public:
// Set the shorter iterator to short_it to get performance benefits
// for when an underlying iterator has a more efficient AdvanceTo.
explicit DocHitInfoIteratorAnd(std::unique_ptr<DocHitInfoIterator> short_it,
std::unique_ptr<DocHitInfoIterator> long_it);
libtextclassifier3::Status Advance() override;
int32_t GetNumBlocksInspected() const override;
int32_t GetNumLeafAdvanceCalls() const override;
std::string ToString() const override;
void PopulateMatchedTermsStats(
std::vector<TermMatchInfo> *matched_terms_stats,
SectionIdMask filtering_section_mask = kSectionIdMaskAll) const override {
if (doc_hit_info_.document_id() == kInvalidDocumentId) {
// Current hit isn't valid, return.
return;
}
short_->PopulateMatchedTermsStats(matched_terms_stats,
filtering_section_mask);
long_->PopulateMatchedTermsStats(matched_terms_stats,
filtering_section_mask);
}
private:
std::unique_ptr<DocHitInfoIterator> short_;
std::unique_ptr<DocHitInfoIterator> long_;
};
// Iterate over a logical AND of multiple child iterators.
// NOTE: DocHitInfoIteratorAnd is a faster alternative to AND exactly 2
// iterators.
class DocHitInfoIteratorAndNary : public DocHitInfoIterator {
public:
explicit DocHitInfoIteratorAndNary(
std::vector<std::unique_ptr<DocHitInfoIterator>> iterators);
libtextclassifier3::Status Advance() override;
int32_t GetNumBlocksInspected() const override;
int32_t GetNumLeafAdvanceCalls() const override;
std::string ToString() const override;
void PopulateMatchedTermsStats(
std::vector<TermMatchInfo> *matched_terms_stats,
SectionIdMask filtering_section_mask = kSectionIdMaskAll) const override {
if (doc_hit_info_.document_id() == kInvalidDocumentId) {
// Current hit isn't valid, return.
return;
}
for (size_t i = 0; i < iterators_.size(); ++i) {
iterators_.at(i)->PopulateMatchedTermsStats(matched_terms_stats,
filtering_section_mask);
}
}
private:
std::vector<std::unique_ptr<DocHitInfoIterator>> iterators_;
};
} // namespace lib
} // namespace icing
#endif // ICING_INDEX_ITERATOR_DOC_HIT_INFO_ITERATOR_AND_H_