#include namespace { using namespace DB; std::unique_ptr makeIndexReader( const std::string & extension, MergeTreeIndexPtr index, MergeTreeData::DataPartPtr part, size_t marks_count, const MarkRanges & all_mark_ranges, MarkCache * mark_cache, UncompressedCache * uncompressed_cache, MergeTreeReaderSettings settings) { return std::make_unique( part->volume->getDisk(), part->getFullRelativePath() + index->getFileName(), extension, marks_count, all_mark_ranges, std::move(settings), mark_cache, uncompressed_cache, part->getFileSizeOrZero(index->getFileName() + extension), &part->index_granularity_info, ReadBufferFromFileBase::ProfileCallback{}, CLOCK_MONOTONIC_COARSE); } } namespace DB { MergeTreeIndexReader::MergeTreeIndexReader( MergeTreeIndexPtr index_, MergeTreeData::DataPartPtr part_, size_t marks_count_, const MarkRanges & all_mark_ranges_, MarkCache * mark_cache, UncompressedCache * uncompressed_cache, MergeTreeReaderSettings settings) : index(index_) { const std::string & path_prefix = part_->getFullRelativePath() + index->getFileName(); auto index_format = index->getDeserializedFormat(part_->volume->getDisk(), path_prefix); stream = makeIndexReader( index_format.extension, index_, part_, marks_count_, all_mark_ranges_, mark_cache, uncompressed_cache, std::move(settings)); version = index_format.version; size_t current_task_last_mark = 0; for (const auto mark_range : all_mark_ranges_) current_task_last_mark = std::max(current_task_last_mark, mark_range.end); stream->adjustForRange(0, current_task_last_mark); stream->seekToStart(); } MergeTreeIndexReader::~MergeTreeIndexReader() = default; void MergeTreeIndexReader::seek(size_t mark) { stream->seekToMark(mark); } MergeTreeIndexGranulePtr MergeTreeIndexReader::read() { auto granule = index->createIndexGranule(); granule->deserializeBinary(*stream->data_buffer, version); return granule; } }