#pragma once #include #include #include #include #include namespace DB { /// Lightweight (in terms of logic) stream for reading single part from MergeTree class MergeTreeSequentialSource : public SourceWithProgress { public: MergeTreeSequentialSource( const MergeTreeData & storage_, const StorageMetadataPtr & metadata_snapshot_, MergeTreeData::DataPartPtr data_part_, Names columns_to_read_, bool read_with_direct_io_, bool take_column_types_from_storage, bool quiet = false); ~MergeTreeSequentialSource() override; String getName() const override { return "MergeTreeSequentialSource"; } size_t getCurrentMark() const { return current_mark; } size_t getCurrentRow() const { return current_row; } protected: Chunk generate() override; private: const MergeTreeData & storage; StorageMetadataPtr metadata_snapshot; /// Data part will not be removed if the pointer owns it MergeTreeData::DataPartPtr data_part; /// Columns we have to read (each Block from read will contain them) Names columns_to_read; /// Should read using direct IO bool read_with_direct_io; Poco::Logger * log = &Poco::Logger::get("MergeTreeSequentialSource"); std::shared_ptr mark_cache; using MergeTreeReaderPtr = std::unique_ptr; MergeTreeReaderPtr reader; /// current mark at which we stop reading size_t current_mark = 0; /// current row at which we stop reading size_t current_row = 0; private: /// Closes readers and unlock part locks void finish(); }; }