| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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. |
| */ |
| |
| #include "paimon/read_context.h" |
| |
| #include <utility> |
| |
| #include "paimon/common/utils/path_util.h" |
| #include "paimon/core/utils/branch_manager.h" |
| #include "paimon/executor.h" |
| #include "paimon/memory/memory_pool.h" |
| #include "paimon/status.h" |
| |
| namespace paimon { |
| class Predicate; |
| |
| ReadContext::ReadContext( |
| const std::string& path, const std::string& branch, const std::vector<std::string>& read_schema, |
| const std::vector<int32_t>& read_field_ids, const std::shared_ptr<Predicate>& predicate, |
| bool enable_predicate_filter, bool enable_prefetch, uint32_t prefetch_batch_count, |
| uint32_t prefetch_max_parallel_num, bool enable_multi_thread_row_to_batch, |
| uint32_t row_to_batch_thread_number, const std::optional<std::string>& table_schema, |
| const std::shared_ptr<MemoryPool>& memory_pool, const std::shared_ptr<Executor>& executor, |
| const std::shared_ptr<FileSystem>& specific_file_system, |
| const std::map<std::string, std::string>& fs_scheme_to_identifier_map, |
| const std::map<std::string, std::string>& options, PrefetchCacheMode prefetch_cache_mode, |
| const CacheConfig& cache_config) |
| : path_(path), |
| branch_(branch), |
| read_schema_(read_schema), |
| read_field_ids_(read_field_ids), |
| predicate_(predicate), |
| enable_predicate_filter_(enable_predicate_filter), |
| enable_prefetch_(enable_prefetch), |
| prefetch_batch_count_(prefetch_batch_count), |
| prefetch_max_parallel_num_(prefetch_max_parallel_num), |
| enable_multi_thread_row_to_batch_(enable_multi_thread_row_to_batch), |
| row_to_batch_thread_number_(row_to_batch_thread_number), |
| table_schema_(table_schema), |
| memory_pool_(memory_pool), |
| executor_(executor), |
| specific_file_system_(specific_file_system), |
| fs_scheme_to_identifier_map_(fs_scheme_to_identifier_map), |
| options_(options), |
| prefetch_cache_mode_(prefetch_cache_mode), |
| cache_config_(cache_config) {} |
| |
| ReadContext::~ReadContext() = default; |
| |
| class ReadContextBuilder::Impl { |
| public: |
| friend class ReadContextBuilder; |
| void Reset() { |
| branch_ = BranchManager::DEFAULT_MAIN_BRANCH; |
| read_field_names_.clear(); |
| read_field_ids_.clear(); |
| fs_scheme_to_identifier_map_.clear(); |
| options_.clear(); |
| predicate_.reset(); |
| enable_predicate_filter_ = false; |
| enable_prefetch_ = false; |
| prefetch_cache_mode_ = PrefetchCacheMode::ALWAYS; |
| prefetch_batch_count_ = 600; |
| prefetch_max_parallel_num_ = 3; |
| enable_multi_thread_row_to_batch_ = false; |
| row_to_batch_thread_number_ = 1; |
| table_schema_ = std::nullopt; |
| memory_pool_ = GetDefaultPool(); |
| executor_.reset(); |
| specific_file_system_.reset(); |
| cache_config_ = CacheConfig(); |
| } |
| |
| private: |
| std::string path_; |
| std::string branch_ = BranchManager::DEFAULT_MAIN_BRANCH; |
| std::vector<std::string> read_field_names_; |
| std::vector<int32_t> read_field_ids_; |
| std::map<std::string, std::string> fs_scheme_to_identifier_map_; |
| std::map<std::string, std::string> options_; |
| std::shared_ptr<Predicate> predicate_; |
| bool enable_predicate_filter_ = false; |
| bool enable_prefetch_ = false; |
| uint32_t prefetch_batch_count_ = 600; |
| uint32_t prefetch_max_parallel_num_ = 3; |
| bool enable_multi_thread_row_to_batch_ = false; |
| uint32_t row_to_batch_thread_number_ = 1; |
| std::optional<std::string> table_schema_; |
| std::shared_ptr<MemoryPool> memory_pool_ = GetDefaultPool(); |
| std::shared_ptr<Executor> executor_; |
| std::shared_ptr<FileSystem> specific_file_system_; |
| PrefetchCacheMode prefetch_cache_mode_ = PrefetchCacheMode::ALWAYS; |
| CacheConfig cache_config_; |
| }; |
| |
| ReadContextBuilder::ReadContextBuilder(const std::string& path) |
| : impl_(std::make_unique<ReadContextBuilder::Impl>()) { |
| impl_->path_ = path; |
| } |
| |
| ReadContextBuilder::~ReadContextBuilder() = default; |
| |
| ReadContextBuilder::ReadContextBuilder(ReadContextBuilder&&) noexcept = default; |
| ReadContextBuilder& ReadContextBuilder::operator=(ReadContextBuilder&&) noexcept = default; |
| |
| ReadContextBuilder& ReadContextBuilder::AddOption(const std::string& key, |
| const std::string& value) { |
| impl_->options_[key] = value; |
| return *this; |
| } |
| |
| ReadContextBuilder& ReadContextBuilder::SetOptions(const std::map<std::string, std::string>& opts) { |
| impl_->options_ = opts; |
| return *this; |
| } |
| |
| ReadContextBuilder& ReadContextBuilder::SetReadSchema( |
| const std::vector<std::string>& read_field_names) { |
| impl_->read_field_names_ = read_field_names; |
| return *this; |
| } |
| |
| ReadContextBuilder& ReadContextBuilder::SetReadFieldIds( |
| const std::vector<int32_t>& read_field_ids) { |
| impl_->read_field_ids_ = read_field_ids; |
| return *this; |
| } |
| |
| ReadContextBuilder& ReadContextBuilder::SetPredicate(const std::shared_ptr<Predicate>& predicate) { |
| impl_->predicate_ = predicate; |
| return *this; |
| } |
| |
| ReadContextBuilder& ReadContextBuilder::EnablePredicateFilter(bool enabled) { |
| impl_->enable_predicate_filter_ = enabled; |
| return *this; |
| } |
| |
| ReadContextBuilder& ReadContextBuilder::EnablePrefetch(bool enabled) { |
| impl_->enable_prefetch_ = enabled; |
| return *this; |
| } |
| |
| ReadContextBuilder& ReadContextBuilder::SetPrefetchBatchCount(uint32_t batch_count) { |
| impl_->prefetch_batch_count_ = batch_count; |
| return *this; |
| } |
| |
| ReadContextBuilder& ReadContextBuilder::SetPrefetchMaxParallelNum(uint32_t max_parallel_num) { |
| impl_->prefetch_max_parallel_num_ = max_parallel_num; |
| return *this; |
| } |
| |
| ReadContextBuilder& ReadContextBuilder::EnableMultiThreadRowToBatch(bool enabled) { |
| impl_->enable_multi_thread_row_to_batch_ = enabled; |
| return *this; |
| } |
| |
| ReadContextBuilder& ReadContextBuilder::SetRowToBatchThreadNumber(uint32_t thread_number) { |
| impl_->row_to_batch_thread_number_ = thread_number; |
| return *this; |
| } |
| |
| ReadContextBuilder& ReadContextBuilder::WithMemoryPool( |
| const std::shared_ptr<MemoryPool>& memory_pool) { |
| impl_->memory_pool_ = memory_pool; |
| return *this; |
| } |
| |
| ReadContextBuilder& ReadContextBuilder::WithExecutor(const std::shared_ptr<Executor>& executor) { |
| impl_->executor_ = executor; |
| return *this; |
| } |
| |
| ReadContextBuilder& ReadContextBuilder::SetTableSchema(const std::string& table_schema) { |
| impl_->table_schema_ = table_schema; |
| return *this; |
| } |
| |
| ReadContextBuilder& ReadContextBuilder::WithBranch(const std::string& branch) { |
| impl_->branch_ = branch; |
| return *this; |
| } |
| |
| ReadContextBuilder& ReadContextBuilder::WithFileSystemSchemeToIdentifierMap( |
| const std::map<std::string, std::string>& fs_scheme_to_identifier_map) { |
| impl_->fs_scheme_to_identifier_map_ = fs_scheme_to_identifier_map; |
| return *this; |
| } |
| |
| ReadContextBuilder& ReadContextBuilder::WithFileSystem( |
| const std::shared_ptr<FileSystem>& file_system) { |
| impl_->specific_file_system_ = file_system; |
| return *this; |
| } |
| |
| ReadContextBuilder& ReadContextBuilder::SetPrefetchCacheMode(PrefetchCacheMode mode) { |
| impl_->prefetch_cache_mode_ = mode; |
| return *this; |
| } |
| |
| ReadContextBuilder& ReadContextBuilder::WithCacheConfig(const CacheConfig& cache_config) { |
| impl_->cache_config_ = cache_config; |
| return *this; |
| } |
| |
| Result<std::unique_ptr<ReadContext>> ReadContextBuilder::Finish() { |
| PAIMON_ASSIGN_OR_RAISE(impl_->path_, PathUtil::NormalizePath(impl_->path_)); |
| if (impl_->path_.empty()) { |
| return Status::Invalid("cannot read with empty table path"); |
| } |
| if (impl_->enable_prefetch_ && impl_->prefetch_batch_count_ <= 0) { |
| return Status::Invalid("prefetch batch count should be greater than 0"); |
| } |
| if (impl_->enable_prefetch_ && |
| impl_->prefetch_batch_count_ < impl_->prefetch_max_parallel_num_) { |
| return Status::Invalid( |
| "prefetch batch count should be greater than or equal to prefetch max parallel num"); |
| } |
| if (!impl_->executor_) { |
| // If the user do not set executor, create default executor by prefetch batch count |
| uint32_t thread_count = impl_->enable_prefetch_ ? impl_->prefetch_max_parallel_num_ : 1; |
| impl_->executor_ = CreateDefaultExecutor(thread_count); |
| } |
| |
| if (impl_->enable_multi_thread_row_to_batch_ && impl_->row_to_batch_thread_number_ <= 0) { |
| return Status::Invalid("row to batch thread number should be greater than 0"); |
| } |
| auto ctx = std::make_unique<ReadContext>( |
| impl_->path_, impl_->branch_, impl_->read_field_names_, impl_->read_field_ids_, |
| impl_->predicate_, impl_->enable_predicate_filter_, impl_->enable_prefetch_, |
| impl_->prefetch_batch_count_, impl_->prefetch_max_parallel_num_, |
| impl_->enable_multi_thread_row_to_batch_, impl_->row_to_batch_thread_number_, |
| impl_->table_schema_, impl_->memory_pool_, impl_->executor_, impl_->specific_file_system_, |
| impl_->fs_scheme_to_identifier_map_, impl_->options_, impl_->prefetch_cache_mode_, |
| impl_->cache_config_); |
| impl_->Reset(); |
| return ctx; |
| } |
| |
| } // namespace paimon |