diff --git a/include/paimon/global_index/global_index_reader.h b/include/paimon/global_index/global_index_reader.h index 510a0578..542e304b 100644 --- a/include/paimon/global_index/global_index_reader.h +++ b/include/paimon/global_index/global_index_reader.h @@ -38,12 +38,16 @@ namespace paimon { class PAIMON_EXPORT GlobalIndexReader : public FunctionVisitor> { public: /// VisitVectorSearch performs approximate vector similarity search. - /// @note `VisitVectorSearch` is thread-safe (not coroutine-safe) while other `VisitXXX` is not - /// thread-safe. /// @warning `VisitVectorSearch` may return error status when it is incorrectly invoked (e.g., /// BitmapGlobalIndexReader call `VisitVectorSearch`). virtual Result> VisitVectorSearch( const std::shared_ptr& vector_search) = 0; + + /// @return true if the reader is thread-safe; false otherwise. + virtual bool IsThreadSafe() const = 0; + + /// @return An identifier representing the index type. (e.g., "bitmap", "lumina"). + virtual std::string GetIndexType() const = 0; }; } // namespace paimon diff --git a/src/paimon/common/global_index/bitmap/bitmap_global_index.cpp b/src/paimon/common/global_index/bitmap/bitmap_global_index.cpp index 5301d1cc..f3e8d936 100644 --- a/src/paimon/common/global_index/bitmap/bitmap_global_index.cpp +++ b/src/paimon/common/global_index/bitmap/bitmap_global_index.cpp @@ -49,7 +49,7 @@ Result> BitmapGlobalIndex::CreateReader( -> Result> { return ToGlobalIndexResult(range_end, result); }; - return std::make_shared(reader, transform); + return std::make_shared(reader, transform); } Result> BitmapGlobalIndex::ToGlobalIndexResult( diff --git a/src/paimon/common/global_index/bitmap/bitmap_global_index.h b/src/paimon/common/global_index/bitmap/bitmap_global_index.h index 76026d6e..7c9d62f7 100644 --- a/src/paimon/common/global_index/bitmap/bitmap_global_index.h +++ b/src/paimon/common/global_index/bitmap/bitmap_global_index.h @@ -21,6 +21,7 @@ #include #include "paimon/common/file_index/bitmap/bitmap_file_index.h" +#include "paimon/common/global_index/wrap/file_index_reader_wrapper.h" #include "paimon/global_index/global_indexer.h" namespace paimon { @@ -46,4 +47,22 @@ class BitmapGlobalIndex : public GlobalIndexer { std::shared_ptr index_; }; +class BitmapGlobalIndexReader : public FileIndexReaderWrapper { + public: + BitmapGlobalIndexReader(const std::shared_ptr& reader, + const std::function>( + const std::shared_ptr&)>& transform) + : FileIndexReaderWrapper(reader, transform) {} + + static inline const char kIdentifier[] = "bitmap"; + + bool IsThreadSafe() const override { + return false; + } + + std::string GetIndexType() const override { + return kIdentifier; + } +}; + } // namespace paimon diff --git a/src/paimon/global_index/lucene/lucene_global_index.h b/src/paimon/global_index/lucene/lucene_global_index.h index 67dd27ec..786e775b 100644 --- a/src/paimon/global_index/lucene/lucene_global_index.h +++ b/src/paimon/global_index/lucene/lucene_global_index.h @@ -167,6 +167,14 @@ class LuceneGlobalIndexReader : public GlobalIndexReader { Result> VisitFullTextSearch( const std::shared_ptr& full_text_search); + bool IsThreadSafe() const override { + return false; + } + + std::string GetIndexType() const override { + return kIdentifier; + } + private: LuceneGlobalIndexReader(const std::wstring& wfield_name, int64_t range_end, const Lucene::IndexSearcherPtr& searcher) diff --git a/src/paimon/global_index/lumina/lumina_global_index.h b/src/paimon/global_index/lumina/lumina_global_index.h index 8187bcd0..0bc85347 100644 --- a/src/paimon/global_index/lumina/lumina_global_index.h +++ b/src/paimon/global_index/lumina/lumina_global_index.h @@ -28,6 +28,7 @@ #include "paimon/global_index/bitmap_global_index_result.h" #include "paimon/global_index/global_indexer.h" #include "paimon/global_index/lumina/lumina_memory_pool.h" +#include "paimon/global_index/lumina/lumina_utils.h" namespace paimon::lumina { /// @note When enabling the lumina global index in `paimon-cpp`, all configuration parameters @@ -122,6 +123,8 @@ class LuminaIndexReader : public GlobalIndexReader { [[maybe_unused]] auto status = searcher_->Close(); } + /// @note `VisitVectorSearch` is thread-safe (not coroutine-safe) while other `VisitXXX` is not + /// thread-safe. Result> VisitVectorSearch( const std::shared_ptr& vector_search) override; @@ -180,6 +183,14 @@ class LuminaIndexReader : public GlobalIndexReader { return BitmapGlobalIndexResult::FromRanges({Range(0, range_end_)}); } + bool IsThreadSafe() const override { + return true; + } + + std::string GetIndexType() const override { + return LuminaDefines::kIdentifier; + } + static Result GetIndexInfo(const GlobalIndexIOMeta& io_meta); private: