You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@paimon.apache.org by gi...@apache.org on 2026/10/08 05:11:26 UTC

(paimon-cpp) 01/01: Publish docs from commit 78c4d98d0f2d5109035e06d8adff8750ba406bd4

This is an automated email from the ASF dual-hosted git repository.

github-actions[bot] pushed a commit to branch gh-pages
in repository https://gitbox.apache.org/repos/asf/paimon-cpp.git

commit 6dd4bba0382db3f2bbb5fdecb1772b0b470e7a59
Author: GitHub Actions <ac...@github.com>
AuthorDate: Thu Oct 8 05:11:16 2026 +0000

    Publish docs from commit 78c4d98d0f2d5109035e06d8adff8750ba406bd4
---
 .nojekyll                                          |    0
 _images/file-layout.png                            |  Bin 0 -> 309410 bytes
 _images/prefetch.svg                               |    4 +
 _images/sorted-runs.png                            |  Bin 0 -> 181236 bytes
 _sources/api.rst.txt                               |   41 +
 _sources/api/catalog.rst.txt                       |   32 +
 _sources/api/clean.rst.txt                         |   37 +
 _sources/api/commit.rst.txt                        |   41 +
 _sources/api/data_types.rst.txt                    |   37 +
 _sources/api/defs.rst.txt                          |   31 +
 _sources/api/executor.rst.txt                      |   37 +
 _sources/api/file_format.rst.txt                   |   57 +
 _sources/api/file_index.rst.txt                    |   53 +
 _sources/api/file_system.rst.txt                   |   51 +
 _sources/api/format_table.rst.txt                  |   52 +
 _sources/api/global_index.rst.txt                  |   77 +
 _sources/api/io.rst.txt                            |   41 +
 _sources/api/memory.rst.txt                        |   37 +
 _sources/api/predicate.rst.txt                     |   52 +
 _sources/api/read.rst.txt                          |   43 +
 _sources/api/scan.rst.txt                          |   79 +
 _sources/api/write.rst.txt                         |   45 +
 _sources/basic_concepts.rst.txt                    |   83 +
 _sources/build_system.rst.txt                      |  123 +
 _sources/building.rst.txt                          |  374 ++
 _sources/documentations.rst.txt                    |   68 +
 _sources/examples/benchmark.rst.txt                |  213 +
 _sources/examples/clean.rst.txt                    |   26 +
 _sources/examples/index.rst.txt                    |   26 +
 _sources/examples/write_commit_scan_read.rst.txt   |   26 +
 _sources/getting_started.rst.txt                   |   37 +
 _sources/index.rst.txt                             |  108 +
 _sources/user_guide.rst.txt                        |   47 +
 _sources/user_guide/append_only_table.rst.txt      |   26 +
 _sources/user_guide/arrow.rst.txt                  |  125 +
 _sources/user_guide/catalog.rst.txt                |  417 ++
 _sources/user_guide/clean.rst.txt                  |  169 +
 _sources/user_guide/commit.rst.txt                 |  126 +
 _sources/user_guide/compaction.rst.txt             |  308 ++
 _sources/user_guide/data_types.rst.txt             |  319 ++
 _sources/user_guide/format_table.rst.txt           |  355 ++
 _sources/user_guide/global_index.rst.txt           |  108 +
 _sources/user_guide/manifest.rst.txt               |  132 +
 _sources/user_guide/manifest_cache.rst.txt         |   96 +
 _sources/user_guide/manifest_entry_cache.rst.txt   |   91 +
 _sources/user_guide/metrics.rst.txt                |  116 +
 _sources/user_guide/parquet_metadata_cache.rst.txt |  143 +
 _sources/user_guide/prefetch.rst.txt               |   72 +
 .../user_guide/primary_key_global_index.rst.txt    |   93 +
 _sources/user_guide/primary_key_table.rst.txt      |  154 +
 _sources/user_guide/read.rst.txt                   |  352 ++
 _sources/user_guide/schema.rst.txt                 |  111 +
 _sources/user_guide/snapshot.rst.txt               |   68 +
 _sources/user_guide/system_tables.rst.txt          |   70 +
 _sources/user_guide/write.rst.txt                  |  262 ++
 _sphinx_design_static/design-tabs.js               |  101 +
 _sphinx_design_static/sphinx-design.min.css        |    1 +
 _static/base-stemmer.js                            |  476 ++
 _static/basic.css                                  |  906 ++++
 _static/check-solid.svg                            |    4 +
 _static/clipboard.min.js                           |    7 +
 _static/copy-button.svg                            |    5 +
 _static/copybutton.css                             |   94 +
 _static/copybutton.js                              |  248 +
 _static/copybutton_funcs.js                        |   73 +
 _static/design-tabs.js                             |  101 +
 _static/doctools.js                                |  150 +
 _static/documentation_options.js                   |   13 +
 _static/english-stemmer.js                         | 1066 +++++
 _static/file-layout.png                            |  Bin 0 -> 309410 bytes
 _static/file.png                                   |  Bin 0 -> 286 bytes
 _static/language_data.js                           |   13 +
 _static/minus.png                                  |  Bin 0 -> 90 bytes
 _static/plus.png                                   |  Bin 0 -> 90 bytes
 _static/prefetch.svg                               |    4 +
 _static/pygments.css                               |  152 +
 _static/scripts/bootstrap.js                       |    3 +
 _static/scripts/bootstrap.js.LICENSE.txt           |    5 +
 _static/scripts/bootstrap.js.map                   |    1 +
 _static/scripts/fontawesome.js                     |    3 +
 _static/scripts/fontawesome.js.LICENSE.txt         |    5 +
 _static/scripts/fontawesome.js.map                 |    1 +
 _static/scripts/pydata-sphinx-theme.js             |    2 +
 _static/scripts/pydata-sphinx-theme.js.map         |    1 +
 _static/searchtools.js                             |  693 +++
 _static/sorted-runs.png                            |  Bin 0 -> 181236 bytes
 _static/sphinx-design.min.css                      |    1 +
 _static/sphinx_highlight.js                        |  159 +
 _static/styles/pydata-sphinx-theme.css             |   27 +
 _static/styles/pydata-sphinx-theme.css.map         |    1 +
 _static/styles/theme.css                           |    2 +
 _static/theme_overrides.css                        |   86 +
 .../fontawesome/webfonts/fa-brands-400.woff2       |  Bin 0 -> 110088 bytes
 .../fontawesome/webfonts/fa-regular-400.woff2      |  Bin 0 -> 18924 bytes
 .../vendor/fontawesome/webfonts/fa-solid-900.woff2 |  Bin 0 -> 114740 bytes
 _static/versions.json                              |    7 +
 _static/webpack-macros.html                        |   24 +
 api.html                                           |  819 ++++
 api/catalog.html                                   | 1061 +++++
 api/clean.html                                     |  850 ++++
 api/commit.html                                    | 1331 ++++++
 api/data_types.html                                | 1058 +++++
 api/defs.html                                      | 2041 +++++++++
 api/executor.html                                  |  632 +++
 api/file_format.html                               | 1087 +++++
 api/file_index.html                                | 1169 +++++
 api/file_system.html                               | 1229 +++++
 api/format_table.html                              |  797 ++++
 api/global_index.html                              | 1593 +++++++
 api/io.html                                        | 1027 +++++
 api/memory.html                                    | 1007 ++++
 api/predicate.html                                 | 1386 ++++++
 api/read.html                                      | 1556 +++++++
 api/scan.html                                      | 1263 +++++
 api/write.html                                     | 1416 ++++++
 apidoc/html/abi_8h.html                            |  175 +
 apidoc/html/abi_8h_source.html                     |  192 +
 apidoc/html/annotated.html                         |  271 ++
 apidoc/html/api_8h.html                            |  120 +
 apidoc/html/api_8h_source.html                     |  165 +
 apidoc/html/append__compact__coordinator_8h.html   |  109 +
 .../append__compact__coordinator_8h_source.html    |  144 +
 .../html/arrow__realtime__store__factory_8h.html   |  105 +
 .../arrow__realtime__store__factory_8h_source.html |  132 +
 apidoc/html/batch__reader_8h.html                  |  110 +
 apidoc/html/batch__reader_8h_source.html           |  168 +
 apidoc/html/bc_s.png                               |  Bin 0 -> 676 bytes
 apidoc/html/bc_sd.png                              |  Bin 0 -> 635 bytes
 apidoc/html/bitmap__global__index__result_8h.html  |  113 +
 .../bitmap__global__index__result_8h_source.html   |  215 +
 apidoc/html/bitmap__index__result_8h.html          |  111 +
 apidoc/html/bitmap__index__result_8h_source.html   |  169 +
 .../bitmap__scored__global__index__result_8h.html  |  113 +
 ...p__scored__global__index__result_8h_source.html |  222 +
 apidoc/html/blob_8h.html                           |  114 +
 apidoc/html/blob_8h_source.html                    |  186 +
 apidoc/html/blob__descriptor_8h.html               |  111 +
 apidoc/html/blob__descriptor_8h_source.html        |  201 +
 apidoc/html/blob__view_8h.html                     |  112 +
 apidoc/html/blob__view_8h_source.html              |  161 +
 apidoc/html/bucket__function__type_8h.html         |  117 +
 apidoc/html/bucket__function__type_8h_source.html  |  150 +
 apidoc/html/bucket__id__calculator_8h.html         |  112 +
 apidoc/html/bucket__id__calculator_8h_source.html  |  183 +
 apidoc/html/buffered__input__stream_8h.html        |  112 +
 apidoc/html/buffered__input__stream_8h_source.html |  185 +
 apidoc/html/byte__array__input__stream_8h.html     |  111 +
 .../html/byte__array__input__stream_8h_source.html |  187 +
 apidoc/html/byte__order_8h.html                    |  113 +
 apidoc/html/byte__order_8h_source.html             |  155 +
 apidoc/html/bytes_8h.html                          |  109 +
 apidoc/html/bytes_8h_source.html                   |  189 +
 apidoc/html/cache_8h.html                          |  131 +
 apidoc/html/cache_8h_source.html                   |  244 +
 apidoc/html/catalog_8h.html                        |  123 +
 apidoc/html/catalog_8h_source.html                 |  255 ++
 apidoc/html/catalog__options_8h.html               |  105 +
 apidoc/html/catalog__options_8h_source.html        |  155 +
 apidoc/html/classes.html                           |  142 +
 ...mon_1_1_append_compact_coordinator-members.html |   92 +
 ...classpaimon_1_1_append_compact_coordinator.html |  236 +
 ...n_1_1_arrow_realtime_store_factory-members.html |   91 +
 ...asspaimon_1_1_arrow_realtime_store_factory.html |  149 +
 ...lasspaimon_1_1_arrow_realtime_store_factory.png |  Bin 0 -> 849 bytes
 .../classpaimon_1_1_basic_file_status-members.html |   95 +
 apidoc/html/classpaimon_1_1_basic_file_status.html |  294 ++
 .../html/classpaimon_1_1_batch_reader-members.html |  100 +
 apidoc/html/classpaimon_1_1_batch_reader.html      |  437 ++
 apidoc/html/classpaimon_1_1_batch_reader.png       |  Bin 0 -> 1116 bytes
 ...asspaimon_1_1_big_int_column_stats-members.html |  108 +
 .../html/classpaimon_1_1_big_int_column_stats.html |  230 +
 .../html/classpaimon_1_1_big_int_column_stats.png  |  Bin 0 -> 689 bytes
 ...mon_1_1_bitmap_global_index_result-members.html |  107 +
 ...classpaimon_1_1_bitmap_global_index_result.html |  515 +++
 .../classpaimon_1_1_bitmap_global_index_result.png |  Bin 0 -> 1516 bytes
 ...p_global_index_result_1_1_iterator-members.html |   95 +
 ..._1_bitmap_global_index_result_1_1_iterator.html |  265 ++
 ...1_1_bitmap_global_index_result_1_1_iterator.png |  Bin 0 -> 872 bytes
 ...lasspaimon_1_1_bitmap_index_result-members.html |  103 +
 .../html/classpaimon_1_1_bitmap_index_result.html  |  424 ++
 .../html/classpaimon_1_1_bitmap_index_result.png   |  Bin 0 -> 1425 bytes
 ..._bitmap_scored_global_index_result-members.html |  106 +
 ...imon_1_1_bitmap_scored_global_index_result.html |  499 ++
 ...aimon_1_1_bitmap_scored_global_index_result.png |  Bin 0 -> 2064 bytes
 ...l_index_result_1_1_scored_iterator-members.html |   97 +
 ...ed_global_index_result_1_1_scored_iterator.html |  327 ++
 ...red_global_index_result_1_1_scored_iterator.png |  Bin 0 -> 1172 bytes
 apidoc/html/classpaimon_1_1_blob-members.html      |  100 +
 apidoc/html/classpaimon_1_1_blob.html              |  512 +++
 .../classpaimon_1_1_blob_descriptor-members.html   |  105 +
 apidoc/html/classpaimon_1_1_blob_descriptor.html   |  626 +++
 ...asspaimon_1_1_boolean_column_stats-members.html |  108 +
 .../html/classpaimon_1_1_boolean_column_stats.html |  230 +
 .../html/classpaimon_1_1_boolean_column_stats.png  |  Bin 0 -> 700 bytes
 ...asspaimon_1_1_bucket_id_calculator-members.html |   99 +
 .../html/classpaimon_1_1_bucket_id_calculator.html |  546 +++
 ...sspaimon_1_1_buffered_input_stream-members.html |  111 +
 .../classpaimon_1_1_buffered_input_stream.html     |  830 ++++
 .../html/classpaimon_1_1_buffered_input_stream.png |  Bin 0 -> 993 bytes
 ...paimon_1_1_byte_array_input_stream-members.html |  106 +
 .../classpaimon_1_1_byte_array_input_stream.html   |  638 +++
 .../classpaimon_1_1_byte_array_input_stream.png    |  Bin 0 -> 1030 bytes
 apidoc/html/classpaimon_1_1_bytes-members.html     |  110 +
 apidoc/html/classpaimon_1_1_bytes.html             |  760 +++
 apidoc/html/classpaimon_1_1_cache-members.html     |   95 +
 apidoc/html/classpaimon_1_1_cache.html             |  285 ++
 .../html/classpaimon_1_1_cache_config-members.html |  104 +
 apidoc/html/classpaimon_1_1_cache_config.html      |  541 +++
 apidoc/html/classpaimon_1_1_cache_key-members.html |   98 +
 apidoc/html/classpaimon_1_1_cache_key.html         |  401 ++
 .../html/classpaimon_1_1_cache_value-members.html  |   96 +
 apidoc/html/classpaimon_1_1_cache_value.html       |  261 ++
 apidoc/html/classpaimon_1_1_catalog-members.html   |  116 +
 apidoc/html/classpaimon_1_1_catalog.html           | 1180 +++++
 .../classpaimon_1_1_clean_context-members.html     |  105 +
 apidoc/html/classpaimon_1_1_clean_context.html     |  547 +++
 ...sspaimon_1_1_clean_context_builder-members.html |  100 +
 .../classpaimon_1_1_clean_context_builder.html     |  431 ++
 .../html/classpaimon_1_1_column_stats-members.html |  105 +
 apidoc/html/classpaimon_1_1_column_stats.html      |  801 ++++
 apidoc/html/classpaimon_1_1_column_stats.png       |  Bin 0 -> 5667 bytes
 .../classpaimon_1_1_commit_context-members.html    |  118 +
 apidoc/html/classpaimon_1_1_commit_context.html    |  982 ++++
 ...spaimon_1_1_commit_context_builder-members.html |  104 +
 .../classpaimon_1_1_commit_context_builder.html    |  582 +++
 .../classpaimon_1_1_commit_message-members.html    |   96 +
 apidoc/html/classpaimon_1_1_commit_message.html    |  430 ++
 ...classpaimon_1_1_compound_predicate-members.html |   98 +
 .../html/classpaimon_1_1_compound_predicate.html   |  358 ++
 apidoc/html/classpaimon_1_1_compound_predicate.png |  Bin 0 -> 776 bytes
 .../html/classpaimon_1_1_count_reader-members.html |   91 +
 apidoc/html/classpaimon_1_1_count_reader.html      |  162 +
 ...lasspaimon_1_1_credential_provider-members.html |   92 +
 .../html/classpaimon_1_1_credential_provider.html  |  209 +
 ...on_1_1_credential_provider_factory-members.html |   93 +
 ...lasspaimon_1_1_credential_provider_factory.html |  214 +
 ...classpaimon_1_1_credential_provider_factory.png |  Bin 0 -> 770 bytes
 .../classpaimon_1_1_data_input_stream-members.html |  103 +
 apidoc/html/classpaimon_1_1_data_input_stream.html |  544 +++
 .../html/classpaimon_1_1_data_schema-members.html  |  103 +
 apidoc/html/classpaimon_1_1_data_schema.html       |  376 ++
 apidoc/html/classpaimon_1_1_data_schema.png        |  Bin 0 -> 560 bytes
 .../html/classpaimon_1_1_data_split-members.html   |   94 +
 apidoc/html/classpaimon_1_1_data_split.html        |  194 +
 apidoc/html/classpaimon_1_1_data_split.png         |  Bin 0 -> 545 bytes
 apidoc/html/classpaimon_1_1_database-members.html  |   93 +
 apidoc/html/classpaimon_1_1_database.html          |  225 +
 .../classpaimon_1_1_date_column_stats-members.html |  108 +
 apidoc/html/classpaimon_1_1_date_column_stats.html |  230 +
 apidoc/html/classpaimon_1_1_date_column_stats.png  |  Bin 0 -> 674 bytes
 apidoc/html/classpaimon_1_1_decimal-members.html   |  124 +
 apidoc/html/classpaimon_1_1_decimal.html           | 1111 +++++
 ...asspaimon_1_1_decimal_column_stats-members.html |  110 +
 .../html/classpaimon_1_1_decimal_column_stats.html |  284 ++
 .../html/classpaimon_1_1_decimal_column_stats.png  |  Bin 0 -> 698 bytes
 ...sspaimon_1_1_direct_writer_builder-members.html |   94 +
 .../classpaimon_1_1_direct_writer_builder.html     |  178 +
 .../html/classpaimon_1_1_direct_writer_builder.png |  Bin 0 -> 716 bytes
 ...lasspaimon_1_1_double_column_stats-members.html |  108 +
 .../html/classpaimon_1_1_double_column_stats.html  |  230 +
 .../html/classpaimon_1_1_double_column_stats.png   |  Bin 0 -> 701 bytes
 apidoc/html/classpaimon_1_1_executor-members.html  |   93 +
 apidoc/html/classpaimon_1_1_executor.html          |  231 +
 apidoc/html/classpaimon_1_1_factory-members.html   |   91 +
 apidoc/html/classpaimon_1_1_factory.html           |  173 +
 apidoc/html/classpaimon_1_1_factory.png            |  Bin 0 -> 1940 bytes
 .../classpaimon_1_1_factory_creator-members.html   |  102 +
 apidoc/html/classpaimon_1_1_factory_creator.html   |  341 ++
 apidoc/html/classpaimon_1_1_factory_creator.png    |  Bin 0 -> 1195 bytes
 .../classpaimon_1_1_file_batch_reader-members.html |  106 +
 apidoc/html/classpaimon_1_1_file_batch_reader.html |  434 ++
 apidoc/html/classpaimon_1_1_file_batch_reader.png  |  Bin 0 -> 1111 bytes
 .../html/classpaimon_1_1_file_format-members.html  |   94 +
 apidoc/html/classpaimon_1_1_file_format.html       |  257 ++
 ...lasspaimon_1_1_file_format_factory-members.html |   94 +
 .../html/classpaimon_1_1_file_format_factory.html  |  223 +
 .../html/classpaimon_1_1_file_format_factory.png   |  Bin 0 -> 685 bytes
 .../classpaimon_1_1_file_index_format-members.html |   95 +
 apidoc/html/classpaimon_1_1_file_index_format.html |  362 ++
 ...n_1_1_file_index_format_1_1_reader-members.html |   91 +
 ...asspaimon_1_1_file_index_format_1_1_reader.html |  181 +
 ...n_1_1_file_index_format_1_1_writer-members.html |   92 +
 ...asspaimon_1_1_file_index_format_1_1_writer.html |  193 +
 .../classpaimon_1_1_file_index_reader-members.html |  104 +
 apidoc/html/classpaimon_1_1_file_index_reader.html |  577 +++
 apidoc/html/classpaimon_1_1_file_index_reader.png  |  Bin 0 -> 1111 bytes
 .../classpaimon_1_1_file_index_result-members.html |   96 +
 apidoc/html/classpaimon_1_1_file_index_result.html |  330 ++
 apidoc/html/classpaimon_1_1_file_index_result.png  |  Bin 0 -> 2411 bytes
 .../classpaimon_1_1_file_index_writer-members.html |   92 +
 apidoc/html/classpaimon_1_1_file_index_writer.html |  202 +
 .../html/classpaimon_1_1_file_indexer-members.html |   92 +
 apidoc/html/classpaimon_1_1_file_indexer.html      |  251 +
 ...asspaimon_1_1_file_indexer_factory-members.html |   94 +
 .../html/classpaimon_1_1_file_indexer_factory.html |  222 +
 .../html/classpaimon_1_1_file_indexer_factory.png  |  Bin 0 -> 701 bytes
 .../classpaimon_1_1_file_meta_utils-members.html   |   92 +
 apidoc/html/classpaimon_1_1_file_meta_utils.html   |  241 +
 .../html/classpaimon_1_1_file_status-members.html  |  101 +
 apidoc/html/classpaimon_1_1_file_status.html       |  473 ++
 .../classpaimon_1_1_file_store_commit-members.html |  104 +
 apidoc/html/classpaimon_1_1_file_store_commit.html |  776 ++++
 .../classpaimon_1_1_file_store_write-members.html  |   99 +
 apidoc/html/classpaimon_1_1_file_store_write.html  |  486 ++
 .../html/classpaimon_1_1_file_system-members.html  |  104 +
 apidoc/html/classpaimon_1_1_file_system.html       |  761 +++
 ...lasspaimon_1_1_file_system_factory-members.html |   93 +
 .../html/classpaimon_1_1_file_system_factory.html  |  211 +
 .../html/classpaimon_1_1_file_system_factory.png   |  Bin 0 -> 709 bytes
 ...classpaimon_1_1_float_column_stats-members.html |  108 +
 .../html/classpaimon_1_1_float_column_stats.html   |  230 +
 apidoc/html/classpaimon_1_1_float_column_stats.png |  Bin 0 -> 667 bytes
 ...spaimon_1_1_format_stats_extractor-members.html |   92 +
 .../classpaimon_1_1_format_stats_extractor.html    |  233 +
 ...rmat_stats_extractor_1_1_file_info-members.html |   92 +
 ...n_1_1_format_stats_extractor_1_1_file_info.html |  189 +
 .../html/classpaimon_1_1_format_table-members.html |  120 +
 apidoc/html/classpaimon_1_1_format_table.html      | 1126 +++++
 .../classpaimon_1_1_format_writer-members.html     |   96 +
 apidoc/html/classpaimon_1_1_format_writer.html     |  354 ++
 apidoc/html/classpaimon_1_1_function-members.html  |   93 +
 apidoc/html/classpaimon_1_1_function.html          |  255 ++
 .../classpaimon_1_1_function_visitor-members.html  |  104 +
 apidoc/html/classpaimon_1_1_function_visitor.html  |  629 +++
 ...obal_index_checkpoint_file_manager-members.html |   95 +
 ...n_1_1_global_index_checkpoint_file_manager.html |  282 ++
 ...aimon_1_1_global_index_file_reader-members.html |   91 +
 .../classpaimon_1_1_global_index_file_reader.html  |  163 +
 ...aimon_1_1_global_index_file_writer-members.html |   94 +
 .../classpaimon_1_1_global_index_file_writer.html  |  257 ++
 ...lasspaimon_1_1_global_index_reader-members.html |  108 +
 .../html/classpaimon_1_1_global_index_reader.html  |  278 ++
 .../html/classpaimon_1_1_global_index_reader.png   |  Bin 0 -> 1143 bytes
 ...lasspaimon_1_1_global_index_result-members.html |  100 +
 .../html/classpaimon_1_1_global_index_result.html  |  518 +++
 .../html/classpaimon_1_1_global_index_result.png   |  Bin 0 -> 2853 bytes
 ...1_global_index_result_1_1_iterator-members.html |   92 +
 ...aimon_1_1_global_index_result_1_1_iterator.html |  203 +
 ...paimon_1_1_global_index_result_1_1_iterator.png |  Bin 0 -> 879 bytes
 .../classpaimon_1_1_global_index_scan-members.html |   95 +
 apidoc/html/classpaimon_1_1_global_index_scan.html |  473 ++
 ...paimon_1_1_global_index_write_task-members.html |   92 +
 .../classpaimon_1_1_global_index_write_task.html   |  254 +
 ...lasspaimon_1_1_global_index_writer-members.html |   92 +
 .../html/classpaimon_1_1_global_index_writer.html  |  211 +
 .../classpaimon_1_1_global_indexer-members.html    |   94 +
 apidoc/html/classpaimon_1_1_global_indexer.html    |  318 ++
 ...spaimon_1_1_global_indexer_factory-members.html |   95 +
 .../classpaimon_1_1_global_indexer_factory.html    |  265 ++
 .../classpaimon_1_1_global_indexer_factory.png     |  Bin 0 -> 724 bytes
 .../html/classpaimon_1_1_identifier-members.html   |  115 +
 apidoc/html/classpaimon_1_1_identifier.html        |  733 +++
 .../classpaimon_1_1_indexed_split-members.html     |   95 +
 apidoc/html/classpaimon_1_1_indexed_split.html     |  210 +
 apidoc/html/classpaimon_1_1_indexed_split.png      |  Bin 0 -> 564 bytes
 .../html/classpaimon_1_1_input_stream-members.html |  100 +
 apidoc/html/classpaimon_1_1_input_stream.html      |  505 ++
 apidoc/html/classpaimon_1_1_input_stream.png       |  Bin 0 -> 1430 bytes
 .../classpaimon_1_1_int_column_stats-members.html  |  108 +
 apidoc/html/classpaimon_1_1_int_column_stats.html  |  230 +
 apidoc/html/classpaimon_1_1_int_column_stats.png   |  Bin 0 -> 633 bytes
 ...classpaimon_1_1_lazy_instantiation-members.html |   90 +
 .../html/classpaimon_1_1_lazy_instantiation.html   |  141 +
 apidoc/html/classpaimon_1_1_lazy_instantiation.png |  Bin 0 -> 1690 bytes
 .../classpaimon_1_1_leaf_predicate-members.html    |  104 +
 apidoc/html/classpaimon_1_1_leaf_predicate.html    |  528 +++
 apidoc/html/classpaimon_1_1_leaf_predicate.png     |  Bin 0 -> 733 bytes
 apidoc/html/classpaimon_1_1_literal-members.html   |  108 +
 apidoc/html/classpaimon_1_1_literal.html           |  642 +++
 apidoc/html/classpaimon_1_1_logger-members.html    |   96 +
 apidoc/html/classpaimon_1_1_logger.html            |  329 ++
 ...ap_shared_shredding_access_builder-members.html |   95 +
 ...on_1_1_map_shared_shredding_access_builder.html |  279 ++
 ..._map_shared_shredding_schema_utils-members.html |   94 +
 ...imon_1_1_map_shared_shredding_schema_utils.html |  312 ++
 .../html/classpaimon_1_1_memory_pool-members.html  |  100 +
 apidoc/html/classpaimon_1_1_memory_pool.html       |  561 +++
 ...1_memory_pool_1_1_allocator_delete-members.html |  101 +
 ...aimon_1_1_memory_pool_1_1_allocator_delete.html |  483 ++
 .../classpaimon_1_1_memory_segment-members.html    |  121 +
 apidoc/html/classpaimon_1_1_memory_segment.html    | 1247 +++++
 apidoc/html/classpaimon_1_1_metrics-members.html   |  101 +
 apidoc/html/classpaimon_1_1_metrics.html           |  546 +++
 ...lasspaimon_1_1_nested_column_stats-members.html |  108 +
 .../html/classpaimon_1_1_nested_column_stats.html  |  325 ++
 .../html/classpaimon_1_1_nested_column_stats.png   |  Bin 0 -> 702 bytes
 ...asspaimon_1_1_orphan_files_cleaner-members.html |   94 +
 .../html/classpaimon_1_1_orphan_files_cleaner.html |  274 ++
 .../classpaimon_1_1_output_stream-members.html     |   96 +
 apidoc/html/classpaimon_1_1_output_stream.html     |  287 ++
 apidoc/html/classpaimon_1_1_output_stream.png      |  Bin 0 -> 595 bytes
 apidoc/html/classpaimon_1_1_plan-members.html      |   92 +
 apidoc/html/classpaimon_1_1_plan.html              |  192 +
 apidoc/html/classpaimon_1_1_predicate-members.html |   94 +
 apidoc/html/classpaimon_1_1_predicate.html         |  261 ++
 apidoc/html/classpaimon_1_1_predicate.png          |  Bin 0 -> 978 bytes
 .../classpaimon_1_1_predicate_builder-members.html |  109 +
 apidoc/html/classpaimon_1_1_predicate_builder.html | 1094 +++++
 .../classpaimon_1_1_predicate_utils-members.html   |  100 +
 apidoc/html/classpaimon_1_1_predicate_utils.html   |  503 ++
 ...mon_1_1_prefetch_file_batch_reader-members.html |  113 +
 ...classpaimon_1_1_prefetch_file_batch_reader.html |  412 ++
 .../classpaimon_1_1_prefetch_file_batch_reader.png |  Bin 0 -> 1103 bytes
 ...lasspaimon_1_1_prefetch_io_metrics-members.html |  103 +
 .../html/classpaimon_1_1_prefetch_io_metrics.html  |  441 ++
 .../classpaimon_1_1_prefetch_metrics-members.html  |  104 +
 apidoc/html/classpaimon_1_1_prefetch_metrics.html  |  464 ++
 .../html/classpaimon_1_1_read_context-members.html |  143 +
 apidoc/html/classpaimon_1_1_read_context.html      | 1631 +++++++
 ...asspaimon_1_1_read_context_builder-members.html |  121 +
 .../html/classpaimon_1_1_read_context_builder.html | 1128 +++++
 .../classpaimon_1_1_reader_builder-members.html    |   94 +
 apidoc/html/classpaimon_1_1_reader_builder.html    |  258 ++
 .../classpaimon_1_1_realtime_context-members.html  |   94 +
 apidoc/html/classpaimon_1_1_realtime_context.html  |  266 ++
 .../classpaimon_1_1_realtime_metrics-members.html  |   97 +
 apidoc/html/classpaimon_1_1_realtime_metrics.html  |  307 ++
 ...classpaimon_1_1_realtime_read_view-members.html |   91 +
 .../html/classpaimon_1_1_realtime_read_view.html   |  163 +
 ...paimon_1_1_realtime_segment_handle-members.html |   92 +
 .../classpaimon_1_1_realtime_segment_handle.html   |  193 +
 ...imon_1_1_realtime_snapshot_offsets-members.html |   93 +
 .../classpaimon_1_1_realtime_snapshot_offsets.html |  289 ++
 .../classpaimon_1_1_realtime_store-members.html    |   98 +
 apidoc/html/classpaimon_1_1_realtime_store.html    |  394 ++
 ...spaimon_1_1_realtime_store_factory-members.html |   91 +
 .../classpaimon_1_1_realtime_store_factory.html    |  175 +
 .../classpaimon_1_1_realtime_store_factory.png     |  Bin 0 -> 854 bytes
 .../html/classpaimon_1_1_record_batch-members.html |  106 +
 apidoc/html/classpaimon_1_1_record_batch.html      |  559 +++
 ...asspaimon_1_1_record_batch_builder-members.html |   97 +
 .../html/classpaimon_1_1_record_batch_builder.html |  344 ++
 apidoc/html/classpaimon_1_1_remain-members.html    |   96 +
 apidoc/html/classpaimon_1_1_remain.html            |  249 +
 apidoc/html/classpaimon_1_1_remain.png             |  Bin 0 -> 1351 bytes
 apidoc/html/classpaimon_1_1_result-members.html    |  111 +
 apidoc/html/classpaimon_1_1_result.html            |  938 ++++
 .../classpaimon_1_1_roaring_bitmap32-members.html  |  126 +
 apidoc/html/classpaimon_1_1_roaring_bitmap32.html  | 1107 +++++
 ..._1_1_roaring_bitmap32_1_1_iterator-members.html |  100 +
 ...sspaimon_1_1_roaring_bitmap32_1_1_iterator.html |  372 ++
 .../classpaimon_1_1_roaring_bitmap64-members.html  |  127 +
 apidoc/html/classpaimon_1_1_roaring_bitmap64.html  | 1158 +++++
 ..._1_1_roaring_bitmap64_1_1_iterator-members.html |  101 +
 ...sspaimon_1_1_roaring_bitmap64_1_1_iterator.html |  395 ++
 .../classpaimon_1_1_row_range_index-members.html   |  100 +
 apidoc/html/classpaimon_1_1_row_range_index.html   |  427 ++
 .../html/classpaimon_1_1_scan_context-members.html |  117 +
 apidoc/html/classpaimon_1_1_scan_context.html      |  895 ++++
 ...asspaimon_1_1_scan_context_builder-members.html |  109 +
 .../html/classpaimon_1_1_scan_context_builder.html |  670 +++
 .../html/classpaimon_1_1_scan_filter-members.html  |   96 +
 apidoc/html/classpaimon_1_1_scan_filter.html       |  307 ++
 .../html/classpaimon_1_1_scan_metrics-members.html |  107 +
 apidoc/html/classpaimon_1_1_scan_metrics.html      |  536 +++
 apidoc/html/classpaimon_1_1_schema-members.html    |   95 +
 apidoc/html/classpaimon_1_1_schema.html            |  305 ++
 apidoc/html/classpaimon_1_1_schema.png             |  Bin 0 -> 928 bytes
 ...mon_1_1_scored_global_index_result-members.html |  101 +
 ...classpaimon_1_1_scored_global_index_result.html |  187 +
 .../classpaimon_1_1_scored_global_index_result.png |  Bin 0 -> 2069 bytes
 ...l_index_result_1_1_scored_iterator-members.html |   92 +
 ...ed_global_index_result_1_1_scored_iterator.html |  212 +
 ...red_global_index_result_1_1_scored_iterator.png |  Bin 0 -> 1176 bytes
 apidoc/html/classpaimon_1_1_singleton-members.html |   94 +
 apidoc/html/classpaimon_1_1_singleton.html         |  252 +
 apidoc/html/classpaimon_1_1_singleton.png          |  Bin 0 -> 813 bytes
 apidoc/html/classpaimon_1_1_skip-members.html      |   96 +
 apidoc/html/classpaimon_1_1_skip.html              |  249 +
 apidoc/html/classpaimon_1_1_skip.png               |  Bin 0 -> 1342 bytes
 ...spaimon_1_1_small_int_column_stats-members.html |  108 +
 .../classpaimon_1_1_small_int_column_stats.html    |  230 +
 .../classpaimon_1_1_small_int_column_stats.png     |  Bin 0 -> 694 bytes
 ...classpaimon_1_1_snapshot_file_scan-members.html |   92 +
 .../html/classpaimon_1_1_snapshot_file_scan.html   |  256 ++
 .../classpaimon_1_1_special_field_ids-members.html |   97 +
 apidoc/html/classpaimon_1_1_special_field_ids.html |  325 ++
 ...on_1_1_specific_f_s_writer_builder-members.html |   94 +
 ...lasspaimon_1_1_specific_f_s_writer_builder.html |  178 +
 ...classpaimon_1_1_specific_f_s_writer_builder.png |  Bin 0 -> 769 bytes
 apidoc/html/classpaimon_1_1_split-members.html     |   92 +
 apidoc/html/classpaimon_1_1_split.html             |  255 ++
 apidoc/html/classpaimon_1_1_split.png              |  Bin 0 -> 783 bytes
 .../html/classpaimon_1_1_startup_mode-members.html |  100 +
 apidoc/html/classpaimon_1_1_startup_mode.html      |  423 ++
 apidoc/html/classpaimon_1_1_status-members.html    |  148 +
 apidoc/html/classpaimon_1_1_status.html            | 1867 ++++++++
 apidoc/html/classpaimon_1_1_status.png             |  Bin 0 -> 1340 bytes
 .../classpaimon_1_1_status_detail-members.html     |   93 +
 apidoc/html/classpaimon_1_1_status_detail.html     |  220 +
 apidoc/html/classpaimon_1_1_stream-members.html    |   91 +
 apidoc/html/classpaimon_1_1_stream.html            |  176 +
 apidoc/html/classpaimon_1_1_stream.png             |  Bin 0 -> 1639 bytes
 ...lasspaimon_1_1_string_column_stats-members.html |  108 +
 .../html/classpaimon_1_1_string_column_stats.html  |  230 +
 .../html/classpaimon_1_1_string_column_stats.png   |  Bin 0 -> 695 bytes
 .../classpaimon_1_1_system_schema-members.html     |   96 +
 apidoc/html/classpaimon_1_1_system_schema.html     |  158 +
 apidoc/html/classpaimon_1_1_system_schema.png      |  Bin 0 -> 650 bytes
 apidoc/html/classpaimon_1_1_table-members.html     |  101 +
 apidoc/html/classpaimon_1_1_table.html             |  492 ++
 .../html/classpaimon_1_1_table_read-members.html   |   94 +
 apidoc/html/classpaimon_1_1_table_read.html        |  285 ++
 .../html/classpaimon_1_1_table_scan-members.html   |   94 +
 apidoc/html/classpaimon_1_1_table_scan.html        |  269 ++
 apidoc/html/classpaimon_1_1_timestamp-members.html |  110 +
 apidoc/html/classpaimon_1_1_timestamp.html         |  718 +++
 ...spaimon_1_1_timestamp_column_stats-members.html |  109 +
 .../classpaimon_1_1_timestamp_column_stats.html    |  257 ++
 .../classpaimon_1_1_timestamp_column_stats.png     |  Bin 0 -> 707 bytes
 ...sspaimon_1_1_tiny_int_column_stats-members.html |  108 +
 .../classpaimon_1_1_tiny_int_column_stats.html     |  230 +
 .../html/classpaimon_1_1_tiny_int_column_stats.png |  Bin 0 -> 686 bytes
 apidoc/html/classpaimon_1_1_variant-members.html   |  102 +
 apidoc/html/classpaimon_1_1_variant.html           |  603 +++
 ...spaimon_1_1_variant_access_builder-members.html |   94 +
 .../classpaimon_1_1_variant_access_builder.html    |  254 +
 .../classpaimon_1_1_write_context-members.html     |  129 +
 apidoc/html/classpaimon_1_1_write_context.html     | 1243 +++++
 ...sspaimon_1_1_write_context_builder-members.html |  110 +
 .../classpaimon_1_1_write_context_builder.html     |  740 +++
 .../classpaimon_1_1_writer_builder-members.html    |   92 +
 apidoc/html/classpaimon_1_1_writer_builder.html    |  214 +
 apidoc/html/classpaimon_1_1_writer_builder.png     |  Bin 0 -> 1087 bytes
 ...on_1_1_written_file_stats_provider-members.html |   91 +
 ...lasspaimon_1_1_written_file_stats_provider.html |  173 +
 ..._1_1util_1_1_to_string_ostreamable-members.html |   92 +
 ...sspaimon_1_1util_1_1_to_string_ostreamable.html |  168 +
 apidoc/html/closed.png                             |  Bin 0 -> 132 bytes
 apidoc/html/column__stats_8h.html                  |  137 +
 apidoc/html/column__stats_8h_source.html           |  379 ++
 apidoc/html/commit__context_8h.html                |  115 +
 apidoc/html/commit__context_8h_source.html         |  339 ++
 apidoc/html/commit__message_8h.html                |  111 +
 apidoc/html/commit__message_8h_source.html         |  166 +
 apidoc/html/compound__predicate_8h.html            |  109 +
 apidoc/html/compound__predicate_8h_source.html     |  161 +
 apidoc/html/count__reader_8h.html                  |  106 +
 apidoc/html/count__reader_8h_source.html           |  135 +
 apidoc/html/credential__provider_8h.html           |  108 +
 apidoc/html/credential__provider_8h_source.html    |  150 +
 apidoc/html/credential__provider__factory_8h.html  |  111 +
 .../credential__provider__factory_8h_source.html   |  146 +
 apidoc/html/data__input__stream_8h.html            |  111 +
 apidoc/html/data__input__stream_8h_source.html     |  188 +
 apidoc/html/data__split_8h.html                    |  118 +
 apidoc/html/data__split_8h_source.html             |  196 +
 apidoc/html/database_8h.html                       |  113 +
 apidoc/html/database_8h_source.html                |  152 +
 apidoc/html/decimal_8h.html                        |  109 +
 apidoc/html/decimal_8h_source.html                 |  279 ++
 apidoc/html/defs_8h.html                           |  145 +
 apidoc/html/defs_8h_source.html                    |  445 ++
 .../html/dir_071215c78c595cca951c617169b821c1.html |   92 +
 .../html/dir_0d1b380af7e32596045120d77ba9b953.html |   98 +
 .../html/dir_0f736ee9f7b875cfa3ccf35bccf64319.html |   96 +
 .../html/dir_1585cef52ab3ac100252476d26968f2e.html |  102 +
 .../html/dir_442f7bf186c1815f29c09fb4f8a71f54.html |   93 +
 .../html/dir_60649a063c079650afe6e44ab3cf8648.html |   96 +
 .../html/dir_8a3f51232b30aedc137e04a4b3fb61f7.html |  104 +
 .../html/dir_8c33e2f80e7e3dd00d6913e1209b2ab6.html |   92 +
 .../html/dir_922ec61c57e641d58003ea84c9c1afa3.html |  104 +
 .../html/dir_94827ce922f878ac02e1d2e2a28038d9.html |  108 +
 .../html/dir_9c552d3700583f259251ef2f8e23912b.html |   98 +
 .../html/dir_9ce711e6a3bbe1bbf07b1bcf67e13462.html |   92 +
 .../html/dir_9d0854483e08622e360d2b66c7bb9c9b.html |  107 +
 .../html/dir_a902f9c9d3b901767da91dcbe47e876e.html |   92 +
 .../html/dir_c303d81fcec65aef767d65e2c1798f68.html |   98 +
 .../html/dir_cc0e6aa30e69893d19cbbbcd50019a13.html |   94 +
 .../html/dir_d44c64559bbebec7f509842c48db8b23.html |   92 +
 .../html/dir_d50fe60c21edeba613032393f5bb145e.html |  102 +
 .../html/dir_d5ce83a91c1ada980bd794a9f3314520.html |  177 +
 .../html/dir_dbd2ce2385aeb987927f6f62ed9951a0.html |   92 +
 .../html/dir_df042af7cbf742b9cd067fda6cb9a7fc.html |   98 +
 .../html/dir_e6a1c9ffd133f63dd611899f4f180300.html |  117 +
 .../html/dir_e77ec7fe12e8f4dc339142724a1dbbea.html |   92 +
 .../html/dir_e9a132d0f1069a9817aeb5f444052536.html |   94 +
 .../html/dir_e9e9def0e1178aa8ef569fa20d859019.html |   96 +
 .../html/dir_f621b1b7a8e367ca76a53c102fbe25fe.html |  110 +
 .../html/dir_ff5841d25cf2365d87149f1890cfa318.html |   94 +
 apidoc/html/doc.svg                                |   12 +
 apidoc/html/docd.svg                               |   12 +
 apidoc/html/doxygen.css                            | 2045 +++++++++
 apidoc/html/doxygen.svg                            |   28 +
 apidoc/html/dynsections.js                         |  192 +
 apidoc/html/executor_8h.html                       |  128 +
 apidoc/html/executor_8h_source.html                |  157 +
 apidoc/html/factory_8h.html                        |  138 +
 apidoc/html/factory_8h_source.html                 |  140 +
 apidoc/html/factory__creator_8h.html               |  110 +
 apidoc/html/factory__creator_8h_source.html        |  160 +
 apidoc/html/file__batch__reader_8h.html            |  110 +
 apidoc/html/file__batch__reader_8h_source.html     |  158 +
 apidoc/html/file__format_8h.html                   |  111 +
 apidoc/html/file__format_8h_source.html            |  155 +
 apidoc/html/file__format__factory_8h.html          |  110 +
 apidoc/html/file__format__factory_8h_source.html   |  148 +
 apidoc/html/file__index__format_8h.html            |  118 +
 apidoc/html/file__index__format_8h_source.html     |  194 +
 apidoc/html/file__index__reader_8h.html            |  111 +
 apidoc/html/file__index__reader_8h_source.html     |  180 +
 apidoc/html/file__index__result_8h.html            |  116 +
 apidoc/html/file__index__result_8h_source.html     |  190 +
 apidoc/html/file__index__writer_8h.html            |  110 +
 apidoc/html/file__index__writer_8h_source.html     |  146 +
 apidoc/html/file__indexer_8h.html                  |  111 +
 apidoc/html/file__indexer_8h_source.html           |  153 +
 apidoc/html/file__indexer__factory_8h.html         |  110 +
 apidoc/html/file__indexer__factory_8h_source.html  |  147 +
 apidoc/html/file__meta__utils_8h.html              |  111 +
 apidoc/html/file__meta__utils_8h_source.html       |  148 +
 apidoc/html/file__store__commit_8h.html            |  119 +
 apidoc/html/file__store__commit_8h_source.html     |  213 +
 apidoc/html/file__store__write_8h.html             |  119 +
 apidoc/html/file__store__write_8h_source.html      |  186 +
 apidoc/html/file__system_8h.html                   |  138 +
 apidoc/html/file__system_8h_source.html            |  357 ++
 apidoc/html/file__system__factory_8h.html          |  111 +
 apidoc/html/file__system__factory_8h_source.html   |  146 +
 apidoc/html/files.html                             |  232 +
 apidoc/html/folderclosed.svg                       |   11 +
 apidoc/html/folderclosedd.svg                      |   11 +
 apidoc/html/folderopen.svg                         |   17 +
 apidoc/html/folderopend.svg                        |   12 +
 apidoc/html/format__stats__extractor_8h.html       |  113 +
 .../html/format__stats__extractor_8h_source.html   |  165 +
 apidoc/html/format__table_8h.html                  |  114 +
 apidoc/html/format__table_8h_source.html           |  287 ++
 apidoc/html/format__writer_8h.html                 |  109 +
 apidoc/html/format__writer_8h_source.html          |  156 +
 apidoc/html/full__text__search_8h.html             |  113 +
 apidoc/html/full__text__search_8h_source.html      |  182 +
 apidoc/html/function_8h.html                       |  106 +
 apidoc/html/function_8h_source.html                |  153 +
 apidoc/html/function__visitor_8h.html              |  110 +
 apidoc/html/function__visitor_8h_source.html       |  180 +
 apidoc/html/functions.html                         |  121 +
 apidoc/html/functions_b.html                       |  132 +
 apidoc/html/functions_c.html                       |  205 +
 apidoc/html/functions_d.html                       |  135 +
 apidoc/html/functions_e.html                       |  116 +
 apidoc/html/functions_enum.html                    |   87 +
 apidoc/html/functions_f.html                       |  160 +
 apidoc/html/functions_func.html                    |  108 +
 apidoc/html/functions_func_b.html                  |   99 +
 apidoc/html/functions_func_c.html                  |  159 +
 apidoc/html/functions_func_d.html                  |   99 +
 apidoc/html/functions_func_e.html                  |  105 +
 apidoc/html/functions_func_f.html                  |  120 +
 apidoc/html/functions_func_g.html                  |  203 +
 apidoc/html/functions_func_h.html                  |   91 +
 apidoc/html/functions_func_i.html                  |  127 +
 apidoc/html/functions_func_k.html                  |   84 +
 apidoc/html/functions_func_l.html                  |  109 +
 apidoc/html/functions_func_m.html                  |  102 +
 apidoc/html/functions_func_n.html                  |  102 +
 apidoc/html/functions_func_o.html                  |  110 +
 apidoc/html/functions_func_p.html                  |   97 +
 apidoc/html/functions_func_r.html                  |  122 +
 apidoc/html/functions_func_s.html                  |  148 +
 apidoc/html/functions_func_t.html                  |  103 +
 apidoc/html/functions_func_u.html                  |   87 +
 apidoc/html/functions_func_v.html                  |  111 +
 apidoc/html/functions_func_w.html                  |  113 +
 apidoc/html/functions_func_~.html                  |  185 +
 apidoc/html/functions_g.html                       |  208 +
 apidoc/html/functions_h.html                       |   93 +
 apidoc/html/functions_i.html                       |  147 +
 apidoc/html/functions_k.html                       |   99 +
 apidoc/html/functions_l.html                       |  145 +
 apidoc/html/functions_m.html                       |  136 +
 apidoc/html/functions_n.html                       |  118 +
 apidoc/html/functions_o.html                       |  119 +
 apidoc/html/functions_p.html                       |  142 +
 apidoc/html/functions_q.html                       |   87 +
 apidoc/html/functions_r.html                       |  162 +
 apidoc/html/functions_rela.html                    |   82 +
 apidoc/html/functions_s.html                       |  203 +
 apidoc/html/functions_t.html                       |  121 +
 apidoc/html/functions_type.html                    |   90 +
 apidoc/html/functions_u.html                       |   92 +
 apidoc/html/functions_v.html                       |  125 +
 apidoc/html/functions_vars.html                    |   96 +
 apidoc/html/functions_vars_b.html                  |  115 +
 apidoc/html/functions_vars_c.html                  |  128 +
 apidoc/html/functions_vars_d.html                  |  119 +
 apidoc/html/functions_vars_e.html                  |   94 +
 apidoc/html/functions_vars_f.html                  |  122 +
 apidoc/html/functions_vars_g.html                  |   88 +
 apidoc/html/functions_vars_h.html                  |   85 +
 apidoc/html/functions_vars_i.html                  |  102 +
 apidoc/html/functions_vars_k.html                  |   98 +
 apidoc/html/functions_vars_l.html                  |  118 +
 apidoc/html/functions_vars_m.html                  |  115 +
 apidoc/html/functions_vars_n.html                  |   99 +
 apidoc/html/functions_vars_o.html                  |   91 +
 apidoc/html/functions_vars_p.html                  |  126 +
 apidoc/html/functions_vars_q.html                  |   87 +
 apidoc/html/functions_vars_r.html                  |  120 +
 apidoc/html/functions_vars_s.html                  |  136 +
 apidoc/html/functions_vars_t.html                  |  100 +
 apidoc/html/functions_vars_u.html                  |   87 +
 apidoc/html/functions_vars_v.html                  |   97 +
 apidoc/html/functions_vars_w.html                  |   95 +
 apidoc/html/functions_vars_z.html                  |   84 +
 apidoc/html/functions_w.html                       |  125 +
 apidoc/html/functions_z.html                       |   84 +
 apidoc/html/functions_~.html                       |  185 +
 ...lobal__index__checkpoint__file__manager_8h.html |  108 +
 ...index__checkpoint__file__manager_8h_source.html |  154 +
 apidoc/html/global__index__file__reader_8h.html    |  108 +
 .../global__index__file__reader_8h_source.html     |  138 +
 apidoc/html/global__index__file__writer_8h.html    |  107 +
 .../global__index__file__writer_8h_source.html     |  144 +
 apidoc/html/global__index__io__meta_8h.html        |  108 +
 apidoc/html/global__index__io__meta_8h_source.html |  142 +
 apidoc/html/global__index__reader_8h.html          |  112 +
 apidoc/html/global__index__reader_8h_source.html   |  153 +
 apidoc/html/global__index__result_8h.html          |  121 +
 apidoc/html/global__index__result_8h_source.html   |  214 +
 apidoc/html/global__index__scan_8h.html            |  116 +
 apidoc/html/global__index__scan_8h_source.html     |  178 +
 apidoc/html/global__index__write__task_8h.html     |  113 +
 .../html/global__index__write__task_8h_source.html |  151 +
 apidoc/html/global__index__writer_8h.html          |  109 +
 apidoc/html/global__index__writer_8h_source.html   |  146 +
 apidoc/html/global__indexer_8h.html                |  115 +
 apidoc/html/global__indexer_8h_source.html         |  171 +
 apidoc/html/global__indexer__factory_8h.html       |  110 +
 .../html/global__indexer__factory_8h_source.html   |  150 +
 apidoc/html/globals.html                           |  102 +
 apidoc/html/globals_defs.html                      |  102 +
 apidoc/html/hierarchy.html                         |  275 ++
 apidoc/html/identifier_8h.html                     |  113 +
 apidoc/html/identifier_8h_source.html              |  206 +
 apidoc/html/index.html                             |   82 +
 apidoc/html/indexed__split_8h.html                 |  113 +
 apidoc/html/indexed__split_8h_source.html          |  145 +
 apidoc/html/jquery.js                              |   34 +
 apidoc/html/leaf__predicate_8h.html                |  111 +
 apidoc/html/leaf__predicate_8h_source.html         |  192 +
 apidoc/html/literal_8h.html                        |  115 +
 apidoc/html/literal_8h_source.html                 |  205 +
 apidoc/html/logging_8h.html                        |  336 ++
 apidoc/html/logging_8h_source.html                 |  188 +
 .../map__shared__shredding__schema__utils_8h.html  |  119 +
 ...shared__shredding__schema__utils_8h_source.html |  215 +
 apidoc/html/memory__pool_8h.html                   |  154 +
 apidoc/html/memory__pool_8h_source.html            |  293 ++
 apidoc/html/memory__segment_8h.html                |  112 +
 apidoc/html/memory__segment_8h_source.html         |  373 ++
 apidoc/html/menu.js                                |  136 +
 apidoc/html/menudata.js                            |  130 +
 apidoc/html/metrics_8h.html                        |  112 +
 apidoc/html/metrics_8h_source.html                 |  185 +
 apidoc/html/minus.svg                              |    8 +
 apidoc/html/minusd.svg                             |    8 +
 apidoc/html/namespacemembers.html                  |  152 +
 apidoc/html/namespacemembers_enum.html             |   91 +
 apidoc/html/namespacemembers_eval.html             |   90 +
 apidoc/html/namespacemembers_func.html             |   88 +
 apidoc/html/namespacemembers_type.html             |   86 +
 apidoc/html/namespacemembers_vars.html             |   83 +
 apidoc/html/namespacepaimon.html                   | 1284 ++++++
 apidoc/html/namespacepaimon_1_1util.html           |  195 +
 apidoc/html/namespaces.html                        |  269 ++
 apidoc/html/namespacestd.html                      |   92 +
 apidoc/html/nav_f.png                              |  Bin 0 -> 153 bytes
 apidoc/html/nav_fd.png                             |  Bin 0 -> 169 bytes
 apidoc/html/nav_g.png                              |  Bin 0 -> 95 bytes
 apidoc/html/nav_h.png                              |  Bin 0 -> 98 bytes
 apidoc/html/nav_hd.png                             |  Bin 0 -> 114 bytes
 apidoc/html/offset__range_8h.html                  |  106 +
 apidoc/html/offset__range_8h_source.html           |  156 +
 apidoc/html/open.png                               |  Bin 0 -> 123 bytes
 apidoc/html/orphan__files__cleaner_8h.html         |  120 +
 apidoc/html/orphan__files__cleaner_8h_source.html  |  278 ++
 apidoc/html/plan_8h.html                           |  108 +
 apidoc/html/plan_8h_source.html                    |  135 +
 apidoc/html/plus.svg                               |    9 +
 apidoc/html/plusd.svg                              |    9 +
 apidoc/html/predicate_8h.html                      |  108 +
 apidoc/html/predicate_8h_source.html               |  147 +
 apidoc/html/predicate__builder_8h.html             |  111 +
 apidoc/html/predicate__builder_8h_source.html      |  231 +
 apidoc/html/predicate__utils_8h.html               |  117 +
 apidoc/html/predicate__utils_8h_source.html        |  253 +
 apidoc/html/prefetch__cache__config_8h.html        |  116 +
 apidoc/html/prefetch__cache__config_8h_source.html |  245 +
 apidoc/html/prefetch__file__batch__reader_8h.html  |  115 +
 .../prefetch__file__batch__reader_8h_source.html   |  204 +
 apidoc/html/range_8h.html                          |  108 +
 apidoc/html/range_8h_source.html                   |  161 +
 apidoc/html/read__context_8h.html                  |  121 +
 apidoc/html/read__context_8h_source.html           |  490 ++
 apidoc/html/read__hints_8h.html                    |  105 +
 apidoc/html/read__hints_8h_source.html             |  127 +
 apidoc/html/reader__builder_8h.html                |  110 +
 apidoc/html/reader__builder_8h_source.html         |  162 +
 apidoc/html/realtime__commit__progress_8h.html     |  109 +
 .../html/realtime__commit__progress_8h_source.html |  142 +
 apidoc/html/realtime__context_8h.html              |  125 +
 apidoc/html/realtime__context_8h_source.html       |  217 +
 apidoc/html/realtime__snapshot__offsets_8h.html    |  111 +
 .../realtime__snapshot__offsets_8h_source.html     |  157 +
 apidoc/html/realtime__store_8h.html                |  147 +
 apidoc/html/realtime__store_8h_source.html         |  281 ++
 apidoc/html/record__batch_8h.html                  |  114 +
 apidoc/html/record__batch_8h_source.html           |  244 +
 apidoc/html/result_8h.html                         |  218 +
 apidoc/html/result_8h_source.html                  |  383 ++
 apidoc/html/roaring__bitmap32_8h.html              |  117 +
 apidoc/html/roaring__bitmap32_8h_source.html       |  249 +
 apidoc/html/roaring__bitmap64_8h.html              |  117 +
 apidoc/html/roaring__bitmap64_8h_source.html       |  249 +
 apidoc/html/row__range__index_8h.html              |  109 +
 apidoc/html/row__range__index_8h_source.html       |  169 +
 apidoc/html/scan__context_8h.html                  |  123 +
 apidoc/html/scan__context_8h_source.html           |  392 ++
 apidoc/html/scan__metrics_8h.html                  |  105 +
 apidoc/html/scan__metrics_8h_source.html           |  150 +
 apidoc/html/schema_8h.html                         |  118 +
 apidoc/html/schema_8h_source.html                  |  196 +
 apidoc/html/search/all_0.js                        |   56 +
 apidoc/html/search/all_1.js                        |   72 +
 apidoc/html/search/all_10.js                       |  109 +
 apidoc/html/search/all_11.js                       |  156 +
 apidoc/html/search/all_12.js                       |   51 +
 apidoc/html/search/all_13.js                       |   14 +
 apidoc/html/search/all_14.js                       |   47 +
 apidoc/html/search/all_15.js                       |   53 +
 apidoc/html/search/all_16.js                       |    4 +
 apidoc/html/search/all_17.js                       |  105 +
 apidoc/html/search/all_2.js                        |  146 +
 apidoc/html/search/all_3.js                        |   71 +
 apidoc/html/search/all_4.js                        |   39 +
 apidoc/html/search/all_5.js                        |  126 +
 apidoc/html/search/all_6.js                        |  152 +
 apidoc/html/search/all_7.js                        |   17 +
 apidoc/html/search/all_8.js                        |   76 +
 apidoc/html/search/all_9.js                        |   19 +
 apidoc/html/search/all_a.js                        |   70 +
 apidoc/html/search/all_b.js                        |   63 +
 apidoc/html/search/all_c.js                        |   40 +
 apidoc/html/search/all_d.js                        |   39 +
 apidoc/html/search/all_e.js                        |  103 +
 apidoc/html/search/all_f.js                        |    7 +
 apidoc/html/search/classes_0.js                    |    8 +
 apidoc/html/search/classes_1.js                    |   17 +
 apidoc/html/search/classes_10.js                   |   11 +
 apidoc/html/search/classes_11.js                   |    7 +
 apidoc/html/search/classes_12.js                   |    8 +
 apidoc/html/search/classes_2.js                    |   19 +
 apidoc/html/search/classes_3.js                    |   12 +
 apidoc/html/search/classes_4.js                    |    4 +
 apidoc/html/search/classes_5.js                    |   30 +
 apidoc/html/search/classes_6.js                    |   14 +
 apidoc/html/search/classes_7.js                    |    7 +
 apidoc/html/search/classes_8.js                    |    8 +
 apidoc/html/search/classes_9.js                    |    7 +
 apidoc/html/search/classes_a.js                    |    9 +
 apidoc/html/search/classes_b.js                    |    4 +
 apidoc/html/search/classes_c.js                    |    7 +
 apidoc/html/search/classes_d.js                    |   10 +
 apidoc/html/search/classes_e.js                    |   29 +
 apidoc/html/search/classes_f.js                    |   27 +
 apidoc/html/search/close.svg                       |   18 +
 apidoc/html/search/defines_0.js                    |    7 +
 apidoc/html/search/defines_1.js                    |   19 +
 apidoc/html/search/defines_2.js                    |    4 +
 apidoc/html/search/enums_0.js                      |    5 +
 apidoc/html/search/enums_1.js                      |    5 +
 apidoc/html/search/enums_2.js                      |    4 +
 apidoc/html/search/enums_3.js                      |    5 +
 apidoc/html/search/enums_4.js                      |    4 +
 apidoc/html/search/enums_5.js                      |    5 +
 apidoc/html/search/enums_6.js                      |    7 +
 apidoc/html/search/enums_7.js                      |    4 +
 apidoc/html/search/enums_8.js                      |    4 +
 apidoc/html/search/enumvalues_0.js                 |    8 +
 apidoc/html/search/enumvalues_1.js                 |    7 +
 apidoc/html/search/enumvalues_10.js                |    9 +
 apidoc/html/search/enumvalues_11.js                |    6 +
 apidoc/html/search/enumvalues_12.js                |    7 +
 apidoc/html/search/enumvalues_13.js                |    5 +
 apidoc/html/search/enumvalues_14.js                |    4 +
 apidoc/html/search/enumvalues_2.js                 |    8 +
 apidoc/html/search/enumvalues_3.js                 |   10 +
 apidoc/html/search/enumvalues_4.js                 |    7 +
 apidoc/html/search/enumvalues_5.js                 |    8 +
 apidoc/html/search/enumvalues_6.js                 |    5 +
 apidoc/html/search/enumvalues_7.js                 |    4 +
 apidoc/html/search/enumvalues_8.js                 |   12 +
 apidoc/html/search/enumvalues_9.js                 |    4 +
 apidoc/html/search/enumvalues_a.js                 |    6 +
 apidoc/html/search/enumvalues_b.js                 |    8 +
 apidoc/html/search/enumvalues_c.js                 |    8 +
 apidoc/html/search/enumvalues_d.js                 |    8 +
 apidoc/html/search/enumvalues_e.js                 |   15 +
 apidoc/html/search/enumvalues_f.js                 |    4 +
 apidoc/html/search/files_0.js                      |    7 +
 apidoc/html/search/files_1.js                      |   16 +
 apidoc/html/search/files_10.js                     |    6 +
 apidoc/html/search/files_2.js                      |   13 +
 apidoc/html/search/files_3.js                      |    8 +
 apidoc/html/search/files_4.js                      |    4 +
 apidoc/html/search/files_5.js                      |   25 +
 apidoc/html/search/files_6.js                      |   14 +
 apidoc/html/search/files_7.js                      |    5 +
 apidoc/html/search/files_8.js                      |    6 +
 apidoc/html/search/files_9.js                      |    7 +
 apidoc/html/search/files_a.js                      |    5 +
 apidoc/html/search/files_b.js                      |    9 +
 apidoc/html/search/files_c.js                      |   16 +
 apidoc/html/search/files_d.js                      |   15 +
 apidoc/html/search/files_e.js                      |    8 +
 apidoc/html/search/files_f.js                      |    6 +
 apidoc/html/search/functions_0.js                  |   28 +
 apidoc/html/search/functions_1.js                  |   19 +
 apidoc/html/search/functions_10.js                 |   69 +
 apidoc/html/search/functions_11.js                 |   23 +
 apidoc/html/search/functions_12.js                 |    7 +
 apidoc/html/search/functions_13.js                 |   29 +
 apidoc/html/search/functions_14.js                 |   33 +
 apidoc/html/search/functions_15.js                 |  105 +
 apidoc/html/search/functions_2.js                  |   79 +
 apidoc/html/search/functions_3.js                  |   18 +
 apidoc/html/search/functions_4.js                  |   25 +
 apidoc/html/search/functions_5.js                  |   40 +
 apidoc/html/search/functions_6.js                  |  125 +
 apidoc/html/search/functions_7.js                  |   11 +
 apidoc/html/search/functions_8.js                  |   47 +
 apidoc/html/search/functions_9.js                  |    4 +
 apidoc/html/search/functions_a.js                  |   29 +
 apidoc/html/search/functions_b.js                  |   22 +
 apidoc/html/search/functions_c.js                  |   22 +
 apidoc/html/search/functions_d.js                  |   29 +
 apidoc/html/search/functions_e.js                  |   17 +
 apidoc/html/search/functions_f.js                  |   42 +
 apidoc/html/search/mag.svg                         |   24 +
 apidoc/html/search/mag_d.svg                       |   24 +
 apidoc/html/search/mag_sel.svg                     |   31 +
 apidoc/html/search/mag_seld.svg                    |   31 +
 apidoc/html/search/namespaces_0.js                 |    5 +
 apidoc/html/search/namespaces_1.js                 |    4 +
 apidoc/html/search/related_0.js                    |    4 +
 apidoc/html/search/search.css                      |  291 ++
 apidoc/html/search/search.js                       |  840 ++++
 apidoc/html/search/searchdata.js                   |   45 +
 apidoc/html/search/typedefs_0.js                   |    4 +
 apidoc/html/search/typedefs_1.js                   |    6 +
 apidoc/html/search/typedefs_2.js                   |    5 +
 apidoc/html/search/typedefs_3.js                   |    4 +
 apidoc/html/search/typedefs_4.js                   |    6 +
 apidoc/html/search/typedefs_5.js                   |    6 +
 apidoc/html/search/typedefs_6.js                   |    4 +
 apidoc/html/search/variables_0.js                  |   16 +
 apidoc/html/search/variables_1.js                  |   35 +
 apidoc/html/search/variables_10.js                 |   38 +
 apidoc/html/search/variables_11.js                 |   56 +
 apidoc/html/search/variables_12.js                 |   19 +
 apidoc/html/search/variables_13.js                 |    7 +
 apidoc/html/search/variables_14.js                 |   17 +
 apidoc/html/search/variables_15.js                 |   15 +
 apidoc/html/search/variables_16.js                 |    4 +
 apidoc/html/search/variables_2.js                  |   48 +
 apidoc/html/search/variables_3.js                  |   40 +
 apidoc/html/search/variables_4.js                  |   14 +
 apidoc/html/search/variables_5.js                  |   41 +
 apidoc/html/search/variables_6.js                  |    8 +
 apidoc/html/search/variables_7.js                  |    5 +
 apidoc/html/search/variables_8.js                  |   22 +
 apidoc/html/search/variables_9.js                  |   18 +
 apidoc/html/search/variables_a.js                  |   38 +
 apidoc/html/search/variables_b.js                  |   35 +
 apidoc/html/search/variables_c.js                  |   19 +
 apidoc/html/search/variables_d.js                  |   11 +
 apidoc/html/search/variables_e.js                  |   46 +
 apidoc/html/search/variables_f.js                  |    7 +
 apidoc/html/singleton_8h.html                      |  111 +
 apidoc/html/singleton_8h_source.html               |  198 +
 apidoc/html/snapshot__file__scan_8h.html           |  112 +
 apidoc/html/snapshot__file__scan_8h_source.html    |  153 +
 apidoc/html/snapshot__info_8h.html                 |  108 +
 apidoc/html/snapshot__info_8h_source.html          |  160 +
 apidoc/html/special__field__ids_8h.html            |  106 +
 apidoc/html/special__field__ids_8h_source.html     |  147 +
 apidoc/html/split_8h.html                          |  113 +
 apidoc/html/split_8h_source.html                   |  149 +
 apidoc/html/splitbar.png                           |  Bin 0 -> 314 bytes
 apidoc/html/splitbard.png                          |  Bin 0 -> 282 bytes
 apidoc/html/startup__mode_8h.html                  |  107 +
 apidoc/html/startup__mode_8h_source.html           |  162 +
 apidoc/html/statistics__mode_8h.html               |  106 +
 apidoc/html/statistics__mode_8h_source.html        |  126 +
 apidoc/html/status_8h.html                         |  285 ++
 apidoc/html/status_8h_source.html                  |  692 +++
 apidoc/html/string__builder_8h.html                |  125 +
 apidoc/html/string__builder_8h_source.html         |  206 +
 apidoc/html/struct_arrow_array-members.html        |   95 +
 apidoc/html/struct_arrow_array.html                |  255 ++
 apidoc/html/struct_arrow_schema-members.html       |   94 +
 apidoc/html/struct_arrow_schema.html               |  239 +
 .../html/structpaimon_1_1_blob_view-members.html   |   97 +
 apidoc/html/structpaimon_1_1_blob_view.html        |  302 ++
 .../structpaimon_1_1_catalog_options-members.html  |  105 +
 apidoc/html/structpaimon_1_1_catalog_options.html  |  539 +++
 ...ta_split_1_1_simple_data_file_meta-members.html |  101 +
 ...n_1_1_data_split_1_1_simple_data_file_meta.html |  378 ++
 .../structpaimon_1_1_full_text_search-members.html |   99 +
 apidoc/html/structpaimon_1_1_full_text_search.html |  413 ++
 ...ctpaimon_1_1_global_index_i_o_meta-members.html |   93 +
 .../structpaimon_1_1_global_index_i_o_meta.html    |  205 +
 .../structpaimon_1_1_histogram_stats-members.html  |  100 +
 apidoc/html/structpaimon_1_1_histogram_stats.html  |  281 ++
 .../structpaimon_1_1_hive_field_info-members.html  |   94 +
 apidoc/html/structpaimon_1_1_hive_field_info.html  |  229 +
 ..._1_map_shared_shredding_field_meta-members.html |   95 +
 ...paimon_1_1_map_shared_shredding_field_meta.html |  232 +
 .../structpaimon_1_1_offset_range-members.html     |   95 +
 apidoc/html/structpaimon_1_1_offset_range.html     |  272 ++
 apidoc/html/structpaimon_1_1_options-members.html  |  259 ++
 apidoc/html/structpaimon_1_1_options.html          | 4833 ++++++++++++++++++++
 apidoc/html/structpaimon_1_1_range-members.html    |  101 +
 apidoc/html/structpaimon_1_1_range.html            |  460 ++
 .../html/structpaimon_1_1_read_hints-members.html  |   91 +
 apidoc/html/structpaimon_1_1_read_hints.html       |  143 +
 ...aimon_1_1_realtime_commit_progress-members.html |   92 +
 .../structpaimon_1_1_realtime_commit_progress.html |  162 +
 ...imon_1_1_realtime_partition_bucket-members.html |   95 +
 ...structpaimon_1_1_realtime_partition_bucket.html |  282 ++
 ...tpaimon_1_1_realtime_query_context-members.html |   92 +
 .../structpaimon_1_1_realtime_query_context.html   |  163 +
 ..._1_1_realtime_store_create_request-members.html |   96 +
 ...ctpaimon_1_1_realtime_store_create_request.html |  240 +
 ...imon_1_1_realtime_store_data_usage-members.html |   93 +
 ...structpaimon_1_1_realtime_store_data_usage.html |  169 +
 ...uctpaimon_1_1_realtime_write_batch-members.html |   91 +
 .../structpaimon_1_1_realtime_write_batch.html     |  143 +
 .../structpaimon_1_1_snapshot_info-members.html    |   99 +
 apidoc/html/structpaimon_1_1_snapshot_info.html    |  315 ++
 .../structpaimon_1_1_status_1_1_state-members.html |   92 +
 apidoc/html/structpaimon_1_1_status_1_1_state.html |  145 +
 ...structpaimon_1_1_variant_cast_args-members.html |   91 +
 .../html/structpaimon_1_1_variant_cast_args.html   |  143 +
 .../structpaimon_1_1_vector_search-members.html    |  100 +
 apidoc/html/structpaimon_1_1_vector_search.html    |  408 ++
 ...ash_3_01paimon_1_1_identifier_01_4-members.html |   90 +
 ...std_1_1hash_3_01paimon_1_1_identifier_01_4.html |  125 +
 ...1hash_3_1_1paimon_1_1_literal_01_4-members.html |   90 +
 ...ctstd_1_1hash_3_1_1paimon_1_1_literal_01_4.html |  125 +
 apidoc/html/sync_off.png                           |  Bin 0 -> 853 bytes
 apidoc/html/sync_on.png                            |  Bin 0 -> 845 bytes
 apidoc/html/tab_a.png                              |  Bin 0 -> 142 bytes
 apidoc/html/tab_ad.png                             |  Bin 0 -> 135 bytes
 apidoc/html/tab_b.png                              |  Bin 0 -> 169 bytes
 apidoc/html/tab_bd.png                             |  Bin 0 -> 173 bytes
 apidoc/html/tab_h.png                              |  Bin 0 -> 177 bytes
 apidoc/html/tab_hd.png                             |  Bin 0 -> 180 bytes
 apidoc/html/tab_s.png                              |  Bin 0 -> 184 bytes
 apidoc/html/tab_sd.png                             |  Bin 0 -> 188 bytes
 apidoc/html/table_8h.html                          |  115 +
 apidoc/html/table_8h_source.html                   |  198 +
 apidoc/html/table__read_8h.html                    |  113 +
 apidoc/html/table__read_8h_source.html             |  160 +
 apidoc/html/table__scan_8h.html                    |  113 +
 apidoc/html/table__scan_8h_source.html             |  155 +
 apidoc/html/tabs.css                               |    1 +
 apidoc/html/timestamp_8h.html                      |  110 +
 apidoc/html/timestamp_8h_source.html               |  241 +
 apidoc/html/type__fwd_8h.html                      |  111 +
 apidoc/html/type__fwd_8h_source.html               |  201 +
 apidoc/html/variant_8h.html                        |  120 +
 apidoc/html/variant_8h_source.html                 |  230 +
 apidoc/html/vector__search_8h.html                 |  112 +
 apidoc/html/vector__search_8h_source.html          |  175 +
 apidoc/html/visibility_8h.html                     |  127 +
 apidoc/html/visibility_8h_source.html              |  138 +
 apidoc/html/write__context_8h.html                 |  117 +
 apidoc/html/write__context_8h_source.html          |  410 ++
 apidoc/html/writer__builder_8h.html                |  113 +
 apidoc/html/writer__builder_8h_source.html         |  161 +
 apidoc/html/written__file__stats__provider_8h.html |  107 +
 .../written__file__stats__provider_8h_source.html  |  137 +
 apidoc/xml/Doxyfile.xml                            |  375 ++
 apidoc/xml/abi_8h.xml                              |  164 +
 apidoc/xml/api_8h.xml                              | 1087 +++++
 apidoc/xml/append__compact__coordinator_8h.xml     |  178 +
 apidoc/xml/arrow__realtime__store__factory_8h.xml  |  398 ++
 apidoc/xml/batch__reader_8h.xml                    |  417 ++
 apidoc/xml/bitmap__global__index__result_8h.xml    |  397 ++
 apidoc/xml/bitmap__index__result_8h.xml            |  339 ++
 .../bitmap__scored__global__index__result_8h.xml   |  404 ++
 apidoc/xml/blob_8h.xml                             |  326 ++
 apidoc/xml/blob__descriptor_8h.xml                 |  260 ++
 apidoc/xml/blob__view_8h.xml                       |  291 ++
 apidoc/xml/bucket__function__type_8h.xml           |  106 +
 apidoc/xml/bucket__id__calculator_8h.xml           |  265 ++
 apidoc/xml/buffered__input__stream_8h.xml          |  244 +
 apidoc/xml/byte__array__input__stream_8h.xml       |  354 ++
 apidoc/xml/byte__order_8h.xml                      |  136 +
 apidoc/xml/bytes_8h.xml                            |  387 ++
 apidoc/xml/cache_8h.xml                            |  355 ++
 apidoc/xml/catalog_8h.xml                          |  349 ++
 apidoc/xml/catalog__options_8h.xml                 |   87 +
 .../classpaimon_1_1_append_compact_coordinator.xml |  134 +
 ...lasspaimon_1_1_arrow_realtime_store_factory.xml |   64 +
 apidoc/xml/classpaimon_1_1_basic_file_status.xml   |  140 +
 apidoc/xml/classpaimon_1_1_batch_reader.xml        |  243 +
 .../xml/classpaimon_1_1_big_int_column_stats.xml   |  106 +
 .../classpaimon_1_1_bitmap_global_index_result.xml |  316 ++
 ...1_1_bitmap_global_index_result_1_1_iterator.xml |  147 +
 apidoc/xml/classpaimon_1_1_bitmap_index_result.xml |  259 ++
 ...aimon_1_1_bitmap_scored_global_index_result.xml |  307 ++
 ...red_global_index_result_1_1_scored_iterator.xml |  189 +
 apidoc/xml/classpaimon_1_1_blob.xml                |  380 ++
 apidoc/xml/classpaimon_1_1_blob_descriptor.xml     |  378 ++
 .../xml/classpaimon_1_1_boolean_column_stats.xml   |  106 +
 .../xml/classpaimon_1_1_bucket_id_calculator.xml   |  422 ++
 .../xml/classpaimon_1_1_buffered_input_stream.xml  |  590 +++
 .../classpaimon_1_1_byte_array_input_stream.xml    |  456 ++
 apidoc/xml/classpaimon_1_1_bytes.xml               |  550 +++
 apidoc/xml/classpaimon_1_1_cache.xml               |  126 +
 apidoc/xml/classpaimon_1_1_cache_config.xml        |  286 ++
 apidoc/xml/classpaimon_1_1_cache_key.xml           |  198 +
 apidoc/xml/classpaimon_1_1_cache_value.xml         |  152 +
 apidoc/xml/classpaimon_1_1_catalog.xml             |  942 ++++
 apidoc/xml/classpaimon_1_1_clean_context.xml       |  290 ++
 .../xml/classpaimon_1_1_clean_context_builder.xml  |  328 ++
 apidoc/xml/classpaimon_1_1_column_stats.xml        |  520 +++
 apidoc/xml/classpaimon_1_1_commit_context.xml      |  554 +++
 .../xml/classpaimon_1_1_commit_context_builder.xml |  494 ++
 apidoc/xml/classpaimon_1_1_commit_message.xml      |  310 ++
 apidoc/xml/classpaimon_1_1_compound_predicate.xml  |  187 +
 apidoc/xml/classpaimon_1_1_count_reader.xml        |   48 +
 apidoc/xml/classpaimon_1_1_credential_provider.xml |   78 +
 ...classpaimon_1_1_credential_provider_factory.xml |  106 +
 apidoc/xml/classpaimon_1_1_data_input_stream.xml   |  383 ++
 apidoc/xml/classpaimon_1_1_data_schema.xml         |  196 +
 apidoc/xml/classpaimon_1_1_data_split.xml          |   81 +
 apidoc/xml/classpaimon_1_1_database.xml            |   87 +
 apidoc/xml/classpaimon_1_1_date_column_stats.xml   |  106 +
 apidoc/xml/classpaimon_1_1_decimal.xml             |  671 +++
 .../xml/classpaimon_1_1_decimal_column_stats.xml   |  136 +
 .../xml/classpaimon_1_1_direct_writer_builder.xml  |   79 +
 apidoc/xml/classpaimon_1_1_double_column_stats.xml |  106 +
 apidoc/xml/classpaimon_1_1_executor.xml            |   97 +
 apidoc/xml/classpaimon_1_1_factory.xml             |   89 +
 apidoc/xml/classpaimon_1_1_factory_creator.xml     |  206 +
 apidoc/xml/classpaimon_1_1_file_batch_reader.xml   |  270 ++
 apidoc/xml/classpaimon_1_1_file_format.xml         |  120 +
 apidoc/xml/classpaimon_1_1_file_format_factory.xml |  108 +
 apidoc/xml/classpaimon_1_1_file_index_format.xml   |  222 +
 ...lasspaimon_1_1_file_index_format_1_1_reader.xml |   76 +
 ...lasspaimon_1_1_file_index_format_1_1_writer.xml |   68 +
 apidoc/xml/classpaimon_1_1_file_index_reader.xml   |  332 ++
 apidoc/xml/classpaimon_1_1_file_index_result.xml   |  203 +
 apidoc/xml/classpaimon_1_1_file_index_writer.xml   |   85 +
 apidoc/xml/classpaimon_1_1_file_indexer.xml        |  156 +
 .../xml/classpaimon_1_1_file_indexer_factory.xml   |  105 +
 apidoc/xml/classpaimon_1_1_file_meta_utils.xml     |  141 +
 apidoc/xml/classpaimon_1_1_file_status.xml         |  271 ++
 apidoc/xml/classpaimon_1_1_file_store_commit.xml   |  622 +++
 apidoc/xml/classpaimon_1_1_file_store_write.xml    |  312 ++
 apidoc/xml/classpaimon_1_1_file_system.xml         |  590 +++
 apidoc/xml/classpaimon_1_1_file_system_factory.xml |  101 +
 apidoc/xml/classpaimon_1_1_float_column_stats.xml  |  106 +
 .../xml/classpaimon_1_1_format_stats_extractor.xml |   89 +
 ...on_1_1_format_stats_extractor_1_1_file_info.xml |   68 +
 apidoc/xml/classpaimon_1_1_format_table.xml        |  727 +++
 apidoc/xml/classpaimon_1_1_format_writer.xml       |  199 +
 apidoc/xml/classpaimon_1_1_function.xml            |  206 +
 apidoc/xml/classpaimon_1_1_function_visitor.xml    |  333 ++
 ...on_1_1_global_index_checkpoint_file_manager.xml |  112 +
 .../classpaimon_1_1_global_index_file_reader.xml   |   52 +
 .../classpaimon_1_1_global_index_file_writer.xml   |  115 +
 apidoc/xml/classpaimon_1_1_global_index_reader.xml |  139 +
 apidoc/xml/classpaimon_1_1_global_index_result.xml |  351 ++
 ...paimon_1_1_global_index_result_1_1_iterator.xml |   81 +
 apidoc/xml/classpaimon_1_1_global_index_scan.xml   |  401 ++
 .../classpaimon_1_1_global_index_write_task.xml    |  166 +
 apidoc/xml/classpaimon_1_1_global_index_writer.xml |   92 +
 apidoc/xml/classpaimon_1_1_global_indexer.xml      |  200 +
 .../xml/classpaimon_1_1_global_indexer_factory.xml |  146 +
 apidoc/xml/classpaimon_1_1_identifier.xml          |  476 ++
 apidoc/xml/classpaimon_1_1_indexed_split.xml       |   99 +
 apidoc/xml/classpaimon_1_1_input_stream.xml        |  374 ++
 apidoc/xml/classpaimon_1_1_int_column_stats.xml    |  106 +
 apidoc/xml/classpaimon_1_1_lazy_instantiation.xml  |   66 +
 apidoc/xml/classpaimon_1_1_leaf_predicate.xml      |  288 ++
 apidoc/xml/classpaimon_1_1_literal.xml             |  526 +++
 apidoc/xml/classpaimon_1_1_logger.xml              |  162 +
 ...mon_1_1_map_shared_shredding_access_builder.xml |  146 +
 ...aimon_1_1_map_shared_shredding_schema_utils.xml |  192 +
 apidoc/xml/classpaimon_1_1_memory_pool.xml         |  413 ++
 ...paimon_1_1_memory_pool_1_1_allocator_delete.xml |  257 ++
 apidoc/xml/classpaimon_1_1_memory_segment.xml      |  759 +++
 apidoc/xml/classpaimon_1_1_metrics.xml             |  350 ++
 apidoc/xml/classpaimon_1_1_nested_column_stats.xml |  159 +
 .../xml/classpaimon_1_1_orphan_files_cleaner.xml   |  129 +
 apidoc/xml/classpaimon_1_1_output_stream.xml       |  153 +
 apidoc/xml/classpaimon_1_1_plan.xml                |   64 +
 apidoc/xml/classpaimon_1_1_predicate.xml           |  130 +
 apidoc/xml/classpaimon_1_1_predicate_builder.xml   |  704 +++
 apidoc/xml/classpaimon_1_1_predicate_utils.xml     |  262 ++
 .../classpaimon_1_1_prefetch_file_batch_reader.xml |  262 ++
 apidoc/xml/classpaimon_1_1_prefetch_io_metrics.xml |  242 +
 apidoc/xml/classpaimon_1_1_prefetch_metrics.xml    |  257 ++
 apidoc/xml/classpaimon_1_1_read_context.xml        |  952 ++++
 .../xml/classpaimon_1_1_read_context_builder.xml   | 1048 +++++
 apidoc/xml/classpaimon_1_1_reader_builder.xml      |  114 +
 apidoc/xml/classpaimon_1_1_realtime_context.xml    |  115 +
 apidoc/xml/classpaimon_1_1_realtime_metrics.xml    |  145 +
 apidoc/xml/classpaimon_1_1_realtime_read_view.xml  |   49 +
 .../classpaimon_1_1_realtime_segment_handle.xml    |   65 +
 .../classpaimon_1_1_realtime_snapshot_offsets.xml  |  127 +
 apidoc/xml/classpaimon_1_1_realtime_store.xml      |  188 +
 .../xml/classpaimon_1_1_realtime_store_factory.xml |   67 +
 apidoc/xml/classpaimon_1_1_record_batch.xml        |  361 ++
 .../xml/classpaimon_1_1_record_batch_builder.xml   |  234 +
 apidoc/xml/classpaimon_1_1_remain.xml              |  132 +
 apidoc/xml/classpaimon_1_1_result.xml              |  701 +++
 apidoc/xml/classpaimon_1_1_roaring_bitmap32.xml    |  829 ++++
 ...asspaimon_1_1_roaring_bitmap32_1_1_iterator.xml |  229 +
 apidoc/xml/classpaimon_1_1_roaring_bitmap64.xml    |  812 ++++
 ...asspaimon_1_1_roaring_bitmap64_1_1_iterator.xml |  249 +
 apidoc/xml/classpaimon_1_1_row_range_index.xml     |  239 +
 apidoc/xml/classpaimon_1_1_scan_context.xml        |  496 ++
 .../xml/classpaimon_1_1_scan_context_builder.xml   |  537 +++
 apidoc/xml/classpaimon_1_1_scan_filter.xml         |  136 +
 apidoc/xml/classpaimon_1_1_scan_metrics.xml        |  305 ++
 apidoc/xml/classpaimon_1_1_schema.xml              |  161 +
 .../classpaimon_1_1_scored_global_index_result.xml |   89 +
 ...red_global_index_result_1_1_scored_iterator.xml |   91 +
 apidoc/xml/classpaimon_1_1_singleton.xml           |  124 +
 apidoc/xml/classpaimon_1_1_skip.xml                |  132 +
 .../xml/classpaimon_1_1_small_int_column_stats.xml |  106 +
 apidoc/xml/classpaimon_1_1_snapshot_file_scan.xml  |  167 +
 apidoc/xml/classpaimon_1_1_special_field_ids.xml   |  156 +
 ...classpaimon_1_1_specific_f_s_writer_builder.xml |   79 +
 apidoc/xml/classpaimon_1_1_split.xml               |  158 +
 apidoc/xml/classpaimon_1_1_startup_mode.xml        |  212 +
 apidoc/xml/classpaimon_1_1_status.xml              | 1227 +++++
 apidoc/xml/classpaimon_1_1_status_detail.xml       |   83 +
 apidoc/xml/classpaimon_1_1_stream.xml              |   82 +
 apidoc/xml/classpaimon_1_1_string_column_stats.xml |  106 +
 apidoc/xml/classpaimon_1_1_system_schema.xml       |   63 +
 apidoc/xml/classpaimon_1_1_table.xml               |  277 ++
 apidoc/xml/classpaimon_1_1_table_read.xml          |  155 +
 apidoc/xml/classpaimon_1_1_table_scan.xml          |  125 +
 apidoc/xml/classpaimon_1_1_timestamp.xml           |  422 ++
 .../xml/classpaimon_1_1_timestamp_column_stats.xml |  121 +
 .../xml/classpaimon_1_1_tiny_int_column_stats.xml  |  106 +
 apidoc/xml/classpaimon_1_1_variant.xml             |  498 ++
 .../xml/classpaimon_1_1_variant_access_builder.xml |  157 +
 apidoc/xml/classpaimon_1_1_write_context.xml       |  704 +++
 .../xml/classpaimon_1_1_write_context_builder.xml  |  649 +++
 apidoc/xml/classpaimon_1_1_writer_builder.xml      |   96 +
 ...classpaimon_1_1_written_file_stats_provider.xml |   67 +
 ...asspaimon_1_1util_1_1_to_string_ostreamable.xml |   79 +
 apidoc/xml/column__stats_8h.xml                    |  387 ++
 apidoc/xml/combine.xslt                            |   15 +
 apidoc/xml/commit__context_8h.xml                  |  375 ++
 apidoc/xml/commit__message_8h.xml                  |  279 ++
 apidoc/xml/compound.xsd                            | 1635 +++++++
 apidoc/xml/compound__predicate_8h.xml              |  120 +
 apidoc/xml/count__reader_8h.xml                    |  172 +
 apidoc/xml/credential__provider_8h.xml             |  187 +
 apidoc/xml/credential__provider__factory_8h.xml    |  238 +
 apidoc/xml/data__input__stream_8h.xml              |  212 +
 apidoc/xml/data__split_8h.xml                      |  321 ++
 apidoc/xml/database_8h.xml                         |  233 +
 apidoc/xml/decimal_8h.xml                          |  194 +
 apidoc/xml/defs_8h.xml                             |  757 +++
 .../xml/dir_071215c78c595cca951c617169b821c1.xml   |   12 +
 .../xml/dir_0d1b380af7e32596045120d77ba9b953.xml   |   15 +
 .../xml/dir_0f736ee9f7b875cfa3ccf35bccf64319.xml   |   14 +
 .../xml/dir_1585cef52ab3ac100252476d26968f2e.xml   |   17 +
 .../xml/dir_442f7bf186c1815f29c09fb4f8a71f54.xml   |   12 +
 .../xml/dir_60649a063c079650afe6e44ab3cf8648.xml   |   14 +
 .../xml/dir_8a3f51232b30aedc137e04a4b3fb61f7.xml   |   18 +
 .../xml/dir_8c33e2f80e7e3dd00d6913e1209b2ab6.xml   |   12 +
 .../xml/dir_922ec61c57e641d58003ea84c9c1afa3.xml   |   18 +
 .../xml/dir_94827ce922f878ac02e1d2e2a28038d9.xml   |   20 +
 .../xml/dir_9c552d3700583f259251ef2f8e23912b.xml   |   15 +
 .../xml/dir_9ce711e6a3bbe1bbf07b1bcf67e13462.xml   |   12 +
 .../xml/dir_9d0854483e08622e360d2b66c7bb9c9b.xml   |   18 +
 .../xml/dir_a902f9c9d3b901767da91dcbe47e876e.xml   |   12 +
 .../xml/dir_c303d81fcec65aef767d65e2c1798f68.xml   |   15 +
 .../xml/dir_cc0e6aa30e69893d19cbbbcd50019a13.xml   |   13 +
 .../xml/dir_d44c64559bbebec7f509842c48db8b23.xml   |   12 +
 .../xml/dir_d50fe60c21edeba613032393f5bb145e.xml   |   17 +
 .../xml/dir_d5ce83a91c1ada980bd794a9f3314520.xml   |   53 +
 .../xml/dir_dbd2ce2385aeb987927f6f62ed9951a0.xml   |   12 +
 .../xml/dir_df042af7cbf742b9cd067fda6cb9a7fc.xml   |   15 +
 .../xml/dir_e6a1c9ffd133f63dd611899f4f180300.xml   |   23 +
 .../xml/dir_e77ec7fe12e8f4dc339142724a1dbbea.xml   |   12 +
 .../xml/dir_e9a132d0f1069a9817aeb5f444052536.xml   |   13 +
 .../xml/dir_e9e9def0e1178aa8ef569fa20d859019.xml   |   14 +
 .../xml/dir_f621b1b7a8e367ca76a53c102fbe25fe.xml   |   21 +
 .../xml/dir_ff5841d25cf2365d87149f1890cfa318.xml   |   13 +
 apidoc/xml/doxyfile.xsd                            |   45 +
 apidoc/xml/executor_8h.xml                         |  222 +
 apidoc/xml/factory_8h.xml                          |  188 +
 apidoc/xml/factory__creator_8h.xml                 |  181 +
 apidoc/xml/file__batch__reader_8h.xml              |  412 ++
 apidoc/xml/file__format_8h.xml                     |  451 ++
 apidoc/xml/file__format__factory_8h.xml            |  225 +
 apidoc/xml/file__index__format_8h.xml              |  345 ++
 apidoc/xml/file__index__reader_8h.xml              |  327 ++
 apidoc/xml/file__index__result_8h.xml              |  253 +
 apidoc/xml/file__index__writer_8h.xml              |  236 +
 apidoc/xml/file__indexer_8h.xml                    |  388 ++
 apidoc/xml/file__indexer__factory_8h.xml           |  224 +
 apidoc/xml/file__meta__utils_8h.xml                |  239 +
 apidoc/xml/file__store__commit_8h.xml              |  426 ++
 apidoc/xml/file__store__write_8h.xml               |  400 ++
 apidoc/xml/file__system_8h.xml                     |  497 ++
 apidoc/xml/file__system__factory_8h.xml            |  267 ++
 apidoc/xml/format__stats__extractor_8h.xml         |  242 +
 apidoc/xml/format__table_8h.xml                    |  372 ++
 apidoc/xml/format__writer_8h.xml                   |  195 +
 apidoc/xml/full__text__search_8h.xml               |  404 ++
 apidoc/xml/function_8h.xml                         |  244 +
 apidoc/xml/function__visitor_8h.xml                |  323 ++
 ...global__index__checkpoint__file__manager_8h.xml |  172 +
 apidoc/xml/global__index__file__reader_8h.xml      |  175 +
 apidoc/xml/global__index__file__writer_8h.xml      |  207 +
 apidoc/xml/global__index__io__meta_8h.xml          |  161 +
 apidoc/xml/global__index__reader_8h.xml            |  511 +++
 apidoc/xml/global__index__result_8h.xml            |  347 ++
 apidoc/xml/global__index__scan_8h.xml              |  563 +++
 apidoc/xml/global__index__write__task_8h.xml       |  330 ++
 apidoc/xml/global__index__writer_8h.xml            |  244 +
 apidoc/xml/global__indexer_8h.xml                  |  581 +++
 apidoc/xml/global__indexer__factory_8h.xml         |  227 +
 apidoc/xml/identifier_8h.xml                       |  336 ++
 apidoc/xml/index.xml                               | 2668 +++++++++++
 apidoc/xml/index.xsd                               |   72 +
 apidoc/xml/indexed__split_8h.xml                   |  314 ++
 apidoc/xml/leaf__predicate_8h.xml                  |  320 ++
 apidoc/xml/literal_8h.xml                          |  307 ++
 apidoc/xml/logging_8h.xml                          |  208 +
 .../map__shared__shredding__schema__utils_8h.xml   |  252 +
 apidoc/xml/memory__pool_8h.xml                     |  573 +++
 apidoc/xml/memory__segment_8h.xml                  |  363 ++
 apidoc/xml/metrics_8h.xml                          |  274 ++
 apidoc/xml/namespacepaimon.xml                     |  992 ++++
 apidoc/xml/namespacepaimon_1_1util.xml             |  102 +
 apidoc/xml/namespacestd.xml                        |   13 +
 apidoc/xml/namespaceutil.xml                       |   11 +
 apidoc/xml/offset__range_8h.xml                    |  129 +
 apidoc/xml/orphan__files__cleaner_8h.xml           |  316 ++
 apidoc/xml/plan_8h.xml                             |  241 +
 apidoc/xml/predicate_8h.xml                        |  254 +
 apidoc/xml/predicate__builder_8h.xml               |  269 ++
 apidoc/xml/predicate__utils_8h.xml                 |  391 ++
 apidoc/xml/prefetch__cache__config_8h.xml          |  173 +
 apidoc/xml/prefetch__file__batch__reader_8h.xml    |  441 ++
 apidoc/xml/range_8h.xml                            |  186 +
 apidoc/xml/read__context_8h.xml                    |  620 +++
 apidoc/xml/read__hints_8h.xml                      |   77 +
 apidoc/xml/reader__builder_8h.xml                  |  424 ++
 apidoc/xml/realtime__commit__progress_8h.xml       |  295 ++
 apidoc/xml/realtime__context_8h.xml                |  329 ++
 apidoc/xml/realtime__snapshot__offsets_8h.xml      |  275 ++
 apidoc/xml/realtime__store_8h.xml                  |  526 +++
 apidoc/xml/record__batch_8h.xml                    |  276 ++
 apidoc/xml/result_8h.xml                           | 1126 +++++
 apidoc/xml/roaring__bitmap32_8h.xml                |  492 ++
 apidoc/xml/roaring__bitmap64_8h.xml                |  444 ++
 apidoc/xml/row__range__index_8h.xml                |  219 +
 apidoc/xml/scan__context_8h.xml                    |  561 +++
 apidoc/xml/scan__metrics_8h.xml                    |  100 +
 apidoc/xml/schema_8h.xml                           |  252 +
 apidoc/xml/singleton_8h.xml                        |  196 +
 apidoc/xml/snapshot__file__scan_8h.xml             |  213 +
 apidoc/xml/snapshot__info_8h.xml                   |  109 +
 apidoc/xml/special__field__ids_8h.xml              |   76 +
 apidoc/xml/split_8h.xml                            |  279 ++
 apidoc/xml/startup__mode_8h.xml                    |  174 +
 apidoc/xml/statistics__mode_8h.xml                 |   71 +
 apidoc/xml/status_8h.xml                           | 1323 ++++++
 apidoc/xml/string__builder_8h.xml                  |  878 ++++
 apidoc/xml/struct_arrow_array.xml                  |  176 +
 apidoc/xml/struct_arrow_schema.xml                 |  161 +
 apidoc/xml/structpaimon_1_1_blob_view.xml          |  180 +
 apidoc/xml/structpaimon_1_1_catalog_options.xml    |  276 ++
 ...on_1_1_data_split_1_1_simple_data_file_meta.xml |  255 ++
 apidoc/xml/structpaimon_1_1_full_text_search.xml   |  289 ++
 .../xml/structpaimon_1_1_global_index_i_o_meta.xml |   93 +
 apidoc/xml/structpaimon_1_1_histogram_stats.xml    |  194 +
 apidoc/xml/structpaimon_1_1_hive_field_info.xml    |  112 +
 ...tpaimon_1_1_map_shared_shredding_field_meta.xml |  120 +
 apidoc/xml/structpaimon_1_1_offset_range.xml       |  128 +
 apidoc/xml/structpaimon_1_1_options.xml            | 2884 ++++++++++++
 apidoc/xml/structpaimon_1_1_range.xml              |  292 ++
 apidoc/xml/structpaimon_1_1_read_hints.xml         |   52 +
 .../structpaimon_1_1_realtime_commit_progress.xml  |   86 +
 .../structpaimon_1_1_realtime_partition_bucket.xml |  136 +
 .../structpaimon_1_1_realtime_query_context.xml    |   85 +
 ...uctpaimon_1_1_realtime_store_create_request.xml |  136 +
 .../structpaimon_1_1_realtime_store_data_usage.xml |   82 +
 .../xml/structpaimon_1_1_realtime_write_batch.xml  |   63 +
 apidoc/xml/structpaimon_1_1_snapshot_info.xml      |  210 +
 apidoc/xml/structpaimon_1_1_status_1_1_state.xml   |   60 +
 apidoc/xml/structpaimon_1_1_variant_cast_args.xml  |   52 +
 apidoc/xml/structpaimon_1_1_vector_search.xml      |  268 ++
 ...tstd_1_1hash_3_01paimon_1_1_identifier_01_4.xml |   36 +
 ...uctstd_1_1hash_3_1_1paimon_1_1_literal_01_4.xml |   36 +
 apidoc/xml/table_8h.xml                            |  304 ++
 apidoc/xml/table__read_8h.xml                      |  557 +++
 apidoc/xml/table__scan_8h.xml                      |  317 ++
 apidoc/xml/timestamp_8h.xml                        |  271 ++
 apidoc/xml/type__fwd_8h.xml                        |  452 ++
 apidoc/xml/variant_8h.xml                          |  321 ++
 apidoc/xml/vector__search_8h.xml                   |  173 +
 apidoc/xml/visibility_8h.xml                       | 1413 ++++++
 apidoc/xml/write__context_8h.xml                   |  422 ++
 apidoc/xml/writer__builder_8h.xml                  |  150 +
 apidoc/xml/written__file__stats__provider_8h.xml   |  200 +
 apidoc/xml/xml.xsd                                 |   23 +
 basic_concepts.html                                |  596 +++
 build_system.html                                  |  640 +++
 building.html                                      |  868 ++++
 docs/_build/html/.buildinfo                        |    4 +
 docs/_build/html/.doctrees/api.doctree             |  Bin 0 -> 5864 bytes
 docs/_build/html/.doctrees/api/catalog.doctree     |  Bin 0 -> 263980 bytes
 docs/_build/html/.doctrees/api/clean.doctree       |  Bin 0 -> 148024 bytes
 docs/_build/html/.doctrees/api/commit.doctree      |  Bin 0 -> 426924 bytes
 docs/_build/html/.doctrees/api/data_types.doctree  |  Bin 0 -> 224394 bytes
 docs/_build/html/.doctrees/api/defs.doctree        |  Bin 0 -> 566439 bytes
 docs/_build/html/.doctrees/api/executor.doctree    |  Bin 0 -> 40026 bytes
 docs/_build/html/.doctrees/api/file_format.doctree |  Bin 0 -> 263195 bytes
 docs/_build/html/.doctrees/api/file_index.doctree  |  Bin 0 -> 331161 bytes
 docs/_build/html/.doctrees/api/file_system.doctree |  Bin 0 -> 283730 bytes
 .../_build/html/.doctrees/api/format_table.doctree |  Bin 0 -> 142323 bytes
 .../_build/html/.doctrees/api/global_index.doctree |  Bin 0 -> 594363 bytes
 docs/_build/html/.doctrees/api/io.doctree          |  Bin 0 -> 187662 bytes
 docs/_build/html/.doctrees/api/memory.doctree      |  Bin 0 -> 198154 bytes
 docs/_build/html/.doctrees/api/predicate.doctree   |  Bin 0 -> 440168 bytes
 docs/_build/html/.doctrees/api/read.doctree        |  Bin 0 -> 465226 bytes
 docs/_build/html/.doctrees/api/scan.doctree        |  Bin 0 -> 372435 bytes
 docs/_build/html/.doctrees/api/write.doctree       |  Bin 0 -> 430079 bytes
 docs/_build/html/.doctrees/basic_concepts.doctree  |  Bin 0 -> 13015 bytes
 docs/_build/html/.doctrees/build_system.doctree    |  Bin 0 -> 21019 bytes
 docs/_build/html/.doctrees/building.doctree        |  Bin 0 -> 64094 bytes
 docs/_build/html/.doctrees/documentations.doctree  |  Bin 0 -> 11483 bytes
 docs/_build/html/.doctrees/environment.pickle      |  Bin 0 -> 2916585 bytes
 .../html/.doctrees/examples/benchmark.doctree      |  Bin 0 -> 40873 bytes
 docs/_build/html/.doctrees/examples/clean.doctree  |  Bin 0 -> 5865 bytes
 docs/_build/html/.doctrees/examples/index.doctree  |  Bin 0 -> 5587 bytes
 .../examples/write_commit_scan_read.doctree        |  Bin 0 -> 5965 bytes
 docs/_build/html/.doctrees/getting_started.doctree |  Bin 0 -> 7414 bytes
 docs/_build/html/.doctrees/index.doctree           |  Bin 0 -> 13495 bytes
 docs/_build/html/.doctrees/user_guide.doctree      |  Bin 0 -> 6356 bytes
 .../.doctrees/user_guide/append_only_table.doctree |  Bin 0 -> 6286 bytes
 .../_build/html/.doctrees/user_guide/arrow.doctree |  Bin 0 -> 23720 bytes
 .../html/.doctrees/user_guide/catalog.doctree      |  Bin 0 -> 82522 bytes
 .../_build/html/.doctrees/user_guide/clean.doctree |  Bin 0 -> 42733 bytes
 .../html/.doctrees/user_guide/commit.doctree       |  Bin 0 -> 24034 bytes
 .../html/.doctrees/user_guide/compaction.doctree   |  Bin 0 -> 58834 bytes
 .../html/.doctrees/user_guide/data_types.doctree   |  Bin 0 -> 61194 bytes
 .../html/.doctrees/user_guide/format_table.doctree |  Bin 0 -> 94229 bytes
 .../html/.doctrees/user_guide/global_index.doctree |  Bin 0 -> 28246 bytes
 .../html/.doctrees/user_guide/manifest.doctree     |  Bin 0 -> 32754 bytes
 .../.doctrees/user_guide/manifest_cache.doctree    |  Bin 0 -> 14612 bytes
 .../user_guide/manifest_entry_cache.doctree        |  Bin 0 -> 15393 bytes
 .../html/.doctrees/user_guide/metrics.doctree      |  Bin 0 -> 54752 bytes
 .../user_guide/parquet_metadata_cache.doctree      |  Bin 0 -> 22962 bytes
 .../html/.doctrees/user_guide/prefetch.doctree     |  Bin 0 -> 11896 bytes
 .../user_guide/primary_key_global_index.doctree    |  Bin 0 -> 24577 bytes
 .../.doctrees/user_guide/primary_key_table.doctree |  Bin 0 -> 27633 bytes
 docs/_build/html/.doctrees/user_guide/read.doctree |  Bin 0 -> 69976 bytes
 .../html/.doctrees/user_guide/schema.doctree       |  Bin 0 -> 17035 bytes
 .../html/.doctrees/user_guide/snapshot.doctree     |  Bin 0 -> 17750 bytes
 .../.doctrees/user_guide/system_tables.doctree     |  Bin 0 -> 12876 bytes
 .../_build/html/.doctrees/user_guide/write.doctree |  Bin 0 -> 59241 bytes
 docs/_build/html/_images/file-layout.png           |  Bin 0 -> 309410 bytes
 docs/_build/html/_images/prefetch.svg              |    4 +
 docs/_build/html/_images/sorted-runs.png           |  Bin 0 -> 181236 bytes
 docs/_build/html/_sources/api.rst.txt              |   41 +
 docs/_build/html/_sources/api/catalog.rst.txt      |   32 +
 docs/_build/html/_sources/api/clean.rst.txt        |   37 +
 docs/_build/html/_sources/api/commit.rst.txt       |   41 +
 docs/_build/html/_sources/api/data_types.rst.txt   |   37 +
 docs/_build/html/_sources/api/defs.rst.txt         |   31 +
 docs/_build/html/_sources/api/executor.rst.txt     |   37 +
 docs/_build/html/_sources/api/file_format.rst.txt  |   57 +
 docs/_build/html/_sources/api/file_index.rst.txt   |   53 +
 docs/_build/html/_sources/api/file_system.rst.txt  |   51 +
 docs/_build/html/_sources/api/format_table.rst.txt |   52 +
 docs/_build/html/_sources/api/global_index.rst.txt |   77 +
 docs/_build/html/_sources/api/io.rst.txt           |   41 +
 docs/_build/html/_sources/api/memory.rst.txt       |   37 +
 docs/_build/html/_sources/api/predicate.rst.txt    |   52 +
 docs/_build/html/_sources/api/read.rst.txt         |   43 +
 docs/_build/html/_sources/api/scan.rst.txt         |   79 +
 docs/_build/html/_sources/api/write.rst.txt        |   45 +
 docs/_build/html/_sources/basic_concepts.rst.txt   |   83 +
 docs/_build/html/_sources/build_system.rst.txt     |  123 +
 docs/_build/html/_sources/building.rst.txt         |  374 ++
 docs/_build/html/_sources/documentations.rst.txt   |   68 +
 .../html/_sources/examples/benchmark.rst.txt       |  213 +
 docs/_build/html/_sources/examples/clean.rst.txt   |   26 +
 docs/_build/html/_sources/examples/index.rst.txt   |   26 +
 .../examples/write_commit_scan_read.rst.txt        |   26 +
 docs/_build/html/_sources/getting_started.rst.txt  |   37 +
 docs/_build/html/_sources/index.rst.txt            |  108 +
 docs/_build/html/_sources/user_guide.rst.txt       |   47 +
 .../_sources/user_guide/append_only_table.rst.txt  |   26 +
 docs/_build/html/_sources/user_guide/arrow.rst.txt |  125 +
 .../html/_sources/user_guide/catalog.rst.txt       |  417 ++
 docs/_build/html/_sources/user_guide/clean.rst.txt |  169 +
 .../_build/html/_sources/user_guide/commit.rst.txt |  126 +
 .../html/_sources/user_guide/compaction.rst.txt    |  308 ++
 .../html/_sources/user_guide/data_types.rst.txt    |  319 ++
 .../html/_sources/user_guide/format_table.rst.txt  |  355 ++
 .../html/_sources/user_guide/global_index.rst.txt  |  108 +
 .../html/_sources/user_guide/manifest.rst.txt      |  132 +
 .../_sources/user_guide/manifest_cache.rst.txt     |   96 +
 .../user_guide/manifest_entry_cache.rst.txt        |   91 +
 .../html/_sources/user_guide/metrics.rst.txt       |  116 +
 .../user_guide/parquet_metadata_cache.rst.txt      |  143 +
 .../html/_sources/user_guide/prefetch.rst.txt      |   72 +
 .../user_guide/primary_key_global_index.rst.txt    |   93 +
 .../_sources/user_guide/primary_key_table.rst.txt  |  154 +
 docs/_build/html/_sources/user_guide/read.rst.txt  |  352 ++
 .../_build/html/_sources/user_guide/schema.rst.txt |  111 +
 .../html/_sources/user_guide/snapshot.rst.txt      |   68 +
 .../html/_sources/user_guide/system_tables.rst.txt |   70 +
 docs/_build/html/_sources/user_guide/write.rst.txt |  262 ++
 .../html/_sphinx_design_static/design-tabs.js      |  101 +
 .../_sphinx_design_static/sphinx-design.min.css    |    1 +
 docs/_build/html/_static/base-stemmer.js           |  476 ++
 docs/_build/html/_static/basic.css                 |  906 ++++
 docs/_build/html/_static/check-solid.svg           |    4 +
 docs/_build/html/_static/clipboard.min.js          |    7 +
 docs/_build/html/_static/copy-button.svg           |    5 +
 docs/_build/html/_static/copybutton.css            |   94 +
 docs/_build/html/_static/copybutton.js             |  248 +
 docs/_build/html/_static/copybutton_funcs.js       |   73 +
 docs/_build/html/_static/design-tabs.js            |  101 +
 docs/_build/html/_static/doctools.js               |  150 +
 docs/_build/html/_static/documentation_options.js  |   13 +
 docs/_build/html/_static/english-stemmer.js        | 1066 +++++
 docs/_build/html/_static/file-layout.png           |  Bin 0 -> 309410 bytes
 docs/_build/html/_static/file.png                  |  Bin 0 -> 286 bytes
 docs/_build/html/_static/language_data.js          |   13 +
 docs/_build/html/_static/minus.png                 |  Bin 0 -> 90 bytes
 docs/_build/html/_static/plus.png                  |  Bin 0 -> 90 bytes
 docs/_build/html/_static/prefetch.svg              |    4 +
 docs/_build/html/_static/pygments.css              |  152 +
 docs/_build/html/_static/scripts/bootstrap.js      |    3 +
 .../html/_static/scripts/bootstrap.js.LICENSE.txt  |    5 +
 docs/_build/html/_static/scripts/bootstrap.js.map  |    1 +
 docs/_build/html/_static/scripts/fontawesome.js    |    3 +
 .../_static/scripts/fontawesome.js.LICENSE.txt     |    5 +
 .../_build/html/_static/scripts/fontawesome.js.map |    1 +
 .../html/_static/scripts/pydata-sphinx-theme.js    |    2 +
 .../_static/scripts/pydata-sphinx-theme.js.map     |    1 +
 docs/_build/html/_static/searchtools.js            |  693 +++
 docs/_build/html/_static/sorted-runs.png           |  Bin 0 -> 181236 bytes
 docs/_build/html/_static/sphinx-design.min.css     |    1 +
 docs/_build/html/_static/sphinx_highlight.js       |  159 +
 .../html/_static/styles/pydata-sphinx-theme.css    |   27 +
 .../_static/styles/pydata-sphinx-theme.css.map     |    1 +
 docs/_build/html/_static/styles/theme.css          |    2 +
 docs/_build/html/_static/theme_overrides.css       |   86 +
 .../fontawesome/webfonts/fa-brands-400.woff2       |  Bin 0 -> 110088 bytes
 .../fontawesome/webfonts/fa-regular-400.woff2      |  Bin 0 -> 18924 bytes
 .../vendor/fontawesome/webfonts/fa-solid-900.woff2 |  Bin 0 -> 114740 bytes
 docs/_build/html/_static/versions.json             |    7 +
 docs/_build/html/_static/webpack-macros.html       |   24 +
 docs/_build/html/api.html                          |  819 ++++
 docs/_build/html/api/catalog.html                  | 1061 +++++
 docs/_build/html/api/clean.html                    |  850 ++++
 docs/_build/html/api/commit.html                   | 1331 ++++++
 docs/_build/html/api/data_types.html               | 1058 +++++
 docs/_build/html/api/defs.html                     | 2041 +++++++++
 docs/_build/html/api/executor.html                 |  632 +++
 docs/_build/html/api/file_format.html              | 1087 +++++
 docs/_build/html/api/file_index.html               | 1169 +++++
 docs/_build/html/api/file_system.html              | 1229 +++++
 docs/_build/html/api/format_table.html             |  797 ++++
 docs/_build/html/api/global_index.html             | 1593 +++++++
 docs/_build/html/api/io.html                       | 1027 +++++
 docs/_build/html/api/memory.html                   | 1007 ++++
 docs/_build/html/api/predicate.html                | 1386 ++++++
 docs/_build/html/api/read.html                     | 1556 +++++++
 docs/_build/html/api/scan.html                     | 1263 +++++
 docs/_build/html/api/write.html                    | 1416 ++++++
 docs/_build/html/basic_concepts.html               |  596 +++
 docs/_build/html/build_system.html                 |  640 +++
 docs/_build/html/building.html                     |  868 ++++
 docs/_build/html/documentations.html               |  579 +++
 docs/_build/html/examples/benchmark.html           |  715 +++
 docs/_build/html/examples/clean.html               |  526 +++
 docs/_build/html/examples/index.html               |  528 +++
 .../html/examples/write_commit_scan_read.html      |  526 +++
 docs/_build/html/genindex.html                     | 2840 ++++++++++++
 docs/_build/html/getting_started.html              |  578 +++
 docs/_build/html/index.html                        |  531 +++
 docs/_build/html/objects.inv                       |  Bin 0 -> 45659 bytes
 docs/_build/html/search.html                       |  811 ++++
 docs/_build/html/searchindex.js                    |    1 +
 docs/_build/html/user_guide.html                   |  770 ++++
 docs/_build/html/user_guide/append_only_table.html |  550 +++
 docs/_build/html/user_guide/arrow.html             |  670 +++
 docs/_build/html/user_guide/catalog.html           |  936 ++++
 docs/_build/html/user_guide/clean.html             |  734 +++
 docs/_build/html/user_guide/commit.html            |  670 +++
 docs/_build/html/user_guide/compaction.html        |  886 ++++
 docs/_build/html/user_guide/data_types.html        |  832 ++++
 docs/_build/html/user_guide/format_table.html      |  866 ++++
 docs/_build/html/user_guide/global_index.html      |  652 +++
 docs/_build/html/user_guide/manifest.html          |  668 +++
 docs/_build/html/user_guide/manifest_cache.html    |  632 +++
 .../html/user_guide/manifest_entry_cache.html      |  624 +++
 docs/_build/html/user_guide/metrics.html           |  880 ++++
 .../html/user_guide/parquet_metadata_cache.html    |  673 +++
 docs/_build/html/user_guide/prefetch.html          |  607 +++
 .../html/user_guide/primary_key_global_index.html  |  634 +++
 docs/_build/html/user_guide/primary_key_table.html |  681 +++
 docs/_build/html/user_guide/read.html              |  930 ++++
 docs/_build/html/user_guide/schema.html            |  644 +++
 docs/_build/html/user_guide/snapshot.html          |  602 +++
 docs/_build/html/user_guide/system_tables.html     |  605 +++
 docs/_build/html/user_guide/write.html             |  818 ++++
 documentations.html                                |  579 +++
 examples/benchmark.html                            |  715 +++
 examples/clean.html                                |  526 +++
 examples/index.html                                |  528 +++
 examples/write_commit_scan_read.html               |  526 +++
 genindex.html                                      | 2840 ++++++++++++
 getting_started.html                               |  578 +++
 index.html                                         |  531 +++
 objects.inv                                        |  Bin 0 -> 45659 bytes
 search.html                                        |  811 ++++
 searchindex.js                                     |    1 +
 user_guide.html                                    |  770 ++++
 user_guide/append_only_table.html                  |  550 +++
 user_guide/arrow.html                              |  670 +++
 user_guide/catalog.html                            |  936 ++++
 user_guide/clean.html                              |  734 +++
 user_guide/commit.html                             |  670 +++
 user_guide/compaction.html                         |  886 ++++
 user_guide/data_types.html                         |  832 ++++
 user_guide/format_table.html                       |  866 ++++
 user_guide/global_index.html                       |  652 +++
 user_guide/manifest.html                           |  668 +++
 user_guide/manifest_cache.html                     |  632 +++
 user_guide/manifest_entry_cache.html               |  624 +++
 user_guide/metrics.html                            |  880 ++++
 user_guide/parquet_metadata_cache.html             |  673 +++
 user_guide/prefetch.html                           |  607 +++
 user_guide/primary_key_global_index.html           |  634 +++
 user_guide/primary_key_table.html                  |  681 +++
 user_guide/read.html                               |  930 ++++
 user_guide/schema.html                             |  644 +++
 user_guide/snapshot.html                           |  602 +++
 user_guide/system_tables.html                      |  605 +++
 user_guide/write.html                              |  818 ++++
 1663 files changed, 364838 insertions(+)

diff --git a/.nojekyll b/.nojekyll
new file mode 100644
index 00000000..e69de29b
diff --git a/_images/file-layout.png b/_images/file-layout.png
new file mode 100644
index 00000000..0fe5f437
Binary files /dev/null and b/_images/file-layout.png differ
diff --git a/_images/prefetch.svg b/_images/prefetch.svg
new file mode 100644
index 00000000..1db39eed
--- /dev/null
+++ b/_images/prefetch.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1001.64453125 357.6796875" width="2003.2890625" height="715.359375"><!-- svg-source:excalidraw --><metadata></metadata><defs><style class="style-fonts">
+      @font-face { font-family: Excalifont; src: url(data:font/woff2;base64,d09GMgABAAAAABegAA4AAAAAKIwAABdKAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGiIbhmAcgg4GYACBHBEICr1srVQLTgABNgIkA4EYBCAFgxgHIBsxHyMDwcYBBFB8IrK/SrDJMK3Dvk4QhjdyCAoMYSr+xDBHP7HcsxbpWpcgeWfCk4bn5/Z/bm7sLgtYw4gak9FrWhZUjhAMaqTxFYwqsF9qvyiMem0G2AE+/cLzL2Ov592yrVBoLABpINTl+MZXqhq5zM/u+73TBdto5tqX+wzV5/EW49sy+h/Avz88H6dmWEACxl/f06zVMc9b4F51zb9OK6mV3nYfZDswYEq82aN4ZhaADQdVDptWbqX2gyB2YATmIdlOeNhD8CUdFPX9/VrLj8TQNJSThoZ6CaaTmv37i715 [...]
diff --git a/_images/sorted-runs.png b/_images/sorted-runs.png
new file mode 100644
index 00000000..bbc061b4
Binary files /dev/null and b/_images/sorted-runs.png differ
diff --git a/_sources/api.rst.txt b/_sources/api.rst.txt
new file mode 100644
index 00000000..93ac4ce0
--- /dev/null
+++ b/_sources/api.rst.txt
@@ -0,0 +1,41 @@
+.. 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.
+
+*************
+API Reference
+*************
+
+.. toctree::
+   :maxdepth: 3
+
+   api/catalog
+   api/write
+   api/commit
+   api/scan
+   api/read
+   api/format_table
+   api/predicate
+   api/file_format
+   api/file_system
+   api/io
+   api/data_types
+   api/file_index
+   api/global_index
+   api/clean
+   api/defs
+   api/executor
+   api/memory
diff --git a/_sources/api/catalog.rst.txt b/_sources/api/catalog.rst.txt
new file mode 100644
index 00000000..c3956d32
--- /dev/null
+++ b/_sources/api/catalog.rst.txt
@@ -0,0 +1,32 @@
+.. 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.
+
+===========
+Catalog
+===========
+
+.. _cpp-api-catalog:
+
+Interface
+=========
+
+.. doxygenclass:: paimon::Catalog
+   :members:
+
+.. doxygenclass:: paimon::Identifier
+   :members:
+   :undoc-members:
diff --git a/_sources/api/clean.rst.txt b/_sources/api/clean.rst.txt
new file mode 100644
index 00000000..b1611cd0
--- /dev/null
+++ b/_sources/api/clean.rst.txt
@@ -0,0 +1,37 @@
+.. 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.
+
+==================
+Orphan Files Clean
+==================
+
+.. _cpp-api-clean:
+
+Interface
+=========
+
+.. doxygenclass:: paimon::OrphanFilesCleaner
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::CleanContextBuilder
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::CleanContext
+   :members:
+   :undoc-members:
diff --git a/_sources/api/commit.rst.txt b/_sources/api/commit.rst.txt
new file mode 100644
index 00000000..3f03ddea
--- /dev/null
+++ b/_sources/api/commit.rst.txt
@@ -0,0 +1,41 @@
+.. 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.
+
+===========
+Commit
+===========
+
+.. _cpp-api-commit:
+
+Interface
+=========
+
+.. doxygenclass:: paimon::FileStoreCommit
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::CommitContextBuilder
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::CommitContext
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::CommitMessage
+   :members:
+   :undoc-members:
diff --git a/_sources/api/data_types.rst.txt b/_sources/api/data_types.rst.txt
new file mode 100644
index 00000000..1876d787
--- /dev/null
+++ b/_sources/api/data_types.rst.txt
@@ -0,0 +1,37 @@
+.. 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.
+
+===========
+Data Types
+===========
+
+.. _cpp-api-data-types:
+
+Interface
+=========
+
+.. doxygenclass:: paimon::Blob
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::Decimal
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::Timestamp
+   :members:
+   :undoc-members:
diff --git a/_sources/api/defs.rst.txt b/_sources/api/defs.rst.txt
new file mode 100644
index 00000000..ee286851
--- /dev/null
+++ b/_sources/api/defs.rst.txt
@@ -0,0 +1,31 @@
+.. 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.
+
+===========
+Options
+===========
+
+.. _cpp-api-options:
+
+Interface
+=========
+
+.. doxygenenum:: paimon::FieldType
+
+.. doxygenstruct:: paimon::Options
+   :members:
+   :undoc-members:
diff --git a/_sources/api/executor.rst.txt b/_sources/api/executor.rst.txt
new file mode 100644
index 00000000..d5daed59
--- /dev/null
+++ b/_sources/api/executor.rst.txt
@@ -0,0 +1,37 @@
+.. 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.
+
+===========
+Executor
+===========
+
+.. _cpp-api-executor:
+
+Interface
+=========
+
+.. doxygenvariable:: paimon::DEFAULT_EXECUTOR_THREAD_COUNT
+
+.. doxygenfunction:: paimon::GetGlobalDefaultExecutor()
+
+.. doxygenfunction:: paimon::CreateDefaultExecutor()
+
+.. doxygenfunction:: paimon::CreateDefaultExecutor(uint32_t)
+
+.. doxygenclass:: paimon::Executor
+   :members:
+   :undoc-members:
diff --git a/_sources/api/file_format.rst.txt b/_sources/api/file_format.rst.txt
new file mode 100644
index 00000000..f90e07f2
--- /dev/null
+++ b/_sources/api/file_format.rst.txt
@@ -0,0 +1,57 @@
+.. 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.
+
+===========
+File Format
+===========
+
+.. _cpp-api-file-format:
+
+Interface
+=========
+
+.. doxygenclass:: paimon::FileFormat
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::FormatWriter
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::WriterBuilder
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::FileBatchReader
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::ReaderBuilder
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::FileFormatFactory
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::FormatStatsExtractor
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::WrittenFileStatsProvider
+   :members:
+   :undoc-members:
diff --git a/_sources/api/file_index.rst.txt b/_sources/api/file_index.rst.txt
new file mode 100644
index 00000000..e95cd26f
--- /dev/null
+++ b/_sources/api/file_index.rst.txt
@@ -0,0 +1,53 @@
+.. 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.
+
+===========
+File Index
+===========
+
+.. _cpp-api-file-index:
+
+Interface
+=========
+
+.. doxygenclass:: paimon::FileIndexer
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::FileIndexerFactory
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::FileIndexWriter
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::FileIndexReader
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::FileIndexFormat
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::FileIndexResult
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::BitmapIndexResult
+   :members:
+   :undoc-members:
diff --git a/_sources/api/file_system.rst.txt b/_sources/api/file_system.rst.txt
new file mode 100644
index 00000000..0313d0b7
--- /dev/null
+++ b/_sources/api/file_system.rst.txt
@@ -0,0 +1,51 @@
+.. 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.
+
+===========
+File System
+===========
+
+.. _cpp-api-file-system-factory:
+
+Interface
+=========
+
+.. doxygenclass:: paimon::FileSystem
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::FileSystemFactory
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::InputStream
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::OutputStream
+   :members:
+   :undoc-members:
+
+.. doxygenenum:: paimon::SeekOrigin
+
+.. doxygenclass:: paimon::FileStatus
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::BasicFileStatus
+   :members:
+   :undoc-members:
diff --git a/_sources/api/format_table.rst.txt b/_sources/api/format_table.rst.txt
new file mode 100644
index 00000000..1ec96437
--- /dev/null
+++ b/_sources/api/format_table.rst.txt
@@ -0,0 +1,52 @@
+.. 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.
+
+============
+Format Table
+============
+
+.. _cpp-api-format-table:
+
+Table
+=====
+
+.. doxygenclass:: paimon::FormatTable
+   :members:
+   :undoc-members:
+
+Reading and writing a format table go through the generic entry points every other table uses:
+:cpp:class:`paimon::TableScan`, :cpp:class:`paimon::TableRead`, :cpp:class:`paimon::FileStoreWrite`
+and :cpp:class:`paimon::FileStoreCommit`. See :doc:`../user_guide/format_table`.
+
+Contexts
+========
+
+Each of those entry points builds its context from a table path, and the schema under that path
+says what kind of table it is. A caller that already holds a ``FormatTable`` hands it over instead,
+through the constructor each context builder has for one:
+
+* :cpp:class:`paimon::ScanContextBuilder`\ ``(const std::shared_ptr<FormatTable>&)``
+* :cpp:class:`paimon::ReadContextBuilder`\ ``(const std::shared_ptr<FormatTable>&)``
+* :cpp:class:`paimon::WriteContextBuilder`\ ``(const std::shared_ptr<FormatTable>&)``
+* :cpp:class:`paimon::CommitContextBuilder`\ ``(const std::shared_ptr<FormatTable>&)``
+
+This is the only way to reach a format table whose schema does not live under its own location,
+such as one a REST catalog serves: nothing under the location says that it is a format table, nor
+that what sits below it is data rather than metadata. The table knows both, so a setting that would
+answer either question again - ``SetTableSchema()``, ``WithFileSystem()`` and a branch among them -
+is refused by these builders rather than quietly ignored. Options given at the call still win over
+the ones the table carries, as they do everywhere else.
diff --git a/_sources/api/global_index.rst.txt b/_sources/api/global_index.rst.txt
new file mode 100644
index 00000000..8be63a77
--- /dev/null
+++ b/_sources/api/global_index.rst.txt
@@ -0,0 +1,77 @@
+.. 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.
+
+============
+Global Index
+============
+
+.. _cpp-api-global-index:
+
+Interface
+=========
+
+.. doxygenclass:: paimon::GlobalIndexerFactory
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::GlobalIndexer
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::GlobalIndexReader
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::GlobalIndexFileReader
+   :members:
+   :undoc-members:
+
+.. doxygenstruct:: paimon::GlobalIndexIOMeta
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::GlobalIndexResult
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::BitmapGlobalIndexResult
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::BitmapScoredGlobalIndexResult
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::GlobalIndexScan
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::IndexedSplit
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::GlobalIndexWriteTask
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::GlobalIndexWriter
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::GlobalIndexFileWriter
+   :members:
+   :undoc-members:
diff --git a/_sources/api/io.rst.txt b/_sources/api/io.rst.txt
new file mode 100644
index 00000000..9687fc12
--- /dev/null
+++ b/_sources/api/io.rst.txt
@@ -0,0 +1,41 @@
+.. 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.
+
+===
+IO
+===
+
+.. _cpp-api-io:
+
+Interface
+=========
+
+.. doxygenenum:: paimon::ByteOrder
+
+.. doxygenfunction:: paimon::SystemByteOrder()
+
+.. doxygenclass:: paimon::BufferedInputStream
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::ByteArrayInputStream
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::DataInputStream
+   :members:
+   :undoc-members:
diff --git a/_sources/api/memory.rst.txt b/_sources/api/memory.rst.txt
new file mode 100644
index 00000000..e498dfb8
--- /dev/null
+++ b/_sources/api/memory.rst.txt
@@ -0,0 +1,37 @@
+.. 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.
+
+========
+Memory
+========
+
+.. _cpp-api-memory:
+
+Interface
+=========
+
+.. doxygenfunction:: paimon::GetMemoryPool()
+
+.. doxygenfunction:: paimon::GetDefaultPool()
+
+.. doxygenclass:: paimon::MemoryPool
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::Bytes
+   :members:
+   :undoc-members:
diff --git a/_sources/api/predicate.rst.txt b/_sources/api/predicate.rst.txt
new file mode 100644
index 00000000..e79f6caa
--- /dev/null
+++ b/_sources/api/predicate.rst.txt
@@ -0,0 +1,52 @@
+.. 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.
+
+Predicate
+===================================
+
+.. _cpp-api-predicate:
+
+Interface
+=========
+
+.. doxygenclass:: paimon::Predicate
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::LeafPredicate
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::CompoundPredicate
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::Function
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::FunctionVisitor
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::Literal
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::PredicateBuilder
+   :members:
+   :undoc-members:
diff --git a/_sources/api/read.rst.txt b/_sources/api/read.rst.txt
new file mode 100644
index 00000000..ccf21c6a
--- /dev/null
+++ b/_sources/api/read.rst.txt
@@ -0,0 +1,43 @@
+.. 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.
+
+===========
+Read
+===========
+
+.. _cpp-api-read:
+
+Interface
+=========
+
+.. doxygenclass:: paimon::TableRead
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::ReadContextBuilder
+   :members:
+   :undoc-members:
+
+.. doxygenenum:: paimon::WarmupLevel
+
+.. doxygenclass:: paimon::ReadContext
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::BatchReader
+   :members:
+   :undoc-members:
diff --git a/_sources/api/scan.rst.txt b/_sources/api/scan.rst.txt
new file mode 100644
index 00000000..0194aa6d
--- /dev/null
+++ b/_sources/api/scan.rst.txt
@@ -0,0 +1,79 @@
+.. 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.
+
+===========
+Scan
+===========
+
+.. _cpp-api-scan:
+
+Bucket pruning
+==============
+
+For fixed-bucket append and primary-key tables, an equality predicate on every bucket key lets
+the scan derive the target bucket using the table's bucket function. Other buckets
+are excluded from the scan plan without requiring an explicit bucket ID from the
+caller. An explicit bucket filter takes precedence. Queries that do not constrain
+all bucket keys with equality, and bucket-unaware tables, keep the existing scan
+behavior. Both scan types use a shared selector that computes the bucket with
+each manifest entry's total bucket count, so rescaled files are not filtered using
+the current table's bucket count. Historical schemas remain eligible when their ordered bucket-key field IDs,
+types and bucket function match. Changes to unrelated columns do not disable
+pruning. Incompatible bucket schemas and nonpositive total bucket counts retain
+the existing filtering behavior.
+
+This inference prunes data files at the manifest-entry level. Manifest min/max-bucket
+skipping requires an explicit bucket filter. When the snapshot live-manifest-entry
+cache is enabled, inferred scans cache candidates by bucket, current bucket count
+and current schema ID. Files with other bucket counts or schema IDs remain in the
+cached candidates and are filtered after lookup. This permits cache reuse without
+discarding files that require a different bucket calculation or schema fallback.
+
+Decimal literals are rescaled to the bucket field's type only when the conversion
+is exact. NaN literals and decimals that cannot be represented exactly disable
+inferred bucket pruning.
+
+Interface
+=========
+
+.. doxygenclass:: paimon::TableScan
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::ScanContextBuilder
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::ScanContext
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::Plan
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::Split
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::DataSplit
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::ScanFilter
+   :members:
+   :undoc-members:
diff --git a/_sources/api/write.rst.txt b/_sources/api/write.rst.txt
new file mode 100644
index 00000000..7abeb5b1
--- /dev/null
+++ b/_sources/api/write.rst.txt
@@ -0,0 +1,45 @@
+.. 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.
+
+===========
+Write
+===========
+
+.. _cpp-api-write:
+
+Interface
+=========
+
+.. doxygenclass:: paimon::FileStoreWrite
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::WriteContextBuilder
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::WriteContext
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::RecordBatch
+   :members:
+   :undoc-members:
+
+.. doxygenclass:: paimon::RecordBatchBuilder
+   :members:
+   :undoc-members:
diff --git a/_sources/basic_concepts.rst.txt b/_sources/basic_concepts.rst.txt
new file mode 100644
index 00000000..0af52305
--- /dev/null
+++ b/_sources/basic_concepts.rst.txt
@@ -0,0 +1,83 @@
+.. 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.
+
+.. Ported from the Paimon documentation:
+.. https://github.com/apache/paimon/blob/master/docs/content/concepts/basic-concepts.md
+
+Basic Concepts
+========================
+
+File Layouts
+------------------------
+All files of a table are stored under one base directory. Paimon files are
+organized in a layered style. The following image illustrates the file layout.
+Starting from a snapshot file, Paimon readers can recursively access all records
+from the table.
+
+.. image:: _static/file-layout.png
+   :alt: File Layout
+   :align: center
+   :width: 100%
+
+Snapshot
+-------------------
+All snapshot files are stored in the snapshot directory.
+
+A snapshot file is a JSON file containing information about this snapshot,
+including the schema file in use the manifest list containing all changes of
+this snapshot. A snapshot captures the state of a table at some point in time.
+Users can access the latest data of a table through the latest snapshot.
+By time traveling, users can also access the previous state of a table through
+an earlier snapshot.
+
+Manifest Files
+-------------------
+All manifest lists and manifest files are stored in the manifest directory. A
+manifest list is a list of manifest file names.
+A manifest file is a file containing changes about LSM data files and changelog
+files. For example, which LSM data file is created and which file is deleted in
+the corresponding snapshot.
+
+Data Files
+---------------------------
+Data files are grouped by partitions. Paimon C++ supports Parquet (default),
+ORC, and Avro as data file formats, with optional Lance and Mosaic support.
+
+Partition
+---------------------------
+Paimon adopts the same partitioning concept as Apache Hive to separate data.
+
+Partitioning is an optional way of dividing a table into related parts based on
+the values of particular columns like date, city, and department. Each table can
+have one or more partition keys to identify a particular partition.
+
+By partitioning, users can efficiently operate on a slice of records in the
+table.
+
+Consistency Guarantees
+---------------------------
+Paimon writers use two-phase commit protocol to atomically commit a batch of
+records to the table. Each commit produces at most two snapshots at commit time.
+It depends on the incremental write and compaction strategy. If only incremental
+writes are performed without triggering a compaction operation, only an
+incremental snapshot will be created. If a compaction operation is triggered, an
+incremental snapshot and a compacted snapshot will be created.
+
+For any two writers modifying a table at the same time, as long as they do not
+modify the same partition, their commits can occur in parallel. If they modify
+the same partition, only snapshot isolation is guaranteed. That is, the final
+table state may be a mix of the two commits, but no changes are lost.
diff --git a/_sources/build_system.rst.txt b/_sources/build_system.rst.txt
new file mode 100644
index 00000000..6687290c
--- /dev/null
+++ b/_sources/build_system.rst.txt
@@ -0,0 +1,123 @@
+.. 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.
+
+.. default-domain:: cpp
+.. highlight:: cpp
+
+=============================
+Integrating Apache Paimon C++
+=============================
+
+This section assumes that you have already built and installed the Paimon C++
+libraries on your system after :ref:`building them yourself <building-paimon-cpp>`.
+Additionally, you will need `Apache Arrow for C++ <https://arrow.apache.org/docs/cpp/getting_started.html>`_
+as in-memory data format interface. Please ensure that Arrow C++ is installed
+and available to your build system
+
+The recommended way to integrate the Paimon C++ libraries into your C++ project
+is to use CMake's `find_package <https://cmake.org/cmake/help/latest/command/find_package.html>`_
+function to locate and integrate dependencies.
+
+CMake
+=====
+
+Quick Start
+-----------
+
+This ``CMakeLists.txt`` compiles the ``my_example.cc`` source file into
+an executable and links it with the Paimon C++ shared library and its plugins
+for data format and file system.
+
+.. code-block:: cmake
+
+   cmake_minimum_required(VERSION 3.22)
+
+   project(MyExample)
+
+   # Arrow's static package may export LZ4 under a different target name.
+   find_package(lz4 CONFIG QUIET)
+   if(TARGET LZ4::lz4_static AND NOT TARGET LZ4::lz4)
+     add_library(LZ4::lz4 ALIAS LZ4::lz4_static)
+   elseif(TARGET lz4::lz4 AND NOT TARGET LZ4::lz4)
+     add_library(LZ4::lz4 ALIAS lz4::lz4)
+   endif()
+
+   find_package(Arrow CONFIG REQUIRED)
+   find_package(Paimon CONFIG REQUIRED)
+
+   if(TARGET Arrow::arrow_shared)
+     set(PAIMON_ARROW_TARGET Arrow::arrow_shared)
+   elseif(TARGET Arrow::arrow_static)
+     set(PAIMON_ARROW_TARGET Arrow::arrow_static)
+   else()
+     message(FATAL_ERROR "No supported Arrow CMake target is available")
+   endif()
+
+   add_executable(my_example my_example.cc)
+   target_link_libraries(my_example PRIVATE ${PAIMON_ARROW_TARGET}
+                                            Paimon::paimon_shared
+                                            Paimon::paimon_parquet_file_format_shared
+                                            Paimon::paimon_local_file_system_shared)
+
+Available variables and targets
+-------------------------------
+
+The directive ``find_package(Paimon REQUIRED)`` instructs CMake to locate a
+Paimon C++ installation on your system. If successful, it sets ``Paimon_FOUND``
+to true if the Paimon C++ libraries were found.
+
+It defines the following supported imported target:
+
+* ``Paimon::paimon_shared`` links to the Paimon shared libraries
+
+Static targets such as ``Paimon::paimon_static`` may also be present when
+Paimon is built with ``PAIMON_BUILD_STATIC=ON``. They are not currently
+supported as standalone installed targets because their exported link
+interfaces do not include every third-party dependency. Installed consumers
+should use the shared targets.
+
+Optional plugins (built-in file formats, file systems, and index)
+-----------------------------------------------------------------
+
+Paimon provides a set of built-in optional plugins that you can link to as needed:
+
+- File format plugins:
+
+  - ``Paimon::paimon_parquet_file_format_shared``
+  - ``Paimon::paimon_orc_file_format_shared``
+  - ``Paimon::paimon_avro_file_format_shared``
+  - ``Paimon::paimon_blob_file_format_shared``
+  - ``Paimon::paimon_lance_file_format_shared``
+
+- File system plugins:
+
+  - ``Paimon::paimon_local_file_system_shared``
+  - ``Paimon::paimon_jindo_file_system_shared``
+  - ``Paimon::paimon_oss_file_system_shared``
+  - ``Paimon::paimon_s3_file_system_shared``
+
+- Index plugins:
+
+  - ``Paimon::paimon_file_index_shared``
+  - ``Paimon::paimon_lumina_index_shared``
+  - ``Paimon::paimon_lucene_index_shared``
+
+.. note::
+
+  Static plugin targets have the same installed-consumer limitation as
+  ``Paimon::paimon_static`` and should not be used as standalone imported
+  targets.
diff --git a/_sources/building.rst.txt b/_sources/building.rst.txt
new file mode 100644
index 00000000..5ca6ff45
--- /dev/null
+++ b/_sources/building.rst.txt
@@ -0,0 +1,374 @@
+.. 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.
+
+.. highlight:: console
+
+.. _building-paimon-cpp:
+
+==========================
+Building Apache Paimon C++
+==========================
+
+System setup
+============
+
+Paimon uses CMake as a build configuration system. We recommend building
+out-of-source. For example, you could create ``paimon-cpp/build`` and invoke
+``cmake $CMAKE_ARGS ..`` from this directory.
+
+Building requires:
+
+* A C++17-enabled compiler. On Linux, gcc 8 and higher should be sufficient.
+  Windows is not supported for now.
+* At least 2GB of RAM for a minimal build, 8GB for a minimal
+  debug build with tests and 16GB for a full build.
+
+On Ubuntu/Debian you can install the requirements with:
+
+.. code-block:: shell
+
+   sudo apt-get install \
+        build-essential \
+        cmake
+
+We also provide a docker template to help you get started quickly. See in
+``.devcontainer`` folder for more details.
+
+.. _cpp-building-platforms:
+
+Supported platforms
+-------------------
+
+.. list-table::
+   :header-rows: 1
+   :widths: 20 25 55
+
+   * - Operating system
+     - Architecture
+     - Support level
+   * - Linux
+     - ``x86_64``
+     - Built and tested in CI.
+   * - Linux
+     - ``aarch64`` / ``arm64``
+     - Built and tested in CI.
+   * - macOS
+     - ``x86_64``, ``arm64``
+     - Architecture detection is wired up, but macOS as a whole is not an
+       officially supported platform and is not covered by CI.
+   * - Windows
+     - any
+     - Not supported.
+
+The build system derives the target CPU family from
+``CMAKE_SYSTEM_PROCESSOR`` (or from ``CMAKE_OSX_ARCHITECTURES`` on macOS) and
+only applies tuning flags belonging to that family. On an architecture it does
+not recognise it simply adds no tuning flags of its own, which is not by itself
+a statement that the dependencies or the runtime work there. On aarch64 the
+``-march=`` value defaults to ``armv8-a`` and can be overridden with
+``-DPAIMON_AARCH64_MARCH=armv8.2-a+crc`` or similar; an explicitly empty value
+(``-DPAIMON_AARCH64_MARCH=""``) passes no ``-march`` flag at all, for toolchains
+that reject the flag, such as AppleClang targeting arm64.
+
+There is no x86 SIMD level to select, and no instruction-set flag is added on
+x86: the baseline stays whatever the toolchain defaults to. No persisted value
+depends on it, in particular the checksum written to SST files and to the B-tree
+global index is the same however Paimon was compiled.
+
+One optional component is architecture-restricted:
+``-DPAIMON_ENABLE_LUMINA=ON`` consumes a prebuilt binary that is only
+published for Linux ``x86_64``, so configuring it on any other platform fails
+with an explicit error.
+
+Cross compilation is not wired up end to end: the bundled third-party builds are
+handed only the C and C++ compilers, without a toolchain file, sysroot or find
+root, so they can still pick up host libraries. Build natively on each target.
+
+``build_and_package.sh`` therefore names its output after the host platform, for
+example ``output/paimon-cpp-linux-aarch64.tar.gz``, so artifacts built on several
+machines can be collected side by side. ``--platform <label>`` overrides that
+label alone; it does not configure a cross build.
+
+.. _cpp-building-building:
+
+Building
+========
+
+All the instructions below assume that you have cloned the paimon-cpp git
+repository:
+
+.. code-block::
+
+   $ git clone https://github.com/apache/paimon-cpp.git
+   $ cd paimon-cpp
+
+Manual configuration
+--------------------
+
+The build system uses ``CMAKE_BUILD_TYPE=Release`` by default, so if this
+argument is omitted then a release build will be produced.
+
+Two build types are possible:
+
+* ``Debug``: doesn't apply any compiler optimizations and adds debugging
+  information in the binary.
+* ``Release``: applies compiler optimizations and removes debug information
+  from the binary.
+
+.. note::
+
+  You can also run default build with flag ``-DPAIMON_EXTRA_ERROR_CONTEXT=ON``
+  for more error msg context.
+
+Minimal release build (2GB of RAM for building or more recommended):
+
+.. code-block::
+
+   $ mkdir build-release
+   $ cd build-release
+   $ cmake ..
+   $ make -j8       # if you have 8 CPU cores, otherwise adjust
+   $ make install
+
+Minimal debug build with unit tests (4GB of RAM for building or more recommended):
+
+.. code-block::
+
+   $ mkdir build-debug
+   $ cd build-debug
+   $ cmake -DCMAKE_BUILD_TYPE=Debug -DPAIMON_BUILD_TESTS=ON ..
+   $ make -j8       # if you have 8 CPU cores, otherwise adjust
+   $ make unittest  # to run the tests
+   $ make install
+
+The unit tests are not built by default. After building, one can also invoke
+the unit tests using the ``ctest`` tool provided by CMake.
+
+Faster builds with Ninja
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+Many contributors use the `Ninja build system <https://ninja-build.org/>`_ to
+get faster builds. It especially speeds up incremental builds. To use
+``ninja``, pass ``-GNinja`` when calling ``cmake`` and then use the ``ninja``
+command instead of ``make``.
+
+.. _cpp_build_optional_components:
+
+Optional Components
+~~~~~~~~~~~~~~~~~~~
+
+By default, the C++ build system creates a fairly minimal build. We have
+several optional system components which you can opt into building by passing
+boolean flags to ``cmake``.
+
+* ``-DPAIMON_ENABLE_ORC=ON``: Paimon integration with Apache ORC
+* ``-DPAIMON_ENABLE_AVRO=ON``: Apache Avro libraries and Paimon integration
+* ``-DPAIMON_ENABLE_LANCE=ON``: Lance 0.39 file format support through a Rust FFI; requires
+  Rust 1.88 or newer, cbindgen, and protoc 3.12 or newer
+* ``-DPAIMON_ENABLE_JINDO=ON``: Support for Alibaba Jindo filesystems
+* ``-DPAIMON_ENABLE_OSS=ON``: Support for Alibaba Cloud OSS through OSS SDK V2
+* ``-DPAIMON_ENABLE_S3=ON``: Support for Amazon S3-compatible filesystems
+* ``-DPAIMON_ENABLE_LUMINA=ON``: Support for the Lumina vector index. Requires
+  Linux ``x86_64``; see :ref:`cpp-building-platforms`.
+* ``-DPAIMON_ENABLE_LUCENE=ON``: Support for Lucene full-text search indexes
+* ``-DPAIMON_ENABLE_TANTIVY=ON``: Enable the experimental Tantivy full-text index Rust FFI.
+* ``-DPAIMON_ENABLE_REST=ON``: Support for the REST catalog
+  (``metastore=rest``), requires the libcurl and OpenSSL development packages.
+
+Lance forwards the standard ``s3.*`` and ``fs.oss.*`` table options to its object-store client.
+An option named ``lance.storage.<key>`` is passed through as ``<key>`` and overrides the
+corresponding standard option.
+
+Nullable ROW declarations are supported, but the writer rejects actual null ROW
+values because Lance 0.39's default v2.0 encoding does not preserve parent validity.
+
+For ``oss://``, Lance 0.39 uses OpenDAL: ``oss_endpoint`` is the service endpoint
+without a bucket prefix, and a bare hostname defaults to HTTPS. Java's additional
+S3-style ``endpoint`` and ``virtual_hosted_style_request`` options are not used by
+this backend. OSS session tokens supplied through table options are not supported
+by the pinned backend; forwarding a token option does not enable STS authentication.
+
+Third-party dependency source
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Paimon C++ can either build selected third-party dependencies from bundled
+sources or use libraries already installed on the system. The default mode is
+``AUTO``, which tries system packages first and falls back to bundled sources
+when they are not found.
+
+.. code-block:: shell
+
+   cmake -B build -DPAIMON_DEPENDENCY_SOURCE=AUTO
+
+The supported dependency source values are:
+
+* ``AUTO``: use a system package when available, otherwise build bundled sources.
+* ``BUNDLED``: always build bundled sources.
+* ``SYSTEM``: require system packages and fail if they are not found.
+
+You can override individual dependencies with ``<Dependency>_SOURCE``. The
+supported dependency set includes Arrow/Parquet, ORC, Protobuf, Avro, RE2, fmt,
+RapidJSON, TBB, glog, GoogleTest, and compression libraries. Arrow and ORC
+require project-specific patches, so their supported source values are
+``AUTO`` and ``BUNDLED``; ``AUTO`` resolves to bundled sources for them.
+
+.. code-block:: shell
+
+   cmake -B build \
+     -DPAIMON_DEPENDENCY_SOURCE=AUTO \
+     -Dfmt_SOURCE=SYSTEM \
+     -Dfmt_ROOT=/opt/fmt \
+     -Dzstd_SOURCE=BUNDLED
+
+Use ``PAIMON_PACKAGE_PREFIX`` to provide one common prefix for dependencies
+whose own ``<Package>_ROOT`` variable is not set. Because the patched Arrow and
+ORC dependencies cannot be resolved from the system, a global ``SYSTEM`` build
+must override them to ``BUNDLED``:
+
+.. code-block:: shell
+
+   cmake -B build \
+     -DPAIMON_DEPENDENCY_SOURCE=SYSTEM \
+     -DArrow_SOURCE=BUNDLED \
+     -DORC_SOURCE=BUNDLED \
+     -DPAIMON_PACKAGE_PREFIX=/opt/paimon-deps
+
+All other enabled dependencies must be available as system packages or under
+the specified prefix. When ORC support is disabled, the ``ORC_SOURCE`` override
+can be omitted.
+
+Package-manager-specific modes are intentionally out of scope for this first
+dependency source interface. They can still be used through standard CMake
+mechanisms such as ``CMAKE_PREFIX_PATH`` or ``CMAKE_TOOLCHAIN_FILE``, while
+Paimon keeps the dependency source values limited to ``AUTO``, ``BUNDLED``, and
+``SYSTEM``.
+
+When ``Arrow_SOURCE`` is explicitly set to ``BUNDLED`` or left as ``AUTO``, the
+compression dependencies default to bundled sources unless individually
+overridden. When ``ORC_SOURCE`` is explicitly set to ``BUNDLED`` or left as
+``AUTO``, ``Protobuf_SOURCE`` defaults to bundled sources unless individually
+overridden.
+
+During configuration, CMake prints a dependency resolution summary showing the
+requested source, actual source, compatibility target, and search root for each
+resolved dependency.
+
+Optional Targets
+~~~~~~~~~~~~~~~~
+
+For development builds, you will often want to enable additional targets in
+enable to exercise your changes, using the following ``cmake`` options.
+
+* ``-DPAIMON_BUILD_TESTS=ON``: Build executable unit tests.
+
+Optional Checks
+~~~~~~~~~~~~~~~
+
+The following special checks are available as well.  They instrument the
+generated code in various ways so as to detect select classes of problems
+at runtime (for example when executing unit tests).
+
+* ``-DPAIMON_USE_ASAN=ON``: Enable Address Sanitizer to check for memory leaks,
+  buffer overflows or other kinds of memory management issues.
+* ``-DPAIMON_USE_UBSAN=ON``: Enable Undefined Behavior Sanitizer to check for
+  situations which trigger C++ undefined behavior.
+
+Some of those options are mutually incompatible, so you may have to build
+several times with different options if you want to exercise all of them.
+
+CMake version requirements
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+We support CMake 3.22 and higher.
+
+LLVM and Clang Tools
+~~~~~~~~~~~~~~~~~~~~
+
+We currently use LLVM for library builds and for developer tools such as code
+formatting with clang-format. LLVM can be installed via most modern package
+managers (apt, yum, etc.).
+
+Environment variables
+~~~~~~~~~~~~~~~~~~~~~
+
+The build system and helper scripts accept several environment variables that
+can alter fetch and build behaviour without changing CMake flags. These are
+especially useful when you want to use a local or corporate mirror for
+third-party archives, or to override a specific dependency's download URL.
+
+Common environment variables
+----------------------------
+
+* ``PAIMON_THIRDPARTY_MIRROR_URL``
+
+  When set, this string is used as a prefix for the default third-party
+  download URLs. For example, if a dependency would normally be downloaded
+  from
+
+  ``https://github.com/fmtlib/fmt/archive/refs/tags/${PAIMON_FMT_BUILD_VERSION}.tar.gz``
+
+  and ``PAIMON_THIRDPARTY_MIRROR_URL`` is set to
+
+  ``https://mirror.example.com/paimon/thirdparty/``, the build system will
+  attempt to download from
+
+  ``https://mirror.example.com/paimon/thirdparty/https://github.com/fmtlib/fmt/archive/refs/tags/${PAIMON_FMT_BUILD_VERSION}.tar.gz``
+
+  (the exact concatenation semantics follow the third-party fetch helpers
+  defined in ``cmake_modules/ThirdpartyToolchain.cmake``). If you set a
+  mirror URL, prefer including a trailing slash to avoid accidental URL
+  concatenation issues.
+
+* Per-dependency override variables (examples)
+
+  Many dependencies support overriding their download URL via a dedicated
+  environment variable. Examples implemented in the CMake helper include:
+
+  - ``PAIMON_FMT_URL`` to override the fmt archive URL
+  - ``PAIMON_RAPIDJSON_URL`` to override RapidJSON download URL
+  - ``PAIMON_ZLIB_URL``, ``PAIMON_ZSTD_URL``, ``PAIMON_LZ4_URL`` etc.
+
+  If one of these per-dependency environment variables is defined, it will
+  take precedence over the mirror prefix. Use these variables to precisely
+  control where a given dependency is fetched from.
+
+Usage examples
+--------------
+
+Use a mirror for all third-party downloads:
+
+.. code-block:: shell
+
+   export PAIMON_THIRDPARTY_MIRROR_URL="https://mirror.example.com/paimon/thirdparty/"
+   mkdir build
+   cd build
+   cmake -DPAIMON_BUILD_TESTS=ON ..
+
+Override only a single dependency (fmt):
+
+.. code-block:: shell
+
+   export PAIMON_FMT_URL="https://internal.example.com/archives/fmt-8.1.1.tar.gz"
+   mkdir build
+   cd build
+   cmake ..
+
+.. note::
+
+  The exact fetch behaviour (how the mirror prefix is concatenated, or whether the helper expects a full URL vs. a prefix)
+  is implemented in ``cmake_modules/ThirdpartyToolchain.cmake``. Consult that file when you need a custom setup.
+  Unset an environment variable to revert to the default upstream download locations: ``unset PAIMON_THIRDPARTY_MIRROR_URL``
diff --git a/_sources/documentations.rst.txt b/_sources/documentations.rst.txt
new file mode 100644
index 00000000..5dcc3687
--- /dev/null
+++ b/_sources/documentations.rst.txt
@@ -0,0 +1,68 @@
+.. 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.
+
+.. _building-docs:
+
+Building the Documentation
+==========================
+
+Prerequisites
+-------------
+
+The documentation build relies on `Doxygen <http://www.doxygen.nl/>`_ and
+`Sphinx <http://www.sphinx-doc.org/>`_ along with a few extensions.
+
+First, install `Doxygen <http://www.doxygen.nl/>`_
+yourself (for example from your distribution's official repositories, if
+using Linux).  Then install the Python-based requirements with the
+following command:
+
+.. code-block:: shell
+
+   pip install -r paimon-cpp/docs/requirements.txt
+
+Building
+--------
+
+.. note::
+
+   If you are building the documentation on Windows, not all sections
+   may build properly.
+
+These two steps are mandatory and must be executed in order.
+
+#. Process the C++ API using Doxygen
+
+   .. code-block:: shell
+
+      cd paimon-cpp/apidoc
+      doxygen
+      cd -
+
+#. Build the complete documentation using Sphinx.
+
+   .. code-block:: shell
+
+      cd paimon-cpp/docs
+      make html
+      cd -
+
+
+After these steps are completed, the documentation is rendered in HTML
+format in ``paimon-cpp/docs/_build/html``.  In particular, you can point your
+browser at ``paimon-cpp/docs/_build/html/index.html`` to read the docs and
+review any changes you made.
diff --git a/_sources/examples/benchmark.rst.txt b/_sources/examples/benchmark.rst.txt
new file mode 100644
index 00000000..01d49cfb
--- /dev/null
+++ b/_sources/examples/benchmark.rst.txt
@@ -0,0 +1,213 @@
+.. 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.
+
+================
+Benchmark Usage
+================
+
+Paimon C++ provides Google Benchmark based cases at two levels:
+
+``paimon-read-write-benchmark``
+   Table-level cases for append-table write/read and primary-key table write/MOR
+   read paths.
+
+``paimon-parquet-format-benchmark``
+   Format-level cases that drive the Parquet writer and reader directly, without
+   catalog lookup, split planning, merge/sort or commit.
+
+Benchmarks are disabled by default.
+
+Build
+=====
+
+Enable benchmarks when configuring CMake::
+
+   cmake -S . -B build -DPAIMON_BUILD_BENCHMARKS=ON
+   cmake --build build --target paimon-read-write-benchmark
+   cmake --build build --target paimon-parquet-format-benchmark
+
+Run all benchmark cases through CTest::
+
+   cmake --build build --target benchmark
+
+Table-level Custom Options
+==========================
+
+``paimon-read-write-benchmark`` accepts Google Benchmark options plus the Paimon
+specific options below:
+
+``--paimon_source_data_file=<path>``
+   Source data file used to build benchmark data. Currently Parquet source files
+   are supported.
+
+``--paimon_source_table_path=<path>``
+   Read directly from an existing table path for ``BM_Read`` and ``BM_MOR_Read``.
+   When set, the source loading and pre-write stage are skipped.
+
+``--paimon_pk_columns=<col1,col2,...>``
+   Primary key columns for ``BM_PK_Write`` and ``BM_MOR_Read``. These cases
+   explicitly use ``bucket=1`` because benchmark batches are written to bucket 0.
+
+``--paimon_option=<key1>:<value1>;<key2>:<value2>``
+   Repeatable table options passed through to Paimon. The default table file
+   format is ``parquet``. Benchmark output supports ``parquet`` and, when
+   built with ``PAIMON_ENABLE_ORC=ON``, ``orc``; use
+   ``--paimon_option file.format:parquet`` or
+   ``--paimon_option file.format:orc`` to select one. For ``BM_PK_Write`` and
+   ``BM_MOR_Read``, ``bucket`` is forced to ``1``.
+
+Examples
+========
+
+Append table write::
+
+   paimon-read-write-benchmark \
+       --paimon_source_data_file /path/data.parquet \
+       --benchmark_filter=BM_Write
+
+Append table read with four prefetch workers::
+
+   paimon-read-write-benchmark \
+       --paimon_source_data_file /path/data.parquet \
+       --benchmark_filter=BM_Read/4
+
+Primary-key table write::
+
+   paimon-read-write-benchmark \
+       --paimon_source_data_file /path/data.parquet \
+       --paimon_pk_columns=id \
+       --benchmark_filter=BM_PK_Write
+
+MOR read from an existing table::
+
+   paimon-read-write-benchmark \
+       --paimon_source_table_path /path/table \
+       --paimon_pk_columns=id \
+       --benchmark_filter=BM_MOR_Read/4
+
+Parquet Format Benchmark
+========================
+
+``paimon-parquet-format-benchmark`` takes only Google Benchmark options. It
+generates its own data and writes it to a temporary directory, so it needs no
+source file or table.
+
+Two things shape how the results should be read:
+
+- Every axis is swept on its own rather than as a combined matrix, so each
+  case answers one question and a change can be attributed to it.
+- Writes go through the local FileSystem into a temporary directory, so
+  absolute numbers carry the cost of that path. Comparisons are meaningful
+  only under the same environment and methodology - the same machine, build
+  configuration and options - which is what makes a before/after comparison
+  useful.
+
+Writer cases (``BM_ParquetWrite_*``) cover flat primitives, ``VARCHAR`` at low /
+medium / high cardinality with and without file-level dictionary encoding,
+already dictionary-encoded ``VARCHAR`` / ``INTEGER`` input arrays against their
+flat equivalents, ``DECIMAL`` at precision 9 / 18 / 38, nested ``STRUCT`` /
+``LIST`` / ``VECTOR`` / ``MAP``, null density from 0 to 100 percent, rows per
+``AddBatch`` call, column count at a fixed row count, row group size, the
+writer memory threshold that triggers a byte-based row-group flush, and the
+codecs Parquet accepts - ``none``, ``snappy``, ``gzip``, ``brotli``, ``zstd``,
+``lz4_raw`` and ``lz4_hadoop``. Note that ``lz4`` is deliberately not among
+them: it resolves to Arrow's ``LZ4_FRAME``, which
+``parquet::IsCodecSupported`` rejects.
+
+The two dictionary axes are different questions. ``BM_ParquetWrite_String`` and
+``BM_ParquetWrite_StringNoDictionary`` vary whether the *file* is dictionary
+encoded; ``BM_ParquetWrite_Dictionary*`` vary whether the *input array* already
+is, which is what decides whether Arrow can pass indices through to Parquet or
+has to materialize them first.
+
+Three of those cases form one comparison, at the same cardinality and over the
+same logical column: ``BM_ParquetWrite_String`` writes it flat,
+``BM_ParquetWrite_DictionaryStringIntoStringSchema`` writes it as one dictionary
+forwarded through the whole file, and
+``BM_ParquetWrite_ChangingDictionaryStringIntoStringSchema`` gives every batch
+its own dictionary - a rotation of the same values, with the indices shifted the
+other way, so the data is unchanged and only the dictionary object differs. A
+Parquet column chunk holds one dictionary, so the third case makes the writer
+fall back to plain encoding partway through the row group. Reading the second
+against the first is what forwarding an encoding buys; the third against the
+second is what that fallback costs in time; the third against the first is the
+output size a rewrite that materialized and rebuilt would have produced.
+
+These are format-writer microbenchmarks: they measure ``AddBatch`` against a
+Parquet file, not a compaction. The compaction time, CPU and peak memory of
+``parquet.read.enable-dictionary-passthrough`` on a real table have to be
+measured on that table - see the "Dictionary Passthrough" section of
+:doc:`../user_guide/compaction`.
+
+Reader cases (``BM_ParquetRead_*``) cover full scan, single-column projection,
+predicate-filtered reads at varying selectivity with page-index filtering on and
+off, skip-heavy reads driven by a strided selection bitmap, null density,
+``DECIMAL`` at precision 9 / 18 / 38, ``DOUBLE``, dictionary-encoded against
+plain-encoded files, rows per ``NextBatch`` call, and nested column reads.
+
+Every case reports ``ns_per_row`` next to ``bytes_per_row`` - ``file_bytes`` for
+writes, ``read_bytes`` for reads - so a change that trades CPU for size is
+visible in both directions. Read cases additionally report ``rows_read``,
+``batches``, and ``row_groups`` / ``row_groups_after_filter`` from the reader's
+own metrics.
+
+Compare filtered cases on ``ns_per_input_row`` and ``bytes_per_input_row``, not
+``ns_per_row`` and ``bytes_per_row``. The latter pair divides by the rows a case
+actually materialized, so pruning shrinks numerator and denominator together and
+they can rise even as the run gets faster; the ``_input_row`` pair divides by the
+rows the file holds, which every setting shares.
+
+``row_groups_after_filter`` counts row groups only. It does not show page-level
+pruning: on the ordered ``id`` column both page-index settings usually keep the
+same row groups, and the page-index gain shows up in ``rows_read``,
+``read_bytes`` and ``ns_per_input_row`` instead.
+
+A case that cannot run - an unsupported codec, a schema the reader rejects -
+calls ``SkipWithError`` and makes the process exit non-zero, so ``ctest -L
+benchmark`` fails instead of reporting a silent skip. Read cases also assert on
+the number of rows they materialized, so a fixture that stopped producing rows
+fails rather than looking fast.
+
+Because the benchmark is only compiled under ``PAIMON_BUILD_BENCHMARKS``, the
+format-layer assumptions it relies on are covered separately by
+``paimon-parquet-format-benchmark-test``, which builds with the normal test
+suite.
+
+Each read case scans a file that is generated once on first use and reused for
+the rest of the run, so a filtered run only pays to build the fixtures its own
+cases need.
+
+All Parquet writer cases::
+
+   paimon-parquet-format-benchmark --benchmark_filter=BM_ParquetWrite
+
+Page-index filtering at 1% selectivity, on and off - compare ``rows_read``,
+``read_bytes`` and ``ns_per_input_row`` between the two::
+
+   paimon-parquet-format-benchmark \
+       --benchmark_filter='BM_ParquetRead_Filtered/keep_pct:1/'
+
+Read batch size sweep, repeated for a stable comparison::
+
+   paimon-parquet-format-benchmark \
+       --benchmark_filter=BM_ParquetRead_BatchSize \
+       --benchmark_repetitions=5 \
+       --benchmark_report_aggregates_only=true
+
+Null density on both sides, to see what definition levels cost::
+
+   paimon-parquet-format-benchmark --benchmark_filter='Parquet(Write|Read)_Nulls'
diff --git a/_sources/examples/clean.rst.txt b/_sources/examples/clean.rst.txt
new file mode 100644
index 00000000..89de5ea2
--- /dev/null
+++ b/_sources/examples/clean.rst.txt
@@ -0,0 +1,26 @@
+.. 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.
+
+.. default-domain:: cpp
+.. highlight:: cpp
+
+==============
+Clean Example
+==============
+
+The file ``examples/clean_demo.cpp`` located inside the source tree, it is an
+example of building and using Paimon from a third-party project.
diff --git a/_sources/examples/index.rst.txt b/_sources/examples/index.rst.txt
new file mode 100644
index 00000000..b3114f21
--- /dev/null
+++ b/_sources/examples/index.rst.txt
@@ -0,0 +1,26 @@
+.. 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.
+
+Examples
+========
+
+.. toctree::
+   :maxdepth: 1
+
+   write_commit_scan_read
+   clean
+   benchmark
diff --git a/_sources/examples/write_commit_scan_read.rst.txt b/_sources/examples/write_commit_scan_read.rst.txt
new file mode 100644
index 00000000..1549bb10
--- /dev/null
+++ b/_sources/examples/write_commit_scan_read.rst.txt
@@ -0,0 +1,26 @@
+.. 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.
+
+.. default-domain:: cpp
+.. highlight:: cpp
+
+==============================
+Write Commit Scan Read Example
+==============================
+
+The file ``examples/read_write_demo.cpp`` located inside the source tree, it is
+an example of building and using Paimon from a third-party project.
diff --git a/_sources/getting_started.rst.txt b/_sources/getting_started.rst.txt
new file mode 100644
index 00000000..7ef32414
--- /dev/null
+++ b/_sources/getting_started.rst.txt
@@ -0,0 +1,37 @@
+.. 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.
+
+.. default-domain:: cpp
+.. highlight:: cpp
+
+Getting Started
+===============
+
+The following articles demonstrate installation, usage, and a basic
+understanding of Paimon C++. These articles will get you set up quickly with
+Paimon C++ and give you a taste of what the library is capable of.
+
+Start here to gain a basic understanding of Paimon, and move on to the
+:doc:`/user_guide` to explore more specific topics and
+underlying concepts, or the :doc:`/api` to explore Paimon's API.
+
+.. toctree::
+
+   building
+   build_system
+   basic_concepts
+   documentations
diff --git a/_sources/index.rst.txt b/_sources/index.rst.txt
new file mode 100644
index 00000000..7ad9a1d7
--- /dev/null
+++ b/_sources/index.rst.txt
@@ -0,0 +1,108 @@
+.. 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.
+
+.. _implementations:
+
+Apache Paimon C++
+=================
+
+Paimon C++ is a high-performance C++ implementation of Apache Paimon. We aim to
+provide a native, high-performance and extensible implementation that allows
+native engines to access the Paimon datalake format with maximum efficiency.
+
+.. grid:: 1 2 2 2
+   :gutter: 4
+   :padding: 2 2 0 0
+   :class-container: sd-text-center
+
+   .. grid-item-card:: Getting started
+      :class-card: contrib-card
+      :shadow: none
+
+      Start here to gain a basic understanding of Paimon with
+      an installation and linking guide, basic concepts etc.
+
+      +++
+
+      .. button-link:: getting_started.html
+         :click-parent:
+         :color: primary
+         :expand:
+
+         To Getting started
+
+   .. grid-item-card:: User Guide
+      :class-card: contrib-card
+      :shadow: none
+
+      Explore more specific topics and underlying concepts
+      of Paimon C++
+
+      +++
+
+      .. button-link:: user_guide.html
+         :click-parent:
+         :color: primary
+         :expand:
+
+         To the User Guide
+
+.. grid:: 1 2 2 2
+   :gutter: 4
+   :padding: 2 2 0 0
+   :class-container: sd-text-center
+
+   .. grid-item-card:: Examples
+      :class-card: contrib-card
+      :shadow: none
+
+      Find the description and location of the examples
+      using Paimon C++ library
+
+      +++
+
+      .. button-link:: examples/index.html
+         :click-parent:
+         :color: primary
+         :expand:
+
+         To the Examples
+
+   .. grid-item-card:: API Reference
+      :class-card: contrib-card
+      :shadow: none
+
+      Explore Paimon's API reference documentation
+
+      +++
+
+      .. button-link:: api.html
+         :click-parent:
+         :color: primary
+         :expand:
+
+         To the API Reference
+
+
+.. toctree::
+   :maxdepth: 2
+   :hidden:
+
+   getting_started
+   user_guide
+   Examples <examples/index>
+   api
diff --git a/_sources/user_guide.rst.txt b/_sources/user_guide.rst.txt
new file mode 100644
index 00000000..c03efd88
--- /dev/null
+++ b/_sources/user_guide.rst.txt
@@ -0,0 +1,47 @@
+.. 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.
+
+.. default-domain:: cpp
+.. highlight:: cpp
+
+User Guide
+==========
+
+.. toctree::
+
+   user_guide/catalog
+   user_guide/schema
+   user_guide/snapshot
+   user_guide/manifest
+   user_guide/manifest_cache
+   user_guide/manifest_entry_cache
+   user_guide/parquet_metadata_cache
+   user_guide/data_types
+   user_guide/primary_key_table
+   user_guide/append_only_table
+   user_guide/format_table
+   user_guide/system_tables
+   user_guide/write
+   user_guide/commit
+   user_guide/compaction
+   user_guide/read
+   user_guide/metrics
+   user_guide/clean
+   user_guide/prefetch
+   user_guide/arrow
+   user_guide/global_index
+   user_guide/primary_key_global_index
diff --git a/_sources/user_guide/append_only_table.rst.txt b/_sources/user_guide/append_only_table.rst.txt
new file mode 100644
index 00000000..e1320ede
--- /dev/null
+++ b/_sources/user_guide/append_only_table.rst.txt
@@ -0,0 +1,26 @@
+.. 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.
+
+.. Ported from the Paimon documentation:
+.. https://github.com/apache/paimon/blob/master/docs/content/append-table/overview.md
+
+Append Only Table
+=================
+If a table does not have a primary key defined, it is an append table. Compared
+to the primary key table, it does not have the ability to directly receive changelogs.
+It cannot be directly updated with data through upsert. It can only receive
+incoming data from append data.
diff --git a/_sources/user_guide/arrow.rst.txt b/_sources/user_guide/arrow.rst.txt
new file mode 100644
index 00000000..a2e0229b
--- /dev/null
+++ b/_sources/user_guide/arrow.rst.txt
@@ -0,0 +1,125 @@
+.. 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.
+
+.. _memory-format:
+
+Memory Format
+=============
+
+`Paimon Java <https://paimon.apache.org/docs/master/>`_ uses a row-level
+abstraction, ``InternalRow``, as the default data format interface.
+Row-level interfaces are generally more intuitive for programming and can be
+easily integrated into data processing pipelines such as filtering and merge sorting.
+However, this approach introduces conversion and access overhead,
+making it difficult to fully leverage the additional performance benefits provided
+by modern CPU SIMD vectorization.
+
+Considering that the C++ implementation focuses more on end-to-end performance,
+and that underlying data file formats (e.g., ORC, Parquet) are predominantly
+columnar, providing a columnar-centric data abstraction can minimize overhead
+during data flow, integrate more naturally with vectorized execution engines,
+and ultimately deliver superior overall performance.
+
+Why Apache Arrow
+----------------
+
+Apache Arrow is currently the most widely adopted in-memory columnar format and
+has strong native support for Parquet and ORC. It is well-integrated across
+open-source engines including Spark, Pandas, Drill, Impala, and Velox.
+
+Overall, using Apache Arrow as the in-memory format for Paimon C++ allows us to:
+
+- Maximize columnar performance and efficient data access patterns.
+- Seamlessly integrate with the Apache Arrow ecosystem and tooling.
+- Benefit from mature interoperability with popular data systems and formats.
+
+Versioning and Dependency Concerns
+----------------------------------
+
+One important consideration is that Arrow is an active open-source project with
+a broad and evolving C++ surface area that spans data formats, compute kernels,
+and file I/O. Due to frequent releases and a large API surface, different Arrow
+C++ SDK versions can introduce API incompatibilities.
+
+If Paimon C++ directly depends on the full Arrow C++ SDK, it may conflict with
+existing Arrow C++ dependencies in other compute engines, raising integration
+costs and increasing long-term maintenance complexity.
+
+Adopting the Arrow C Data Interface
+-----------------------------------
+
+To leverage Arrow's performance and ecosystem benefits while avoiding tight
+coupling to specific Arrow C++ SDK versions, we use the Arrow C Data
+Interface as the default in-memory format for Paimon C++.
+
+Key advantages:
+
+- Version-neutral: The C Data Interface is designed to be stable and forward-compatible
+  across Arrow versions.
+- Compiler-neutral: C language interfaces avoid ABI friction commonly seen with
+  C++ compilers and standard libraries.
+- Broad interoperability: The C Data Interface is supported by Arrow-based
+  systems and enables zero-copy or minimal-copy interchange of columnar data.
+
+Design Principles
+-----------------
+
+- Columnar-first abstraction:
+  Paimon C++ will represent in-memory data using columnar buffers and schemas
+  compatible with the Arrow C Data Interface, minimizing transformation overhead.
+
+- Minimal dependency footprint:
+  Prefer stable C interfaces and lightweight utility layers; avoid linking
+  against the full Arrow C++ SDK unless strictly necessary and well-isolated.
+
+- Vectorization-aware execution:
+  Structure data layouts to align with SIMD processing (e.g., contiguous
+  buffers, clear null bitmaps and type-specific arrays), enabling efficient
+  filtering, projection, and aggregation.
+
+- Interoperability:
+  Ensure that data produced and consumed by Paimon C++ can be handed off to
+  Arrow-compatible engines and libraries without expensive conversions.
+
+- Compatibility with columnar storage:
+  Maintain efficient paths from columnar file formats (Parquet, ORC) to in-memory
+  columnar representations, minimizing decoding and marshaling overhead.
+
+Implementation Outline
+----------------------
+
+Schema and buffers
+~~~~~~~~~~~~~~~~~~~
+- Represent schemas and arrays using Arrow C Data Interface types (e.g., ``ArrowSchema``, ``ArrowArray``) with clear ownership and lifecycle.
+- Support nested types (structs, lists, maps) and common primitives (integers, floats, decimals, timestamps).
+
+Memory management
+~~~~~~~~~~~~~~~~~~~~
+- Define consistent ownership semantics for buffers and child arrays.
+- Employ reference counting or explicit release callbacks aligned with the Arrow C conventions.
+
+Nullability and validity
+~~~~~~~~~~~~~~~~~~~~~~~~
+- Use standard validity bitmaps for nullability and adhere to Arrow's canonical buffer organization (validity, offsets, data, etc.).
+
+Conversion boundaries
+~~~~~~~~~~~~~~~~~~~~~~
+- Provide adapters to
+  * Read from columnar file formats (Parquet/ORC) into Arrow-compatible ``ArrowArray`` structures.
+  * Export/import data to other Arrow-compatible engines with zero or minimal copies.
+
+- Keep these adapters independent from heavy Arrow C++ SDK dependencies.
diff --git a/_sources/user_guide/catalog.rst.txt b/_sources/user_guide/catalog.rst.txt
new file mode 100644
index 00000000..d881968c
--- /dev/null
+++ b/_sources/user_guide/catalog.rst.txt
@@ -0,0 +1,417 @@
+.. 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.
+
+.. _catalog:
+
+Catalog
+==========================
+Paimon C++ provides a :ref:`Catalog abstraction <cpp-api-catalog>` to manage the table of contents and metadata. The Catalog
+abstraction provides a series of ways to help you better integrate with computing engines. We always
+recommend that you use Catalog to access the Paimon table.
+
+Paimon C++ supports two metastores, selected with the catalog option
+``metastore``: the filesystem metastore (default) and the REST metastore.
+
+Filesystem Catalog
+~~~~~~~~~~~~~~~~~~
+The filesystem metastore (``metastore=filesystem``, the default) stores both
+metadata and table files in filesystems. The ``root_path`` argument of
+``Catalog::Create`` is the warehouse directory holding the databases and tables.
+
+REST Catalog
+~~~~~~~~~~~~
+With the REST metastore (``metastore=rest``), catalog metadata is managed by a
+remote catalog server exposed through a REST API; table data itself is still read
+and written through the table paths returned by the server. See `Java Paimon REST
+Catalog <https://paimon.apache.org/docs/master/concepts/rest/>`_ for the concept
+and the server-side protocol.
+
+REST catalog support is an optional build component: configure the build with
+``-DPAIMON_ENABLE_REST=ON`` (see :ref:`cpp_build_optional_components`).
+
+When ``metastore=rest``, the ``root_path`` argument of ``Catalog::Create`` is not
+a filesystem path but the warehouse (instance) name under which the tables are
+registered on the REST server. The catalog is configured through the
+``CatalogOptions`` keys:
+
+* ``metastore``: must be ``rest`` to select the REST catalog.
+* ``uri``: server url of the REST catalog server.
+* ``token.provider``: authentication provider of the REST catalog. ``bear``
+  (the protocol's historical spelling of "bearer") and ``dlf`` are supported.
+* ``token``: token of the ``bear`` token provider.
+* ``dlf.region``: region used by DLF request signing. It is inferred from the
+  endpoint URI when omitted.
+* ``dlf.access-key-id`` and ``dlf.access-key-secret``: static DLF access key.
+* ``dlf.security-token``: optional STS security token used with a static access
+  key.
+* ``dlf.token-path``: path to a JSON file containing refreshable DLF credentials.
+* ``dlf.token-loader``: refreshable credential loader. ``local_file`` reads
+  ``dlf.token-path`` and ``ecs`` obtains an STS token from an ECS RAM role.
+* ``dlf.token-ecs-metadata-url``: ECS RAM role metadata endpoint. It defaults to
+  ``http://100.100.100.200/latest/meta-data/Ram/security-credentials/``.
+* ``dlf.token-ecs-role-name``: optional ECS RAM role name. The loader discovers
+  the role from the metadata endpoint when it is omitted.
+* ``dlf.signing-algorithm``: ``default`` selects DLF4-HMAC-SHA256 for DLF VPC
+  endpoints and ``openapi`` selects ROA HMAC-SHA1 for DlfNext OpenAPI endpoints.
+  When omitted, an endpoint containing ``dlfnext`` selects ``openapi`` and other
+  endpoints select ``default``.
+* ``table-default.<key>``: table option defaults applied when a created table
+  left ``<key>`` unset.
+* ``header.<name>``: sent as the ``<name>`` http header on every request to the
+  server. The server may configure headers of its own through the ``/v1/config``
+  endpoint, which are merged with these as any other option is.
+
+.. code-block:: cpp
+
+   std::map<std::string, std::string> options = {
+       {"metastore", "rest"},
+       {"uri", "http://127.0.0.1:8080"},
+       {"token.provider", "bear"},
+       {"token", "<token>"},
+   };
+   PAIMON_ASSIGN_OR_RAISE(std::unique_ptr<paimon::Catalog> catalog,
+                          paimon::Catalog::Create(/*root_path=*/"my_instance", options));
+
+For DLF, configure one credential source. Static AK/SK credentials, an optional
+STS token, a refreshable local token file, and ECS RAM role credentials are
+supported. A local or ECS token has the Java-compatible JSON fields
+``AccessKeyId``, ``AccessKeySecret``, ``SecurityToken`` and ``Expiration``. The
+last field uses UTC ``yyyy-MM-dd'T'HH:mm:ss'Z'`` format. Refreshable credentials
+are reloaded when less than one hour of validity remains.
+
+.. code-block:: cpp
+
+   std::map<std::string, std::string> options = {
+       {"metastore", "rest"},
+       {"uri", "https://dlfnext.cn-hangzhou.aliyuncs.com"},
+       {"token.provider", "dlf"},
+       {"dlf.access-key-id", "<access-key-id>"},
+       {"dlf.access-key-secret", "<access-key-secret>"},
+       // Optional for temporary credentials:
+       {"dlf.security-token", "<security-token>"},
+   };
+
+On creation the catalog queries the server's ``/v1/config`` endpoint and merges
+its response with the options above: the server's overrides win over the client
+options, which in turn win over the server's defaults.
+
+Databases and tables are then created, listed, loaded, renamed and dropped
+through the regular ``Catalog`` API, and table snapshots can be listed through
+``Catalog::ListSnapshots``.
+
+Committing through the catalog
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+A REST catalog reports ``Catalog::SupportsVersionManagement() == true`` and
+publishes snapshots through the server. Pass the catalog and table identifier
+to ``CommitContextBuilder::WithCatalog`` to commit on local or object storage
+without an atomic snapshot-file rename:
+
+.. code-block:: cpp
+
+   // Writers and committers share ownership of the catalog.
+   std::shared_ptr<paimon::Catalog> shared_catalog(std::move(catalog));
+
+   // Load the table's identity before preparing changes.
+   PAIMON_ASSIGN_OR_RAISE(std::shared_ptr<paimon::Table> table,
+                          shared_catalog->GetTable(paimon::Identifier("db", "tbl")));
+
+   paimon::CommitContextBuilder builder(table_path, "commit-user");
+   builder.WithCatalog(shared_catalog, paimon::Identifier("db", "tbl"));
+   // CatalogUuid() stays null when the server supplies no id.
+   if (std::optional<std::string> table_uuid = table->CatalogUuid()) {
+       builder.WithTableId(table_uuid.value());
+   }
+   PAIMON_ASSIGN_OR_RAISE(std::unique_ptr<paimon::CommitContext> context, builder.Finish());
+   PAIMON_ASSIGN_OR_RAISE(std::unique_ptr<paimon::FileStoreCommit> commit,
+                          paimon::FileStoreCommit::Create(std::move(context)));
+   PAIMON_RETURN_NOT_OK(commit->Commit(commit_messages));
+
+Configure native writers with the same catalog and identifier. They load the
+current schema and latest snapshot from the catalog, including committed
+offsets when a real-time writer is created:
+
+.. code-block:: cpp
+
+   paimon::WriteContextBuilder write_builder(table_path, "commit-user");
+   write_builder.WithCatalog(shared_catalog, paimon::Identifier("db", "tbl"));
+   PAIMON_ASSIGN_OR_RAISE(std::unique_ptr<paimon::WriteContext> write_context,
+                          write_builder.Finish());
+   PAIMON_ASSIGN_OR_RAISE(std::unique_ptr<paimon::FileStoreWrite> writer,
+                          paimon::FileStoreWrite::Create(std::move(write_context)));
+
+For real-time writes, also set ``WithStreamingMode(true)`` and
+``WithRealtimeContext(...)`` with ``realtime.enabled=true``. After
+``CommitWithProgress`` succeeds, pass its returned snapshot id to
+``writer->RefreshCommittedSnapshot`` to release committed in-memory data.
+The refresh reads the current snapshot from the catalog. If another commit has
+already advanced the latest snapshot, the requested snapshot must be published
+under the table path. Recreating the writer restores offsets from the catalog's
+current snapshot.
+
+Both builders use the file system of the table being written or committed for
+manifests and data, so a catalog that issues temporary credentials per table
+serves them through ``Catalog::GetTableFileSystem``. ``WithFileSystem`` overrides
+it; writers also allow ``WithFileSystemSchemeToIdentifierMap`` to override
+file-system selection. For format tables, use ``WriteContextBuilder(FormatTable)``
+instead.
+
+A file system passed to ``WithFileSystem`` is used exactly as it is: neither the
+built-in file systems nor the table's own credentials are involved, so a custom
+one has to authenticate its own accesses. Draw credentials that expire from a
+``CredentialProvider`` you build with ``CredentialProviderFactory``: hold the
+provider and call ``CredentialProvider::GetCredentials`` at each access, which
+returns credentials that are still valid and reloads them before they expire.
+
+.. code-block:: cpp
+
+   PAIMON_ASSIGN_OR_RAISE(std::shared_ptr<paimon::CredentialProvider> provider,
+                          paimon::CredentialProviderFactory::Get("my-token-service",
+                                                                 "oss://bucket/tbl", options));
+   // MyFileSystem merges provider->GetCredentials() over its own options per access.
+   auto my_fs = std::make_shared<MyFileSystem>(provider);
+   write_builder.WithCatalog(shared_catalog, paimon::Identifier("db", "tbl"))
+       .WithFileSystem(my_fs);
+
+The snapshot being committed carries a uuid generated on the client, and the
+commit names the snapshot it is based on by that snapshot's uuid, so the server
+can tell a commit that raced another. A commit which lost such a race is
+rebased on the new latest snapshot and retried, bounded by ``commit.max-retries``
+and ``commit.timeout`` as a file-system commit is.
+
+The HTTP client neither retries nor follows redirects for a commit request.
+Transport errors and non-success responses, including 429, 503 and redirects,
+leave the outcome uncertain: the server may already have accepted the snapshot.
+Its metadata files are retained. Use ``FilterAndCommit`` for batch recovery;
+after a real-time error, recreate the writer and context and recover from durable
+offsets as described by ``CommitWithProgress``.
+
+The main branch's current schema and latest snapshot need no files under the table
+path. A branch needs its schema published under its own directory, while its
+latest snapshot can be held by the catalog alone, as described below.
+A catalog response of ``{"snapshot": null}`` means the table has no snapshot.
+Only a catalog reporting that snapshot loading is unsupported falls back to
+file-system lookup; other catalog errors propagate to the caller.
+
+Read ``Table::CatalogUuid()`` before preparing changes and pass it to
+``WithTableId`` so the server can reject commits to a dropped and recreated table.
+``Table::Uuid()`` can fall back to the table name and must not supply this id.
+An unset table id is sent as null and subject to server validation. Each commit
+attempt to the main branch reloads the catalog's current schema id for the new
+snapshot; on a branch it reloads the id published under the branch.
+
+.. note::
+
+   Manifests, data and historical metadata still require file-system access:
+
+   * ``FilterAndCommit``, ``CommitWithProgress`` and streaming writer recovery
+     may walk older snapshots to find the commit user's last snapshot. Those
+     snapshots must be published under the table path. A missing retained
+     snapshot is an error; the ``EARLIEST`` hint distinguishes expired history.
+   * ``RowIdCheckConflict`` reuses the latest snapshot from the catalog and reads
+     earlier snapshots from the table path. With data evolution enabled, the
+     check also requires the schemas recorded by the row-id files it inspects.
+     Publishing only the current schema is insufficient when files use older ids.
+   * ``RollbackToAsLatest`` reads its target snapshot from the table path.
+     ``Expire`` manages only snapshots published there and updates the
+     ``EARLIEST`` hint; it does not expire catalog-held metadata.
+     Before deleting files, expiration verifies that the catalog's current
+     snapshot matches the latest published snapshot and reads the retained
+     history. It skips expiration while the current snapshot is unpublished
+     or differs from its file-system copy. Catalog and retained-metadata read
+     errors stop expiration before deletion. A catalog that does not support
+     loading its current snapshot cannot perform local expiration.
+     Retained snapshots with index manifests also stop expiration with
+     ``NotImplemented`` before any files are deleted.
+
+Expiration preserves files referenced by retained snapshots, including files
+restored by ``RollbackToAsLatest``. Serialize rollback and expiration through
+the upstream coordinator: a rollback must finish before expiration starts,
+so its restored file references are visible to the expiration operation.
+
+.. warning::
+
+   ``Expire`` returns ``NotImplemented`` before reading any snapshot or deleting
+   any file when it runs on a branch other than main, or finds one under
+   ``branch/branch-<name>`` of the table path. Data files are shared by every
+   branch of the table, while expiration reads only the retained snapshots of the
+   branch it runs on, so it could delete a file another branch still refers to.
+   A branch the catalog holds without that directory, or one created while
+   expiration runs, is not found: do not expire a table with such a branch, and
+   serialize branch creation and expiration through the upstream coordinator.
+
+Reading through the catalog
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+To read a native table with the per-table temporary credentials a catalog issues,
+pass the catalog and table identifier to ``ReadContextBuilder::WithCatalog`` or
+``ScanContextBuilder::WithCatalog``. This is a shorthand for asking the catalog
+for that table's file system and passing it in through ``WithFileSystem``:
+
+.. code-block:: cpp
+
+   // Readers and scanners share ownership of the catalog.
+   std::shared_ptr<paimon::Catalog> shared_catalog(std::move(catalog));
+
+   paimon::ScanContextBuilder scan_builder(table_path);
+   scan_builder.WithCatalog(shared_catalog, paimon::Identifier("db", "tbl"));
+   PAIMON_ASSIGN_OR_RAISE(std::unique_ptr<paimon::ScanContext> scan_context,
+                          scan_builder.Finish());
+   PAIMON_ASSIGN_OR_RAISE(std::unique_ptr<paimon::TableScan> scan,
+                          paimon::TableScan::Create(std::move(scan_context)));
+
+   paimon::ReadContextBuilder read_builder(table_path);
+   read_builder.WithCatalog(shared_catalog, paimon::Identifier("db", "tbl"));
+   PAIMON_ASSIGN_OR_RAISE(std::unique_ptr<paimon::ReadContext> read_context,
+                          read_builder.Finish());
+   PAIMON_ASSIGN_OR_RAISE(std::unique_ptr<paimon::TableRead> read,
+                          paimon::TableRead::Create(std::move(read_context)));
+
+When ``Finish()`` builds the context, it asks the catalog for the table's file
+system through ``Catalog::GetTableFileSystem`` and uses it as-is for the schema,
+snapshots, manifests and data under the table path, so it signs every access with
+the table's credentials and reloads them as they expire. An explicit
+``WithFileSystem`` takes precedence, so the catalog is not asked. A catalog that
+issues no per-table credentials returns its catalog-level file system, so this is
+also how you read with the catalog's own object-store credentials. For a format
+table, use ``ReadContextBuilder(FormatTable)`` or ``ScanContextBuilder(FormatTable)``
+instead; ``WithCatalog`` is rejected because the table already carries the file
+system it was loaded through.
+
+The C++ REST catalog covers the database, table, snapshot and commit operations
+of the ``Catalog`` API. The parts of the Java REST catalog that have no C++
+counterpart yet — altering a database or a table, views, functions, partitions,
+tags, branch management and consumers — are not supported. Creating, deleting
+and merging a branch is what branch management covers; committing to a branch
+that already exists is supported, as described below.
+
+Committing to a branch
+~~~~~~~~~~~~~~~~~~~~~~
+This library creates no branch: one has to exist, with its schema published under
+``branch/branch-<name>``, before a write or a commit can be aimed at it.
+
+Naming the branch
+^^^^^^^^^^^^^^^^^
+A branch is addressed by the identifier of ``WithCatalog``, which
+``paimon::Identifier("db", "tbl", "dev")`` builds as ``tbl$branch_dev``, so that
+the catalog answers for the branch: the snapshot it loads is the branch's, and
+the commit request is addressed to that branch by that identifier rather than by
+anything in its body. The ``branch`` option and, for writers, ``WithBranch`` may
+name the same branch as well; naming two different branches is rejected rather
+than resolved, and ``tbl$branch_main``, ``branch=main`` and an empty name all
+mean the main branch. Naming a branch only in the option or ``WithBranch`` while
+the identifier names the bare table is rejected, as the catalog would then answer
+for the table while the files were written for the branch.
+
+Names a catalog cannot tell apart from another object are rejected where a
+builder sees them: a name differing from ``main`` by case alone, such as
+``tbl$branch_MAIN`` or ``branch=MAIN``, which a catalog reads as the main branch
+while its snapshots go to a directory of their own; and a name holding a ``$``,
+such as ``branch=dev$options``, which ``tbl$branch_dev$options`` reads back as
+the ``options`` system table of branch ``dev``. ``paimon::Identifier("db",
+"tbl", "MAIN")`` never reaches that check: the constructor folds every spelling
+of ``main`` into the bare table name, as the Java client does, and so names the
+main branch.
+
+What a branch keeps and what it shares
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+A branch other than the main one publishes its schema and real-time offsets
+under ``branch/branch-<name>``, where a snapshot written to the file system goes
+as well; the main branch keeps these files under the table path. A
+version-managed catalog can hold the latest snapshot of either branch alone.
+Data and manifests are shared by all branches under the table path,
+which is why expiration is not supported on a table with branches, as noted
+above.
+
+A write or a commit aimed at a branch reads that schema rather than the
+catalog's, just as a read of that branch does, and asks the catalog for no schema
+at all, so a catalog serving only the table's own current schema still takes the
+branch's snapshots. The new snapshot records the schema id published there as
+well, which is the id a read of the branch resolves under
+``branch/branch-<name>``; only on the main branch is the recorded id the one the
+catalog reports, as its current schema may live nowhere else. Data files record
+the schema they were written with, as they do on the main branch.
+
+Addressing a branch without a catalog client
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+``UseRESTCatalogCommit`` builds the request instead of sending it, and takes the
+branch from the ``branch`` option alone, as it is configured without an
+identifier. The request body carries the table id but no table name and no
+branch, so the branch has to appear in the URL the caller sends that body to:
+the commit endpoint of ``tbl$branch_dev``, not the one of ``tbl``. A body sent
+to the bare table's URL publishes the branch's snapshot on the main branch.
+
+Authenticating with credentials of your own
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Credentials that a catalog does not issue — from a token service of your own, or
+from a store Paimon has no client for — reach a file system through a
+``CredentialProvider`` that you consult yourself. Implement it together with a
+``CredentialProviderFactory`` that builds it and register the factory with
+``REGISTER_PAIMON_FACTORY``. Build a provider with
+``CredentialProviderFactory::Get``, wrap it in a ``FileSystem`` of your own that
+calls ``CredentialProvider::GetCredentials`` as it signs each access, and pass
+that file system in through ``Catalog::Create`` or a builder's ``WithFileSystem``.
+A file system passed this way is used as-is, so the credentials are reloaded as
+they expire without it being rebuilt.
+
+The built-in file systems — ``oss``, ``s3``, ``local``, ``jindo`` — do not consult
+a provider: they sign with the static credentials of their own options. Bring a
+file system of your own when the credentials expire.
+
+.. code-block:: cpp
+
+   class MyCredentialProvider : public paimon::CredentialProvider {
+    public:
+       // Called as each access is signed; reload the credentials before they expire.
+       paimon::Result<std::map<std::string, std::string>> GetCredentials() const override {
+           return std::map<std::string, std::string>{
+               {"fs.oss.accessKeyId", ...}, {"fs.oss.accessKeySecret", ...},
+               {"fs.oss.securityToken", ...}};
+       }
+   };
+
+   class MyCredentialProviderFactory : public paimon::CredentialProviderFactory {
+    public:
+       const char* Identifier() const override {
+           return "my-token-service";
+       }
+
+       paimon::Result<std::shared_ptr<paimon::CredentialProvider>> Create(
+           const std::string& path,
+           const std::map<std::string, std::string>& options) const override {
+           return std::make_shared<MyCredentialProvider>(path, options);
+       }
+   };
+
+   REGISTER_PAIMON_FACTORY(MyCredentialProviderFactory);
+
+The credentials are file-system options, e.g. ``fs.oss.securityToken``, and are
+merged over the options the file system was configured with, so a provider serves
+only what rotates and the endpoint and the rest stay in the options. The options
+the factory is called with are those of the accesses to authenticate, which is
+where an implementation reads its own configuration, such as the address of the
+token service, from.
+
+Merge the credentials into your file system's options with
+``CredentialProvider::MergeOptionsWithCredentials`` rather than by hand, so they are
+shaped the same way the built-in data token file system shapes them. The default
+overlays the credentials key by key over the base options, mirroring the Java
+client. A provider that knows the file system its credentials are for overrides
+``MergeOptionsWithCredentials`` to normalize option aliases or clear the stale
+bucket-scoped variants the fresh credentials replace.
+
+All factories share one identifier space, so an identifier a file system factory
+already takes — ``oss``, ``s3``, ``local``, ``jindo`` — would replace it; name the
+provider after where its credentials come from instead.
diff --git a/_sources/user_guide/clean.rst.txt b/_sources/user_guide/clean.rst.txt
new file mode 100644
index 00000000..d0df8186
--- /dev/null
+++ b/_sources/user_guide/clean.rst.txt
@@ -0,0 +1,169 @@
+.. 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.
+
+Data Cleanup
+===================================
+.. note::
+
+  The entire data cleanup feature supports only append tables, and cleanup of index manifests, changelog, statistics are not supported. Do not use this feature with primary key tables.
+
+This document describes three cleanup capabilities:
+
+- :ref:`orphan-file-cleanup`
+- :ref:`expiring-partitions`
+- :ref:`expiring-snapshots`
+
+.. _orphan-file-cleanup:
+
+Orphan File Cleanup
+-------------------
+
+Description
+~~~~~~~~~~~~~~~~~~~
+
+- Orphan file cleanup currently supports only append tables.
+- It runs as an independent task: construct a ``CleanContext`` and
+  launch an ``OrphanFilesCleaner``.
+
+Detailed Steps
+~~~~~~~~~~~~~~
+
+1. List all Paimon-specific subdirectories under the table directory
+   (e.g., ``manifest/``, ``snapshot/``, ``f1=10/bucket-0``, ...).
+2. Based on the subdirectories from step 1, enumerate all Paimon files
+   in the table directory.
+3. Using snapshot information, determine all in-use ``manifest`` files
+   and data files.
+4. Compute the set of files that appear in step 2 but not in step 3
+   (i.e., orphan files). Among those, delete files whose modification
+   time is earlier than ``older_than_ms``.
+
+Performance Considerations
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+- Steps 1, 2, and 4 use an executor to parallelize I/O operations.
+- Orphan file cleanup may take a long time; you can pass an executor
+  with more threads to accelerate the process.
+
+.. admonition:: TODO
+  :class: tip
+
+  - Support cleanup of index manifests, changelog, statistics, etc.
+
+.. _expiring-partitions:
+
+Expiring Partitions
+-------------------
+
+Description
+~~~~~~~~~~~~~~~~~~~
+
+- Executed within the Commit task. First construct a ``FileStoreCommit``.
+- ``DropPartition`` uses a mark-delete strategy. Calling ``DropPartition``
+  will send an ``Overwrite`` message, marking all data files in the
+  specified partition as ``DELETE``.
+- A new snapshot is committed afterward. Actual deletion of data files
+  occurs as snapshots expire.
+
+Detailed Steps
+~~~~~~~~~~~~~~
+
+1. Build a ``ScanFilter`` for the partition and use the latest snapshot
+   to scan the partition.
+2. Iterate over the scanned data file list (``ManifestEntries``) and
+   rewrite each entry's type to ``DELETE``.
+3. Commit using the rewritten ``ManifestEntries``. If the commit fails,
+   retry a limited number of times.
+
+.. _expiring-snapshots:
+
+Expiring Snapshots
+------------------
+
+Description
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+- Executed within the Commit task. First construct a ``FileStoreCommit``.
+- The following optional configuration parameters control snapshot
+  expiration:
+
+  - ``snapshot.num-retained.min``: The minimum number of completed
+    snapshots to retain (>= 1). Default: 10.
+  - ``snapshot.num-retained.max``: The maximum number of completed
+    snapshots to retain (>= ``snapshot.num-retained.min``). Default:
+    ``int32`` max value.
+  - ``snapshot.time-retained``: The maximum age of completed snapshots
+    to retain. Default: 1 hour.
+  - ``snapshot.expire.limit``: The maximum number of snapshots allowed
+    to expire at a time. Default: 10.
+
+- The snapshot expiration interface deletes data files according to the
+  expiration policy and returns the number of snapshots deleted.
+- Expiration on a branch other than main, or on a table with such a branch under
+  ``branch/branch-<name>``, is not supported: branches share the table's data
+  files, so expiration returns ``NotImplemented`` before deleting anything.
+- A branch is found only by that directory. A branch held only by a catalog, or
+  one created while expiration runs, is not found, and expiration could delete
+  data files it still refers to: do not expire a table with such a branch, and
+  serialize branch creation and expiration.
+
+Detailed Steps
+~~~~~~~~~~~~~~
+
+1. Use ``snapshot_manager`` to find ``earliest_snapshot_id`` and
+   ``latest_snapshot_id``.
+2. Based on ``earliest/latest_snapshot_id`` and the expire config,
+   determine the range of snapshots to clean.
+
+.. note::
+
+     Consumer subscription management (consumer manager) is not
+     currently supported. Users must ensure that snapshots to be expired
+     are not in use.
+
+3. Verify that the snapshot range is continuous. Normally, it is
+   continuous. If a snapshot is missing, assume earlier snapshots were
+   already cleaned and the missing files are orphaned remnants due to
+   I/O exceptions; they are out of scope for this cleanup.
+4. Clean data files for the updated expiration range.
+
+   - To decide whether a file from a snapshot should be deleted, check if it was marked ``DELETE`` in the delta of the subsequent snapshot.
+   - For an expiration range ``[begin, end)``, iterate over ``(begin,end]`` and delete data files whose type is ``DELETE`` in each ``snapshot.DeltaManifestList()``.
+   - If a file underwent multiple ``ADD`` and ``DELETE`` operations, deletion follows the operation order:
+
+     * ``ADD`` then ``DELETE`` → the file is deleted.
+     * ``DELETE`` then ``ADD`` → the initial ``DELETE`` does not apply (file did not exist yet); the subsequent ``ADD`` ensures the file remains.
+
+5. Clean meta files:
+   - Preserve manifests used by the last snapshot in the cleanup range (``end_exclusive_id``).
+   - Delete manifest files used by snapshots from ``begin_inclusive_id`` to ``end_exclusive_id`` (exclusive) and delete the snapshot files themselves.
+6. Rewrite ``EarliestHint`` to ``end_exclusive_id``.
+7. Return the number of snapshots deleted, i.e., ``end_exclusive_id - begin_inclusive_id``.
+
+Performance Considerations
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+- Step 4 uses an executor to parallelize file deletions.
+- If deletion is slow, pass an executor with more threads to accelerate
+  the process.
+
+.. admonition:: TODO
+  :class: tip
+
+  - Preserve tag (savepoint) data via ``tagManager``.
+  - Delete changelog files.
+  - Remove empty directories.
diff --git a/_sources/user_guide/commit.rst.txt b/_sources/user_guide/commit.rst.txt
new file mode 100644
index 00000000..7e7ee171
--- /dev/null
+++ b/_sources/user_guide/commit.rst.txt
@@ -0,0 +1,126 @@
+.. 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.
+
+Commit
+==========================================
+
+Commit is a critical stage in Paimon's write path. It is responsible for generating
+Snapshot files that describe the current state of a Paimon table. This document
+provides a detailed analysis of the Paimon Commit process.
+
+Commit Process Overview
+--------------------------
+
+The input to Commit is a ``CommitMessage``, which is produced by the write
+operation through ``PrepareCommit``. It records all data files generated during
+the write phase.
+
+The Commit process consists of the following steps:
+
+1. Collect file changes
+2. Compact (merge) Manifest files
+3. Generate the Base Manifest List
+4. Generate new Manifest files and the Delta Manifest List
+5. Generate the Snapshot and HINT file
+
+Detailed Process
+-------------------
+
+Collect File Changes
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+During Commit, the system extracts key information from ``CommitMessages``—such as
+file name, operation type (``ADD`` or ``DELETE``), the file's Partition and Bucket—
+and converts them into ``ManifestEntry`` records.
+
+A ``ManifestEntry`` represents a single operation record in a manifest file and
+corresponds to a change to one file.
+
+Paimon snapshots track two manifest list files:
+
+- Base Manifest List: Describes the data that existed prior to the current Snapshot.
+  Because there may be multiple manifest files, the base manifest list records
+  metadata for all original manifest files.
+- Delta Manifest List: Records the changes (adds/deletes) produced by the current Commit.
+
+Compact (Merge) Manifest Files
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+To control the number and size of manifest files, the system determines whether
+existing manifest files should be compacted prior to generating a new Snapshot.
+
+Compaction starts by fetching the latest Snapshot and using its base and delta
+manifest lists to locate all relevant manifest files.
+
+Two compaction strategies are used: Full Compaction and Minor Compaction.
+
+Full Compaction
+^^^^^^^^^^^^^^^
+
+Full Compaction is attempted first. The system iterates over candidate files and
+classifies them as follows:
+
+- Base files: If a file has no ``DELETE`` operations and its size exceeds the
+  target file size (default 8 MB), the file is categorized as base.
+- Delta files: Remaining files are categorized as delta. The system computes the
+  total size of delta files; if the total exceeds the Full Compaction threshold
+  (default 16 MB), the delta files are merged.
+
+Minor Compaction
+^^^^^^^^^^^^^^^^
+
+If Full Compaction's conditions are not met, Minor Compaction is attempted:
+
+- The system iterates over all files, skipping any file larger than the target file size.
+- Whenever the accumulated size of selected files exceeds the target file size, those files are merged.
+- If there are still unmerged files and their count exceeds the minimum compaction trigger
+  threshold (default 30 files), a merge is triggered.
+
+Compaction Rules
+^^^^^^^^^^^^^^^^
+
+1. If duplicate ``ADD`` operations for the same file are discovered, an error is raised.
+2. ``ADD`` and ``DELETE`` for the same file neutralize each other.
+
+Generate the Base Manifest List
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+After compaction (which may or may not be triggered every time), the system obtains
+a consolidated set of manifest file metadata. This metadata is written into a new
+manifest list file, forming the Snapshot's base manifest list.
+
+Generate New Manifest Files and the Delta Manifest List
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The initially collected file change information is written into new manifest files.
+Metadata for these newly created manifest files is then written into the delta
+manifest list.
+
+Generate the Snapshot and HINT File
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+After the above steps are completed, the system generates a new Snapshot and performs
+the following operations:
+
+1. Determine the new Snapshot ID based on the latest ``SnapshotId + 1``.
+2. Record metadata such as ``schema id``, ``commit time``, and ``total record count``.
+3. Atomicity guarantee: Generating a Snapshot is an atomic operation. If an exception
+   (e.g., an I/O error) occurs during the process, the manifest files and manifest list files
+   generated in Steps 2–4 are cleaned up and removed.
+4. The Snapshot is written via a rename operation to ensure atomicity.
+5. After the Snapshot is successfully written, the system writes the ``LATEST`` hint file
+   to reduce list operations when fetching the latest Snapshot.
diff --git a/_sources/user_guide/compaction.rst.txt b/_sources/user_guide/compaction.rst.txt
new file mode 100644
index 00000000..b8475dec
--- /dev/null
+++ b/_sources/user_guide/compaction.rst.txt
@@ -0,0 +1,308 @@
+.. 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.
+
+Compaction
+==========
+Compaction is the process of merging multiple small data files into fewer, larger
+files. It is a resource intensive procedure which consumes CPU time and disk IO,
+so too frequent compaction may result in slower writes. However, without
+compaction, the accumulation of small files degrades query performance. Tuning
+compaction is therefore a trade-off between write throughput and read efficiency.
+
+.. note::
+   - There can only be one job working on the same partition's compaction,
+     otherwise it will cause conflicts.
+   - Paimon C++ does not support producing changelog for now.
+   - Automatic compaction is disabled when ``write-only`` is set to ``true``,
+     or when an append-only table uses unaware-bucket mode (``bucket = -1``).
+   - For a complete list of compaction-related configurations, see the
+     :ref:`Options API Reference <cpp-api-options>`.
+
+Append-Only Table Compaction
+----------------------------
+In append-only table, data files are simply appended in sequence order.
+Over time, many small files accumulate, which degrades read performance due to the
+overhead of opening and scanning numerous files.
+
+Append-only table compaction merges multiple small files into fewer, larger files
+to improve read efficiency. The compaction is performed asynchronously and does
+not block writes.
+
+.. note::
+   Automatic append-only table compaction is only available for fixed-bucket
+   mode (``bucket > 0``). Writers of unaware-bucket tables (``bucket = -1``) do
+   not compact, and tables with blob columns also skip automatic compaction.
+   ``AppendCompactCoordinator::Run`` explicitly compacts ``bucket = -1``
+   tables, but rejects data-evolution tables, which include every table with
+   blob columns, since its rewrite can merge neither their column layers nor
+   their blob files.
+
+.. _data-evolution-deletion-vectors-compaction:
+
+.. note::
+   A data-evolution table (``data-evolution.enabled = true``) may enable
+   ``deletion-vectors.enabled``. Paimon C++ never compacts such a table: auto
+   compaction never runs on it, since data evolution requires ``bucket = -1``,
+   and ``AppendCompactCoordinator::Run``, the dedicated compaction entry point,
+   rejects it outright rather than dropping the deletes. This matches the
+   Paimon Java revision this support was ported from, which ends the compaction
+   scan as soon as deletion vectors are enabled; later Java releases do compact
+   such a table, and Paimon C++ has not caught up.
+
+   Reading such a table is supported; see
+   :ref:`data-evolution-deletion-vectors`.
+
+Auto Compaction
+~~~~~~~~~~~~~~~
+During each flush, the writer triggers a best-effort auto compaction. The
+compaction picker scans the file queue ordered by sequence number and selects a
+contiguous window of files for merging when the number of candidate files reaches
+the ``compaction.min.file-num`` threshold.
+
+Full Compaction
+~~~~~~~~~~~~~~~
+Full compaction rewrites all eligible files in the bucket. During full
+compaction:
+
+- Files whose size is already at or above ``compaction.file-size`` (and have no
+  associated deletion vectors) are skipped to avoid unnecessary rewrites.
+- When deletion vectors are enabled, all files are always eligible for
+  compaction regardless of size, because deletion vectors must be applied.
+- When ``compaction.force-rewrite-all-files`` is ``true``, all files are
+  rewritten unconditionally.
+- Without deletion vectors, full compaction only proceeds when the number of
+  small files exceeds the number of large files and the total file count is at
+  least 3.
+
+After compaction, if the last output file is still smaller than
+``compaction.file-size``, it is placed back into the compaction queue for future
+merging.
+
+Dictionary Passthrough
+~~~~~~~~~~~~~~~~~~~~~~
+An append-only compaction rewrite copies rows into the new file without
+inspecting any value, so a Parquet column that an input file already stores
+dictionary-encoded is forwarded to the writer still encoded instead of being
+expanded to one copy of the value per row and re-encoded. This saves the reader
+materializing the values and the writer hashing them again; how much that is
+worth depends on the column, and low-cardinality ``STRING`` columns benefit most.
+Primary-key compaction merges rows and is not covered.
+
+This is **off by default** and is enabled per table by setting
+``parquet.read.enable-dictionary-passthrough`` to ``true``. It is opt-in rather
+than automatic because of the output file size trade-off described below, which
+depends on the data and is not a win on every table. Measure before turning it
+on, and compare output file size as well as compaction time.
+
+Note that this is a *read* option, so it applies to every read of the table and
+not only to the compaction rewrite. The values are unchanged, but an eligible
+column reaches the consumer as an Arrow ``DictionaryArray`` rather than one value
+per row, and a consumer that reads columns through its own accessors has to
+unwrap it. Only a consumer that forwards batches without inspecting values -
+which is what the rewrite does - gains anything from the encoding.
+
+Once enabled, eligibility is decided per input file: a non-nested ``STRING``
+column is forwarded when its data pages are dictionary-encoded throughout every
+row group of *that* file, so one input file can be read encoded while the next
+one is read as ordinary values, and the writer takes both. A high-cardinality
+column that started dictionary-encoded and fell back to plain encoding therefore
+does not qualify, even though it still carries a dictionary page. ``BINARY`` is
+not forwarded although Parquet stores it in the same physical type and
+dictionary-encodes it the same way, because the value accessors cannot read a
+``BINARY`` dictionary. The rewrite also overrides the option back to ``false``
+when the table writes a format other than Parquet, when
+``parquet.enable-dictionary`` is ``false`` because the writer would only expand
+the values again, or when variant/map shredding is configured because those
+writers reshape each batch against a fixed physical schema. Setting the option
+therefore never makes a rewrite fail; at worst it has no effect.
+
+When the option is vetoed, the rewrite also enforces the veto on every input
+batch. A format reader can independently hand over dictionary-encoded columns
+because of its own lazy-decoding setting, so the rewrite decodes those columns
+before handing them to a writer that cannot accept dictionary arrays.
+
+If a file index is configured on a forwarded column, that column alone is
+materialized so the index still sees its values; the other columns stay encoded.
+
+Trade-off
+^^^^^^^^^
+Passthrough changes what the rewrite costs, not what it produces. The rewritten
+data is identical either way, but the output file can be **larger**.
+
+A Parquet column chunk can carry only one dictionary. The writer keeps the first
+dictionary a column presents in a row group and falls back to plain encoding for
+the rest of that row group as soon as a different one arrives. Compaction merges
+several input files, each with its own dictionary, and output row groups are cut
+by ``parquet.block.size`` and by the writer's memory limit, which are not aligned
+to input file boundaries - a boundary may coincide, but nothing arranges for it.
+So a rewrite can keep the first input file's dictionary and write the rest of the
+row group plain, where materializing and rebuilding would have hashed the values
+into a single dictionary for that row group (up to
+``parquet.dictionary.page.size``, past which the writer falls back to plain in
+either case). Where that happens the output column also becomes ineligible for
+passthrough on the next compaction round, since its data pages are then only
+partly dictionary-encoded.
+
+How often it happens, and what it costs on a given table, is what the
+measurement above is for.
+
+Passthrough is therefore worth enabling when the reduction in compaction CPU
+matters more than output size - for example when the same dictionary recurs
+across input files, when the columns are wide enough that materializing them
+dominates, or when the output is short-lived. Leave it off otherwise.
+
+Append-Only Table Compaction Options
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. list-table::
+   :header-rows: 1
+   :widths: 30 10 10 10 40
+
+   * - Option
+     - Required
+     - Default
+     - Type
+     - Description
+   * - ``compaction.min.file-num``
+     - No
+     - 5
+     - Integer
+     - The minimum number of files to trigger an auto compaction for
+       append-only tables.
+
+
+Primary Key Table Compaction
+----------------------------
+Primary key tables use an LSM tree (log-structured merge-tree) for file storage.
+When more and more records are written, the number of sorted runs increases.
+Because querying an LSM tree requires all sorted runs to be combined, too many
+sorted runs will result in poor query performance, or even out of memory.
+
+To limit the number of sorted runs, several sorted runs are merged into one big
+sorted run once in a while. Paimon currently adopts a compaction strategy similar
+to RocksDB's `universal compaction
+<https://github.com/facebook/rocksdb/wiki/Universal-Compaction>`_.
+
+Primary key table compaction solves:
+
+- Reduce Level 0 files to avoid poor query performance.
+- Produce deletion vectors for MOW mode.
+
+Full Compaction
+~~~~~~~~~~~~~~~
+Paimon uses Universal Compaction. By default, when there is too much incremental
+data, Full Compaction will be automatically performed. You don't usually have to
+worry about it.
+
+Paimon also provides configurations that allow for regular execution of Full
+Compaction:
+
+- ``compaction.optimization-interval``: Implying how often to perform an
+  optimization full compaction. This configuration is used to ensure the query
+  timeliness of the read-optimized system table.
+- ``compaction.total-size-threshold``: Full compaction will be constantly triggered
+  when total size is smaller than this threshold.
+- ``compaction.incremental-size-threshold``: Full compaction will be constantly
+  triggered when incremental size is bigger than this threshold.
+
+Lookup Compaction
+~~~~~~~~~~~~~~~~~
+When a primary key table is configured with ``lookup`` changelog producer or
+``first-row`` merge engine or has enabled deletion vectors for MOW mode, Paimon
+will use a radical compaction strategy to force compacting level 0 files to
+higher levels for every compaction trigger.
+
+Paimon also provides configurations to optimize the frequency of this
+compaction:
+
+- ``lookup-compact``: compact mode used for lookup compaction. Possible values:
+
+  * ``radical``: will use ``ForceUpLevel0Compaction`` strategy to radically
+    compact new files.
+  * ``gentle``: will use ``UniversalCompaction`` strategy to gently compact new
+    files.
+
+- ``lookup-compact.max-interval``: The max interval for a forced L0 lookup
+  compaction to be triggered in ``gentle`` mode. This option is only valid when
+  ``lookup-compact`` mode is ``gentle``.
+
+By configuring ``lookup-compact`` as ``gentle``, new files in L0 will not be
+compacted immediately. This may greatly reduce the overall resource usage at the
+expense of worse data freshness in certain cases.
+
+Primary Key Table Compaction Options
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Number of Sorted Runs to Pause Writing
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+When the number of sorted runs is small, Paimon writers will perform compaction
+asynchronously in separated threads, so records can be continuously written into
+the table. However, to avoid unbounded growth of sorted runs, writers will pause
+writing when the number of sorted runs hits the threshold.
+
+.. list-table::
+   :header-rows: 1
+   :widths: 30 10 10 10 40
+
+   * - Option
+     - Required
+     - Default
+     - Type
+     - Description
+   * - ``num-sorted-run.stop-trigger``
+     - No
+     - (none)
+     - Integer
+     - The number of sorted runs that trigger the stopping of writes. The
+       default value is ``num-sorted-run.compaction-trigger + 3``.
+
+Write stalls will become less frequent when ``num-sorted-run.stop-trigger``
+becomes larger, thus improving writing performance. However, if this value
+becomes too large, more memory and CPU time will be needed when querying the
+table.
+
+Number of Sorted Runs to Trigger Compaction
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+Paimon uses LSM tree which supports a large number of updates. LSM organizes
+files in several sorted runs. When querying records from an LSM tree, all sorted
+runs must be combined to produce a complete view of all records.
+
+One can easily see that too many sorted runs will result in poor query
+performance. To keep the number of sorted runs in a reasonable range, Paimon
+writers will automatically perform compactions. The following table property
+determines the minimum number of sorted runs to trigger a compaction.
+
+.. list-table::
+   :header-rows: 1
+   :widths: 30 10 10 10 40
+
+   * - Option
+     - Required
+     - Default
+     - Type
+     - Description
+   * - ``num-sorted-run.compaction-trigger``
+     - No
+     - 5
+     - Integer
+     - The sorted run number to trigger compaction. Includes level 0 files (one
+       file one sorted run) and high-level runs (one level one sorted run).
+
+Compaction will become less frequent when ``num-sorted-run.compaction-trigger``
+becomes larger, thus improving writing performance. However, if this value
+becomes too large, more memory and CPU time will be needed when querying the
+table. This is a trade-off between writing and query performance.
diff --git a/_sources/user_guide/data_types.rst.txt b/_sources/user_guide/data_types.rst.txt
new file mode 100644
index 00000000..e893d498
--- /dev/null
+++ b/_sources/user_guide/data_types.rst.txt
@@ -0,0 +1,319 @@
+.. 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.
+
+Data Types
+==========
+
+A data type describes the logical type of a value in the table ecosystem. It can
+be used to declare input and/or output types of operations.
+
+All data types by Java Paimon are as follows, Paimon C++ uses Apache Arrow as
+its schema representation. The following table shows the mapping between `Java
+Paimon DataTypes <https://paimon.apache.org/docs/master/concepts/data-types/>`_
+and `Arrow DataTypes <https://arrow.apache.org/docs/format/Columnar.html#data-types>`_:
+
+.. list-table::
+   :header-rows: 1
+   :widths: 10 10 30
+
+   * - Java Paimon DataType
+     - Arrow DataType
+     - Description
+
+   * - ``BOOLEAN``
+     - Boolean
+     - Data type of a boolean with a (possibly) three-valued logic of TRUE, FALSE, and UNKNOWN.
+
+   * - ``CHAR``
+
+       ``CHAR(n)``
+     - Utf8
+     - Data type of a fixed-length character string.
+
+       The type can be declared using ``CHAR(n)`` where n is the number of code
+       points. n must have a value between 1 and 2,147,483,647 (both inclusive).
+       If no length is specified, n is equal to 1.
+
+       **Note:** Apache Arrow has no fixed-length string type, so the declared
+       length ``n`` is not enforced; values are mapped to a variable-length ``Utf8``.
+
+   * - ``VARCHAR``
+
+       ``VARCHAR(n)``
+
+     - Utf8
+     - Data type of a variable-length character string.
+
+       The type can be declared using ``VARCHAR(n)`` where n is the maximum
+       number of code points. n must have a value between 1 and 2,147,483,647
+       (both inclusive). If no length is specified, n is equal to 1.
+
+       **Note:** The declared maximum length ``n`` is not enforced.
+
+   * - ``STRING``
+     - Utf8
+     - Data type of a variable-length character string. ``STRING`` is a synonym for ``VARCHAR(2147483647)``.
+
+   * - ``BINARY``
+
+       ``BINARY(n)``
+     - Binary
+     - Data type of a fixed-length binary string (=a sequence of bytes).
+
+       The type can be declared using ``BINARY(n)`` where n is the number of
+       bytes. n must have a value between 1 and 2,147,483,647 (both inclusive).
+       If no length is specified, n is equal to 1.
+
+       **Note:** Apache Arrow has no fixed-length binary type here, so the declared
+       length ``n`` is not enforced; values are mapped to a variable-length ``Binary``.
+
+   * - ``VARBINARY``
+
+       ``VARBINARY(n)``
+     - Binary
+     - Data type of a variable-length binary string (=a sequence of bytes).
+
+       The type can be declared using ``VARBINARY(n)`` where n is the maximum
+       number of bytes. n must have a value between 1 and 2,147,483,647
+       (both inclusive). If no length is specified, n is equal to 1.
+
+       **Note:** The declared maximum length ``n`` is not enforced.
+
+   * - ``BYTES``
+     - Binary
+     - ``BYTES`` is a synonym for ``VARBINARY(2147483647)``.
+
+   * - ``DECIMAL``
+
+       ``DECIMAL(p)``
+
+       ``DECIMAL(p, s)``
+     - Decimal128
+     - Data type of a decimal number with fixed precision and scale.
+
+       The type can be declared using ``DECIMAL(p, s)`` where p is the number of
+       digits in a number (precision) and s is the number of digits to the right
+       of the decimal point in a number (scale). p must have a value between 1
+       and 38 (both inclusive). s must have a value between 0 and p
+       (both inclusive). The default value for p is 10. The default value for s is 0.
+
+   * - ``TINYINT``
+     - Int8
+     - Data type of a 1-byte signed integer with values from -128 to 127.
+
+   * - ``SMALLINT``
+     - Int16
+     - Data type of a 2-byte signed integer with values from -32,768 to 32,767.
+
+   * - ``INT``
+     - Int32
+     - Data type of a 4-byte signed integer with values from -2,147,483,648 to 2,147,483,647.
+
+   * - ``BIGINT``
+     - Int64
+     - Data type of an 8-byte signed integer with values from -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807.
+
+   * - ``FLOAT``
+     - Float
+     - Data type of a 4-byte single precision floating point number.
+
+       Compared to the SQL standard, the type does not take parameters.
+
+   * - ``DOUBLE``
+     - Double
+     - Data type of an 8-byte double precision floating point number.
+
+   * - ``DATE``
+     - Date32
+     - Data type of a date consisting of year-month-day with values ranging from 0000-01-01 to 9999-12-31.
+
+       Compared to the SQL standard, the range starts at year 0000.
+
+   * - ``TIME``
+
+       ``TIME(p)``
+     - Not Supported
+     - Data type of a time without time zone consisting of hour:minute:second[.fractional] with up to nanosecond precision and values ranging from 00:00:00.000000000 to 23:59:59.999999999.
+
+       The type can be declared using ``TIME(p)`` where p is the number of digits of
+       fractional seconds (precision). p must have a value between 0 and 9
+       (both inclusive). If no precision is specified, p is equal to 0.
+
+   * - ``TIMESTAMP``
+
+       ``TIMESTAMP(p)``
+     - Timestamp
+     - Data type of a timestamp without time zone consisting of year-month-day hour:minute:second[.fractional] with up to nanosecond precision and values ranging from 0000-01-01 00:00:00.000000000 to 9999-12-31 23:59:59.999999999.
+
+       The type can be declared using ``TIMESTAMP(p)`` where p is the number of
+       digits of fractional seconds (precision). Paimon C++ supports precision
+       values 0 (seconds), 3 (milliseconds), 6 (microseconds), and 9
+       (nanoseconds). If no precision is specified, p is equal to 6.
+
+   * - ``TIMESTAMP WITH LOCAL TIME ZONE``
+
+       ``TIMESTAMP(p) WITH LOCAL TIME ZONE``
+     - Timestamp
+     - Data type of a timestamp with local time zone consisting of year-month-day hour:minute:second[.fractional] zone with up to nanosecond precision and values ranging from 0000-01-01 00:00:00.000000000 +14:59 to 9999-12-31 23:59:59.999999999 -14:59.
+
+       This type fills the gap between time zone free and time zone mandatory
+       timestamp types by allowing the interpretation of UTC timestamps according
+       to the configured session time zone. A conversion from and to int describes
+       the number of seconds since epoch. A conversion from and to long describes the number of milliseconds since epoch.
+
+       Paimon C++ supports precision values 0 (seconds), 3 (milliseconds), 6
+       (microseconds), and 9 (nanoseconds).
+
+   * - ``ARRAY<t>``
+     - List
+     - Data type of an array of elements with same subtype.
+
+       Compared to the SQL standard, the maximum cardinality of an array cannot be specified but is fixed at 2,147,483,647. Also, any valid type is supported as a subtype.
+
+       The type can be declared using ``ARRAY<t>`` where t is the data type of the contained elements.
+
+   * - ``VECTOR<t, n>``
+     - FixedSizeList
+     - Data type of a dense vector containing exactly ``n`` elements of type ``t``.
+
+       ``n`` must be positive. ``t`` can be ``BOOLEAN``, ``TINYINT``,
+       ``SMALLINT``, ``INT``, ``BIGINT``, ``FLOAT``, or ``DOUBLE``. A VECTOR
+       value may be NULL, but its elements cannot be NULL.
+
+       Paimon C++ supports VECTOR value columns in append-only and primary-key
+       tables backed by Parquet data files. They use the standard Parquet LIST
+       representation on disk and are restored as Arrow ``FixedSizeList``
+       values on read. Row-tracking append-only tables with data evolution also
+       support full-row and partial-column VECTOR writes, including reads across
+       schema versions that add or drop VECTOR columns. Changing a VECTOR's
+       dimension or element type is not supported. VECTOR columns cannot be
+       primary, partition, or bucket keys, nor comparator-based
+       ordering fields such as sequence and sequence-group fields. Dedicated
+       vector storage is not included yet.
+
+       Paimon C++ also reads Parquet files written by Paimon Rust or Python whose
+       embedded Arrow schema restores VECTOR columns as ``FixedSizeList``,
+       including NULL vector values.
+
+   * - ``MAP<kt, vt>``
+     - Map
+     - Data type of an associative array that maps keys (including NULL) to values (including NULL). A map cannot contain duplicate keys; each key can map to at most one value.
+
+       There is no restriction of element types; it is the responsibility of the user to ensure uniqueness.
+
+       The type can be declared using ``MAP<kt, vt>`` where kt is the data type of the key elements and vt is the data type of the value elements.
+
+       **Note:** Paimon C++ accepts nullable map key declarations for schema compatibility.
+       A query fails only if the data actually contains a NULL map key.
+
+   * - ``MULTISET<t>``
+     - Not Supported
+     - Data type of a multiset (=bag). Unlike a set, it allows for multiple instances for each of its elements with a common subtype. Each unique value (including NULL) is mapped to some multiplicity.
+
+       There is no restriction of element types; it is the responsibility of the user to ensure uniqueness.
+
+       The type can be declared using ``MULTISET<t>`` where t is the data type of the contained elements.
+
+   * - ``ROW<n0 t0, n1 t1, ...>``
+
+       ``ROW<n0 t0 'd0', n1 t1 'd1', ...>``
+     - Struct
+     - Data type of a sequence of fields.
+
+       A field consists of a field name, field type, and an optional description.
+       The most specific type of a row of a table is a row type. In this case,
+       each column of the row corresponds to the field of the row type that has
+       the same ordinal position as the column.
+
+       Compared to the SQL standard, an optional field description simplifies
+       the handling with complex structures.
+
+       A row type is similar to the ``STRUCT`` type known from other non-standard-compliant frameworks.
+
+       The type can be declared using ``ROW<n0 t0 'd0', n1 t1 'd1', ...>`` where n
+       is the unique name of a field, t is the logical type of a field, d is the description of a field.
+
+   * - ``VARIANT``
+     - Struct
+     - Data type of semi-structured data (e.g. JSON). A variant value contains one of:
+       a primitive (e.g. integer, string), an array of variant values, or an object
+       mapping string keys to variant values.
+
+       Variant values are encoded with two binaries following the parquet-format
+       `Variant Binary Encoding <https://github.com/apache/parquet-format/blob/master/VariantEncoding.md>`_
+       specification (compatible with the Java Paimon / Spark implementation). In
+       Paimon C++, a variant field is represented in an Arrow schema as
+       ``Struct{value: Binary NOT NULL, metadata: Binary NOT NULL}`` marked with
+       Paimon-specific field metadata; use ``paimon::Variant::ArrowField`` to
+       construct such a field, and ``paimon::Variant`` (``FromJson``/``ToJson``/
+       ``VariantGet``) to build and inspect values.
+
+       Only the parquet file format supports VARIANT columns. VARIANT cannot be
+       used as a primary key, partition key or bucket key, and no predicate
+       pushdown applies to it.
+
+       When writing, variant columns can optionally be *shredded* into typed
+       parquet columns per the parquet-format
+       `Variant Shredding <https://github.com/apache/parquet-format/blob/master/VariantShredding.md>`_
+       specification by setting ``variant.shreddingSchema`` to a ROW type JSON
+       whose fields map top-level variant column names to their shredding
+       types. Explicit field IDs are preserved. If every ROW field, including
+       nested fields, omits ``id``, IDs are assigned in preorder starting at 0,
+       as in Java Paimon. Partially specified IDs are rejected.
+       Alternatively, setting ``variant.inferShreddingSchema`` to
+       ``true`` infers a shredding schema per file from the first written rows
+       (tuned by ``variant.shredding.maxSchemaWidth``, which bounds the total
+       number of shredded fields across all variant columns of the schema,
+       ``variant.shredding.maxSchemaDepth``,
+       ``variant.shredding.minFieldCardinalityRatio`` and
+       ``variant.shredding.maxInferBufferRow``). Inference also covers variant
+       columns nested inside ROW columns (variants inside arrays or maps stay
+       unshredded, as in Java Paimon). Readers reassemble shredded columns
+       transparently.
+
+       When reading, instead of the full variant, specific paths can be
+       extracted by replacing the variant column in the read schema with a
+       projection built by ``paimon::VariantAccessBuilder`` (e.g. ``$.a.b`` as
+       BIGINT). For shredded files only the required typed sub-columns are
+       read.
+
+   * - ``BLOB``
+
+       ``ARRAY<BLOB>``
+     - LargeBinary
+
+       List<LargeBinary>
+     - Data type of a binary large object, such as an image or a video, stored
+       in dedicated ``.blob`` files instead of the normal data files. A BLOB
+       column listed in ``blob-descriptor-field`` or ``blob-view-field`` instead
+       keeps a serialized reference in the data file, so the referenced data
+       must remain available.
+
+       A BLOB field is a ``LargeBinary`` field marked with Paimon-specific
+       field metadata; use ``paimon::Blob::ArrowField`` to construct such a
+       field. An ``ARRAY<BLOB>`` field is a top-level ``List`` field whose
+       element field is a BLOB field, which stores an ordered collection of
+       objects (e.g. the frames of one sample) in a single blob entry. Both the
+       array and its elements may be null.
+
+       Tables with BLOB or ``ARRAY<BLOB>`` columns must enable
+       ``row-tracking.enabled`` and ``data-evolution.enabled``, and must have
+       at least one non-BLOB column. These columns cannot be partition keys.
+       ``ARRAY<BLOB>`` cannot be nested inside other types or listed in
+       ``blob-descriptor-field`` or ``blob-view-field``. Paimon C++ does not
+       support compacting these tables yet, and can read but not write
+       ``MAP<kt, BLOB>`` columns. See :doc:`write` for writing BLOB columns.
diff --git a/_sources/user_guide/format_table.rst.txt b/_sources/user_guide/format_table.rst.txt
new file mode 100644
index 00000000..0e066ad1
--- /dev/null
+++ b/_sources/user_guide/format_table.rst.txt
@@ -0,0 +1,355 @@
+.. 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.
+
+.. Ported from the Paimon documentation:
+.. https://github.com/apache/paimon/blob/master/docs/docs/concepts/rest/tables.mdx
+
+.. default-domain:: cpp
+.. highlight:: cpp
+
+Format Table
+============
+A format table is a directory that holds multiple files of the same format. It carries no
+snapshots and no manifests: the files in the directory are the table, so reading it lists
+directories and writing to it adds files. A table is a format table when its ``type`` option is
+``format-table``; ``file.format`` then names the format of every file in it, which here is
+``parquet`` or ``orc``.
+
+A partitioned format table uses the standard Hive directory layout, and its partitions are
+discovered from that layout rather than from metadata. By default a partition directory is named
+``key=value``; setting ``format-table.partition-path-only-value`` names it by the value alone.
+
+Because a directory of plain files records no row identity, a format table only accepts inserts.
+Reads still carry the leading ``_VALUE_KIND`` field every ``BatchReader`` promises, so an engine
+that reads a batch by field index sees the same layout it does for a managed table; every row of a
+format table is an insert.
+
+Reading and writing
+-------------------
+A format table is not served through :cpp:func:`Catalog::GetTable`, which describes a managed
+table; use :cpp:func:`Catalog::GetFormatTable` instead.
+
+Reading and writing go through the entry points every other table uses: ``TableScan::Create``,
+``TableRead::Create``, ``FileStoreWrite::Create`` and ``FileStoreCommit::Create``, each from its
+usual context builder. Each reads the table's schema - from under the table path, or from the one
+the context carries - and dispatches to a format table when its ``type`` says so.
+
+That path needs a schema under the table's own location, which is what every table a file system
+catalog serves has. A table loaded from a catalog that keeps the schema elsewhere, such as the
+REST catalog, has none: nothing under the location says that it is a format table, nor that
+``schema`` and ``branch`` below it are data rather than metadata. Such a table is read and written
+by handing the loaded ``FormatTable`` to the context instead of a path - every context builder has
+a constructor taking one - which is what Java does through ``FormatTable.newReadBuilder()`` and
+``newBatchWriteBuilder()``:
+
+.. code-block:: cpp
+
+   PAIMON_ASSIGN_OR_RAISE(std::shared_ptr<paimon::FormatTable> table,
+                          catalog->GetFormatTable(paimon::Identifier("db", "tbl")));
+   paimon::ScanContextBuilder scan_builder(table);
+   PAIMON_ASSIGN_OR_RAISE(std::unique_ptr<paimon::ScanContext> scan_context,
+                          scan_builder.Finish());
+   PAIMON_ASSIGN_OR_RAISE(std::unique_ptr<paimon::TableScan> scan,
+                          paimon::TableScan::Create(std::move(scan_context)));
+
+The table already carries its schema and the file system it was loaded through, so a context built
+from one refuses ``SetTableSchema()``, ``WithFileSystem()``,
+``WithFileSystemSchemeToIdentifierMap()``, ``WithCatalog()`` and a branch. Options
+given at the call still win over the ones the schema stored, as they do everywhere else.
+
+A batch comes back in the table's column order, or the projection's when the read names one,
+behind the ``_VALUE_KIND`` field every ``BatchReader`` carries. Which columns a *file* is asked for
+and in what order is its own business: they are matched to the table's by name, as Java matches
+them through ``ParquetReaderFactory`` and orc's schema evolution, so a file that stores them in
+another order is read in the order it stores them, and one holding columns the table does not name
+is read past. A column the file does not hold is filled with nulls, which is how a file written
+before a column was added is still read - unless the table declares that column ``NOT NULL``, when
+the file is refused instead, as Java's ``VectorizedParquetRecordReader`` refuses it. Only the
+columns a read actually asks a file for are held to the table's schema: a partition column is
+rebuilt from the directory name whether or not the file stores one of its own, and a column
+outside the projection is never read, which is how Java scopes the same checks.
+
+``FormatTable`` is the only format-table type in the public API. The classes behind it -
+``FormatTableScan``, ``FormatTableRead``, ``FormatTableWrite``, ``FormatTableCommit``,
+``FormatDataSplit`` and ``FormatCommitMessage`` - are implementation details under ``src`` and are
+named here only to describe what happens. A caller never needs them: a plan comes back as
+``Plan``, a split as ``Split``, and a commit message as ``CommitMessage``.
+
+A catalog that can load a format table itself overrides ``Catalog::LoadFormatTable()``, the
+protected hook :cpp:func:`Catalog::GetFormatTable` calls. The file system catalog uses it to say
+its metadata lives under the table location, and the REST catalog to take the location and the
+schema from one response instead of two that could disagree. A catalog that does not override it
+still serves format tables, by reading the location and the schema through the virtuals every
+catalog has.
+
+``TableScan::ListPartitions()`` lists the partitions a scan can see. A format table answers it by
+listing directories; every other table type returns ``NotImplemented`` for now.
+
+Not all of the generic interfaces fit. ``FileStoreCommit`` is mostly about snapshots and manifests -
+expiring them, rolling back to one, filtering by a commit identifier recorded in one - and a format
+table keeps none of that state, so those calls are refused rather than quietly doing nothing.
+``FileStoreWrite::Compact()`` is refused for the same reason, and both write and commit take batch
+writes only, since there is no snapshot to record a commit identifier or a watermark in.
+``TableScan`` takes a partition filter and a limit; a predicate or a bucket filter is refused. Java
+refuses a predicate from ``FormatTableScan.withFilter`` too, but ``FormatReadBuilder.newScan()``
+splits one first and hands the partition half to the scan, so there a predicate over partition
+columns still prunes directories. See the limits below.
+
+Options given at the call win over the ones the schema stored, as they do for every other table -
+except ``type``, which is structural and is read from the schema alone, so one read or write
+cannot decide what kind of table this is. The merged result is validated, not the schema's own
+options, so an option a format table refuses - ``metastore.partitioned-table``, a file format
+nothing here can read - is refused wherever it comes from rather than dropped in silence.
+
+A setting the format path cannot act on is refused by name rather than quietly dropped:
+
+* ``ReadContextBuilder::SetReadSchema()``. A projected read schema can rename a column, prune a
+  nested one and give it metadata of its own; a format table's projection is a list of top-level
+  names, so name the columns instead.
+* ``WithStreamingMode()`` on a scan or a write, a global index result on a scan, and a real-time
+  context on a scan, a read or a write: a format table has no snapshots, no real-time store and no
+  index.
+* ``WriteContextBuilder::WithWriteSchema()``, which names a subset of the columns to write.
+* ``WriteContextBuilder::WithWriteId()``, which prefixes a postpone-bucket writer's files so one
+  compaction reader can put them back in order; a format table has no buckets.
+* ``CommitContextBuilder::IgnoreEmptyCommit(false)``, ``UseRESTCatalogCommit(true)``,
+  ``WithTableId()``, ``WithCatalog()`` and ``AppendCommitCheckConflict(true)``. Keeping an empty
+  commit means writing a snapshot that adds no files, a rest-catalog commit sends that snapshot to
+  a catalog, a table id names the table in the request that commit sends, committing through a
+  catalog hands it a snapshot to take, and the conflict check reads the manifests of concurrent
+  commits - none of which exist here. Each is refused only when set away from its default, so an
+  ordinary commit is unaffected.
+* the ``branch`` option, whatever names it: a format table keeps no metadata to branch, and its
+  data is the files under its one location, which is where a read or a write would go whichever
+  branch was asked for. It is refused wherever it comes from - the schema, a catalog that parsed
+  ``tbl$branch_dev``, or the options of a single call - and so is ``WithBranch()`` on a context
+  built from a format table. A branch quietly ignored would be the wrong answer everywhere and a
+  destructive one for an overwrite, which would clear the data it was told not to touch. The
+  value naming the main branch is the default and is left alone.
+* A scan predicate or bucket filter, as above, and more than one partition filter: a scan descends
+  one directory layout, so it takes the values of a single partition rather than a set of them.
+
+What a data file is opened with is not one of the refusals. ``EnablePrefetch()``, the read-ahead
+cache and its ``CacheConfig``, and the ``Cache`` a read carries all apply, because a format table
+opens its files through the same component the managed table path opens its own with. What differs
+between the two paths is which files there are and how a row is put back together, not how a file
+is read.
+
+Some settings are not refused because they describe machinery the format path never reaches, and
+refusing them would refuse the defaults: ``EnableMultiThreadRowToBatch()`` on a read, a write's
+temporary directory and spill configuration, and ``WithIgnoreNumBucketCheck()`` and
+``WithIgnorePreviousFiles()`` on a write. They have no effect here: a format read hands out the
+batches parquet or orc already produced rather than assembling them from rows, a format write
+buffers in memory and never spills, and a table with no buckets has no bucket count to check and
+no previous files to read back.
+
+A write is two-phase, since a directory has no metadata to switch atomically: a file is written
+into a ``_temporary`` directory beside where it will end up, under a hidden name of its own, and
+only the commit renames it into place. That is the layout Java Paimon's
+``RenamingTwoPhaseOutputStream`` stages under. The directory and the name are both hidden, the
+convention a Hive-style directory uses for output that is not committed table data, and what a scan
+of this table skips. The ``_temporary`` directory is shared with every other writer
+of the same table and is left behind after a commit.
+
+An overwriting commit clears what it replaces before publishing anything. What it replaces is the
+static partition when one is given - the partitions below that prefix, whether or not this commit
+wrote to them - and otherwise the partitions the commit actually writes to, when
+``dynamic-partition-overwrite`` is on, its default, and the table is partitioned. With the option
+off, or for an unpartitioned table, it replaces the whole table instead, which is the condition
+Java's ``FormatTableCommit`` and a managed table commit both apply. An overwrite that replaces the
+table empties it even when it publishes no file, so a statement whose query returns nothing still
+clears what was there.
+
+A plan is in-memory only. ``FormatDataSplit`` has no serialized form - ``Split::Serialize()``
+refuses it - and neither has ``FormatCommitMessage``: a format table's plan has no cross-runtime
+encoding, so plan, read and commit within one process.
+
+A ``FormatTableWrite`` and a ``FormatTableCommit`` are each driven by one thread, but separate
+ones may fill and add to a table at once: each write stages its files under a uuid of its own, and
+each commit publishes only the files its own messages name. Two *overwriting* commits over the
+same directory race, since an overwrite clears what is committed there before publishing anything.
+A ``FormatTableScan`` may be shared, since planning leaves it as it was.
+
+``TableRead::CreateCountReader()`` is not implemented for a format table, so counting its rows
+means reading them. That is a gap here rather than something the layout forces: ``parquet`` and
+``orc`` both record a row count in their own footer.
+
+A writer starts a new file once the one it is filling reaches ``target-file-row-num`` rows or
+``target-file-size`` bytes. Both are checked between batches rather than between rows, because a
+batch is the unit this API writes in, so a file may pass either target by up to one batch. Java
+checks the row count on every row and the size every thousand rows, and its files therefore sit
+closer to the target.
+
+Aborting a write
+----------------
+``FormatTableWrite::Abort()`` removes the files the write staged. It is the one call still allowed
+after ``PrepareCommit()``, and that is what it is for: a write dropped *before* preparing clears
+its staged files from its own destructor, so only a commit that is prepared and then abandoned
+needs it.
+
+Path containment is checked on the path text, which stops a ``..`` from leaving the table but not
+a symbolic link pointing out of it - the same as Java's own local file system behaviour. A
+relative local location is resolved against the working directory first, as the local file system
+resolves one while opening a file, so a table located at ``./table`` and the absolute paths its
+own listing hands back are recognised as the same place. ``FormatTable::Location()`` still reports
+the location as it was given.
+
+``FormatTableCommit::Abort()`` does the same for the messages a commit was given. **Neither undoes
+a commit that succeeded**: once a file has been renamed into place it is no longer staged, and
+nothing here will take it back. Java's committer removes the published path as well as the staged
+one, which matters there because a commit publishes file by file with nothing watching; here a
+commit that fails part way takes back every target it tried to publish before it returns, so an
+abort is left with the staged files alone. That includes the target of the rename the commit
+failed on, which a store may have produced before failing to say so - on an object store a rename
+is a copy followed by a delete, and a request that took effect but lost its response looks like
+one that did nothing. The target is removed on the strength of it belonging to this write: its
+name carries the uuid of the write that staged it, and no two messages of one commit may name the
+same target. An overwriting commit is the exception: it has already deleted what it replaces, so
+taking the published files back too would leave neither the old rows nor the new, and they are
+kept. Java preserves them for the same reason.
+
+Both are best effort and never fail here, so a warning in the log is the only signal that a file
+could not be removed - and a published target left behind is one a scan goes on to read. Java's
+``abort`` instead collects its failures and reports them.
+
+Give ``FormatTableCommit`` only the messages this job's own writers produced. A message names a
+staged file by path, and a commit can tell that the path belongs to this table, sits in the
+partition the message declares, and is staged rather than already published - not whose staged file
+it is. A well-formed message from somewhere else is published, or discarded by ``Abort()``, like
+any other.
+
+Relationship to Java Paimon
+---------------------------
+Java serves format tables from a Hive or REST catalog, which holds the schema. This implementation
+also serves them from a file system catalog, which keeps the schema under the table directory - an
+extension Java does not have. Only for such a table are the ``schema`` and ``branch`` directories
+below the location treated as metadata rather than as data.
+
+A file system catalog keeps a table's schema in ``schema`` and its branches in ``branch`` below
+the table location, so under ``format-table.partition-path-only-value`` the first partition value
+may not be ``schema`` or ``branch``: the directory a write would use is the one holding the
+table's own metadata. Such a write is refused, as is an overwrite naming that partition - which
+would otherwise delete the schema. A table served from a REST or Hive catalog keeps its schema
+elsewhere, so there these are ordinary partition values and are read and written like any other.
+
+Under that same layout a partition value may not start with ``_`` or ``.`` either, whichever
+catalog serves the table: the value is the whole directory name, and a scan skips every hidden
+name. Java writes such a directory and then cannot read it back; here the write is refused
+instead. The one exception is the value standing for a null partition, ``partition.default-name``,
+which the scan reads at a partition level by design. Under the ``key=value`` layout the question
+does not arise, since the key in front of the value keeps the directory name visible.
+
+A few smaller differences come from this library's own conventions:
+
+* a write takes one partition per batch: the batch declares it through
+  ``RecordBatchBuilder::SetPartition()`` and every row of that batch is stored under it. Java
+  routes row by row, so one write call there may land in any number of partitions;
+* a write takes its partition from ``RecordBatchBuilder::SetPartition()`` rather than from the
+  rows. A row's own partition column is not checked against the declaration and never reads back:
+  a format table's partition columns are rebuilt from the directory name, as a managed table's are
+  from the manifest, and the managed write path takes ``RecordBatch::GetPartition()`` on the same
+  terms. The values arrive as text. They are still read into their column types and rendered back
+  out before anything is named after them - the round trip Java's writer makes when it renders a
+  partition out of the row it is writing, through the partition computer its
+  ``FileStorePathFactory`` holds. The table therefore decides the directory name and the commit
+  message, not the spelling the caller used: with ``partition.legacy-name`` on, its default, a
+  ``DATE`` partition is written as its day count whether the caller wrote ``19723`` or
+  ``2024-01-01``, and as ``YYYY-MM-DD`` when the option is off. A value that cannot be read into
+  its column type is refused. ``FormatTableCommit``'s static partition is *not* put through that
+  round trip and is used as given, which is what Java's ``FormatTableCommit.buildPartitionPath``
+  does with it too;
+* a commit message carries the partition its file belongs to, and a commit checks that it agrees
+  with the directory the file sits in. Java's message carries none and derives the partition from
+  the committer's target path, so the two cannot disagree there. A message here reaches the commit
+  through the base ``CommitMessage`` type, so the value is checked rather than trusted;
+* a projection that names the same column twice is rejected when the read is built. Java reads
+  such a column once per entry;
+* a row limit is the caller's. ``FormatTableScan`` takes one, but a format table records no row
+  counts, so only a non-positive limit prunes anything - it plans nothing at all. A positive one
+  neither drops splits nor bounds the reader ``FormatTableRead`` hands out, so the caller stops
+  calling ``NextBatch()`` once it has enough. Java wraps its reader in a ``LimitRecordReader``.
+
+Current limits
+--------------
+The layout, the option precedence and the read, write and overwrite semantics described above
+follow Java Paimon's. What this implementation covers is nonetheless a subset of what Java's
+format table does; it does not yet support:
+
+* the ``csv``, ``json``, ``text``, ``lance`` and ``mosaic`` file formats, leaving ``parquet``
+  and ``orc``.
+  The first three are line-delimited text in Java, which shares one line-reading layer between
+  them; this library has no text file format at all, so the first of them to be added has to bring
+  that layer with it. ``lance`` and ``mosaic`` each have their own reader and writer, built under
+  ``PAIMON_ENABLE_LANCE`` and ``PAIMON_ENABLE_MOSAIC`` respectively, but a format table does not
+  reach them yet;
+* cutting one large data file into byte ranges so that several readers share it. Java does this
+  for an uncompressed ``csv`` or ``json`` file written with the default line delimiter, and for no
+  other format - not for ``text`` or ``mosaic`` either; ``parquet`` and ``orc`` each record where
+  their own row groups and stripes begin, and a reader handed a byte range of one would have to
+  find that out for itself;
+* ``metastore.partitioned-table``, which moves partition visibility into the catalog, and the
+  Hive partition sync that goes with it;
+* partition filters beyond equality on partition values, where Java accepts a full predicate. The
+  values are compared through their column type, as Java's are, but discovery here lists one
+  directory level at a time and tests each name's value, while Java turns a leading run of
+  equality constraints into a path and starts listing below it; a table with many partitions
+  therefore costs more listings here than in Java;
+* ``scan.ignore-corrupt-files`` and ``scan.ignore-lost-files``, which are not implemented: a
+  corrupt or missing data file fails the read rather than being skipped;
+* reading a column whose type in the file is not the type the table declares. A column is matched
+  by name and then read as the table declares it, so a file storing it as some other type fails
+  the read rather than being converted to that type. Java's orc reader converts a few such pairs,
+  through orc's own schema evolution. The same goes for a ``STRUCT`` whose children the file
+  orders differently, which the read refuses rather than putting back in the table's order. A
+  ``TIMESTAMP`` of another unit is the one difference the read carries, and how far depends on
+  the format: an orc file records no unit at all - a value is a seconds-plus-nanoseconds pair,
+  built at whatever precision the read asks for - so any unit is read as the table declares it,
+  while a parquet file records the unit its values are in and only ``MILLI`` under a ``SECOND``
+  column is rescaled, the pair parquet's own round trip needs, every other being refused rather
+  than relabelled;
+* ``FileStoreCommit::TruncateTable()``, which Java implements for a format table by deleting its
+  data files while leaving the partition directories in place, and
+  ``FileStoreCommit::DropPartition()``, which would remove a partition directory outright. An
+  overwrite of a partition with no messages empties it but leaves the directory, which is what
+  Java's ``truncatePartitions()`` does rather than a drop;
+* ``format-table.commit-hive-sync-url``, which registers committed partitions with a Hive
+  metastore;
+* column default values. Java replaces a null in a column whose schema field declares a default
+  with that default as it writes; here the null is written as it came;
+* a table every one of whose columns is a partition column. Java projects the partition columns
+  out of what it writes, leaving files that carry nothing but a row count; here such a schema is
+  refused when the table is created and when it is opened;
+* ``TIMESTAMP``, ``DECIMAL``, ``FLOAT`` and ``DOUBLE`` partition columns, which Java allows. This
+  is a restriction of the whole library rather than of format tables. The types that do work are
+  ``BOOLEAN``, ``TINYINT``, ``SMALLINT``, ``INT``, ``BIGINT``, ``STRING`` and ``DATE`` - the set
+  the managed table path reads and writes partitions in. Any other, ``BINARY`` among them, is
+  refused when the table is created and when it is opened, rather than at the first read or write:
+  validation asks by building the partition computer that does the round trip, so there is one
+  answer rather than a list of types that could fall out of step with it.
+
+``data-file.path-directory`` has no effect here, and none in Java either: Java's format table
+writer builds its paths from the table root rather than from that directory.
+``format-table.implementation`` is honoured by the engines rather than by the table - in Java
+Spark it selects between Paimon's own implementation and the engine's ``FileTable`` - so it has
+no meaning inside this library.
+
+Validation
+----------
+A table Java can serve and this library cannot is refused at creation rather than accepted and
+then found unopenable, whichever catalog it is created through. It can still reach a catalog
+another way - written by Java, or by an older client - so the same checks run again when the
+table is opened.
diff --git a/_sources/user_guide/global_index.rst.txt b/_sources/user_guide/global_index.rst.txt
new file mode 100644
index 00000000..0cb853a0
--- /dev/null
+++ b/_sources/user_guide/global_index.rst.txt
@@ -0,0 +1,108 @@
+.. 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.
+
+Global Index
+============
+
+Global Index is a powerful indexing mechanism for append-only tables.
+It enables efficient row-level lookups and filtering without full-table scans.
+Paimon C++ supports the following global index types:
+
+- **BTree Index**: An efficient index based on multi-level SST files for scalar column lookups.
+- **Range Bitmap Index**: A range bitmap index optimized for range predicates on ordered scalar columns. Extends the bitmap approach by encoding value ordering, enabling efficient less-than, greater-than, and range conditions.
+- **Lucene Index**: A full-text search index powered by Lucene++. Supports tokenized text search with multiple modes including match-all, match-any, phrase, prefix, and wildcard queries.
+- **Tantivy Full-Text Index (experimental)**: A Rust FFI-based full-text search index.
+- **Vector Index (Lumina)**: An approximate nearest neighbor (ANN) index powered by Lumina for vector similarity search with configurable distance metrics.
+
+Global indexes work on top of Data Evolution tables. To use global indexes, your table must have:
+
+- ``'bucket' = '-1'`` (unaware-bucket mode)
+- ``'row-tracking.enabled' = 'true'``
+- ``'data-evolution.enabled' = 'true'``
+
+Bitmap Index Compatibility
+--------------------------
+
+The current Paimon C++ version does not support bitmap global indexes.
+
+BTree Index
+-----------
+
+BTree is an efficient index based on multi-level SST files, supporting rich predicate pushdown, block cache, file-level min/max key pruning, lazy loading, and block compression.
+
+**Special Configuration:**
+
+- **Option**: ``btree-index.read-buffer-size``
+
+  - **Description**: Optional. Specifies the read buffer size for the B-tree index. This setting can be tuned based on query patterns:
+
+    - For **range queries** (e.g., ``VisitLessThan``, ``VisitGreaterOrEqual``), increasing the buffer size (e.g., to 1MB) may improve I/O bandwidth and sequential read performance.
+    - For **point queries** (e.g., ``VisitEqual``), buffering can introduce negative effects due to read amplification; it is recommended to leave this option unset.
+
+Range Bitmap Index
+------------------
+
+A range bitmap index optimized for range predicates on ordered scalar columns. It extends the
+bitmap approach by encoding value ordering information, enabling efficient evaluation of
+less-than, greater-than, and range conditions without scanning all bitmaps.
+
+
+Lucene Index
+------------
+
+A full-text search index powered by Lucene++. It supports tokenized text search with multiple
+search modes including match-all, match-any, phrase, prefix, and wildcard queries.
+
+**Supported search types:**
+
+- ``MATCH_ALL``: All terms in the query must be present (AND semantics).
+- ``MATCH_ANY``: Any term in the query can match (OR semantics).
+- ``PHRASE``: Matches the exact sequence of words (with proximity).
+- ``PREFIX``: Matches terms starting with the given string (e.g., "run*" → running, runner). The
+  query is not tokenized. The original prefix is retained, and a pure ASCII alphanumeric prefix
+  is also matched using the lowercase case-normalization applied to pure ASCII terms at indexing
+  time. This preserves matches for mixed terms such as ``B超`` while allowing ``THIS`` to match
+  terms indexed as ``this...``.
+- ``WILDCARD``: Supports wildcards ``*`` and ``?`` (e.g., "ap*e", "app?e" → "apple"). The query
+  is not tokenized, and wildcard operators are preserved. Both the original pattern and an
+  alternative with each ASCII alphanumeric fragment lowercased are matched, covering pure ASCII
+  and mixed ASCII/non-ASCII terms.
+
+**Special Configuration:**
+
+- **Option**: ``lucene-fts.write.tmp.directory``
+
+  - **Description**: Specifies the temporary directory used during Lucene index writing. No default value; must be explicitly set.
+
+- **Environment Variable**: ``PAIMON_JIEBA_DICT_DIR``
+
+  - **Description**: Specifies the directory containing Jieba dictionary files for Chinese text tokenization. At runtime, the system first checks this environment variable; if not set, it falls back to the compile-time ``JIEBA_TEST_DICT_DIR`` macro (only available in test builds). If neither is available, will fail with an error.
+
+Tantivy Full-Text Index (Experimental)
+---------------------------------------
+
+The Tantivy full-text index is an experimental Rust FFI-based backend. Enable it at build time
+with ``-DPAIMON_ENABLE_TANTIVY=ON``. Its global index identifier is ``tantivy-fulltext``.
+Because this backend is experimental, validate its behavior and compatibility for your workload
+before production use.
+
+Vector Index (Lumina)
+---------------------
+
+An approximate nearest neighbor (ANN) index powered by Lumina for vector similarity search.
+It supports high-dimensional vector search with configurable distance metrics and encoding strategies.
+For more configurations, refer to the ``docs/reference`` directory in the Lumina release package.
diff --git a/_sources/user_guide/manifest.rst.txt b/_sources/user_guide/manifest.rst.txt
new file mode 100644
index 00000000..4c1240da
--- /dev/null
+++ b/_sources/user_guide/manifest.rst.txt
@@ -0,0 +1,132 @@
+.. 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.
+
+.. Ported from the Paimon documentation:
+.. https://github.com/apache/paimon/blob/master/docs/content/concepts/spec/manifest.md
+
+Manifest
+========
+
+Manifest List
+-------------
+
+.. code-block:: shell
+
+   ├── manifest
+       └── manifest-list-51c16f7b-421c-4bc0-80a0-17677f343358-1
+
+Manifest List includes metadata of several manifest files. Its name contains a UUID. It is an Avro file with the following schema:
+
+1. ``_FILE_NAME``: STRING — manifest file name.
+2. ``_FILE_SIZE``: BIGINT — manifest file size.
+3. ``_NUM_ADDED_FILES``: BIGINT — number of added files in the manifest.
+4. ``_NUM_DELETED_FILES``: BIGINT — number of deleted files in the manifest.
+5. ``_PARTITION_STATS``: SimpleStats — partition stats. The minimum and maximum values of partition fields in this manifest are beneficial for skipping certain manifest files during queries.
+6. ``_SCHEMA_ID``: BIGINT — schema id used when writing this manifest file.
+
+Manifest
+--------
+
+Manifest includes metadata of several data files, changelog files, or table-index files. Its name contains a UUID, and it is an Avro file.
+
+The changes of the file are saved in the manifest, and a file can be added or deleted. Manifests should be in an orderly manner, and the same file may be added or deleted multiple times. The last version should be read. This design makes commit lighter to support file deletion generated by compaction.
+
+Data Manifest
+-------------
+
+Data Manifest includes metadata of several data files or changelog files.
+
+.. code-block:: shell
+
+   ├── manifest
+       └── manifest-6758823b-2010-4d06-aef0-3b1b597723d6-0
+
+Schema:
+
+1. ``_KIND``: TINYINT — ``ADD`` or ``DELETE``.
+2. ``_PARTITION``: BYTES — partition spec, a BinaryRow.
+3. ``_BUCKET``: INT — bucket of this file.
+4. ``_TOTAL_BUCKETS``: INT — total buckets when writing this file; used for verification after bucket changes.
+5. ``_FILE``: data file metadata.
+
+Data file metadata:
+
+1. ``_FILE_NAME``: STRING — file name.
+2. ``_FILE_SIZE``: BIGINT — file size.
+3. ``_ROW_COUNT``: BIGINT — total number of rows (including add & delete) in this file.
+4. ``_MIN_KEY``: STRING — minimum key of this file.
+5. ``_MAX_KEY``: STRING — maximum key of this file.
+6. ``_KEY_STATS``: SimpleStats — statistics of the key.
+7. ``_VALUE_STATS``: SimpleStats — statistics of the value.
+8. ``_MIN_SEQUENCE_NUMBER``: BIGINT — minimum sequence number.
+9. ``_MAX_SEQUENCE_NUMBER``: BIGINT — maximum sequence number.
+10. ``_SCHEMA_ID``: BIGINT — schema id when writing this file.
+11. ``_LEVEL``: INT — level of this file in LSM.
+12. ``_EXTRA_FILES``: ARRAY<STRING> — extra files for this file (e.g., data file index file).
+13. ``_CREATION_TIME``: TIMESTAMP_MILLIS — creation time of this file.
+14. ``_DELETE_ROW_COUNT``: BIGINT — rowCount = addRowCount + deleteRowCount.
+15. ``_EMBEDDED_FILE_INDEX``: BYTES — if the data file index is small, store the index in the manifest.
+16. ``_FILE_SOURCE``: TINYINT — indicates whether this file is generated as an ``APPEND`` or ``COMPACT`` file.
+17. ``_VALUE_STATS_COLS``: ARRAY<STRING> — statistical columns in metadata.
+18. ``_EXTERNAL_PATH``: STRING — external path of this file; ``null`` if it is in the warehouse.
+
+Index Manifest
+--------------
+
+Index Manifest includes metadata of several table-index files.
+
+.. code-block:: shell
+
+   ├── manifest
+       └── index-manifest-5d670043-da25-4265-9a26-e31affc98039-0
+
+Schema:
+
+1. ``_KIND``: TINYINT — ``ADD`` or ``DELETE``.
+2. ``_PARTITION``: BYTES — partition spec, a BinaryRow.
+3. ``_BUCKET``: INT — bucket of this file.
+4. ``_INDEX_TYPE``: STRING — ``HASH`` or ``DELETION_VECTORS``.
+5. ``_FILE_NAME``: STRING — file name.
+6. ``_FILE_SIZE``: BIGINT — file size.
+7. ``_ROW_COUNT``: BIGINT — total number of rows.
+8. ``_DELETIONS_VECTORS_RANGES``: Metadata only used by ``DELETION_VECTORS``; an array of deletion vector metadata. Each deletion vector metadata has:
+   - ``f0``: the data file name corresponding to this deletion vector.
+   - ``f1``: the starting offset of this deletion vector in the index file.
+   - ``f2``: the length of this deletion vector in the index file.
+   - ``_CARDINALITY``: the number of deleted rows.
+
+Appendix
+--------
+
+SimpleStats
+~~~~~~~~~~~
+
+SimpleStats is a nested row with the following schema:
+
+1. ``_MIN_VALUES``: BYTES — BinaryRow; the minimum values of the columns.
+2. ``_MAX_VALUES``: BYTES — BinaryRow; the maximum values of the columns.
+3. ``_NULL_COUNTS``: ARRAY<BIGINT> — the number of nulls in the columns.
+
+BinaryRow
+~~~~~~~~~
+
+BinaryRow is backed by bytes instead of ``Object``. It can significantly reduce the serialization/deserialization of Java objects.
+
+A row has two parts: fixed-length part and variable-length part.
+
+- Fixed-length part contains a 1-byte header, null bit set, and field values. The null bit set is used for null tracking and is aligned to 8-byte word boundaries.
+- Field values hold fixed-length primitive types and variable-length values that can be stored in 8 bytes. If the variable-length field does not fit in 8 bytes, then the fixed-length part stores the length and the offset of the variable-length part.
diff --git a/_sources/user_guide/manifest_cache.rst.txt b/_sources/user_guide/manifest_cache.rst.txt
new file mode 100644
index 00000000..e1c095a7
--- /dev/null
+++ b/_sources/user_guide/manifest_cache.rst.txt
@@ -0,0 +1,96 @@
+.. 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.
+
+Manifest Cache
+==============
+
+Overview
+--------
+
+Paimon C++ caches raw manifest file bytes at the ``ObjectsFile<T>::Read()``
+layer. The cache uses the public ``Cache`` abstraction and is enabled through
+``ScanContextBuilder::WithCache()``. The cache covers data manifests, manifest
+lists, and index manifests because they all read through ``ObjectsFile<T>``.
+
+For repeated ``get``, ``scan``, or batch ``get/scan -f`` requests in the same
+process, the same snapshot often reads the same manifest files repeatedly. On a
+cache hit, the read path skips remote filesystem ``open/read``, builds an
+in-memory input stream from cached bytes, and still runs the format reader,
+Arrow decoding, and object deserialization. This design primarily reduces
+remote IO latency and bandwidth while keeping cache weight aligned with the
+actual cached bytes.
+
+Configuration
+-------------
+
+Manifest caching is disabled by default. Embedding applications that need it can
+provide a custom ``Cache`` implementation and inject it through ``WithCache``.
+Manifest reads create cache keys with ``CacheKind::MANIFEST`` internally, so
+callers do not need to pass the cache kind through scan or read contexts. The
+same cache instance can be reused across multiple scan or read contexts when
+process-local sharing is desired.
+
+Example:
+
+.. code-block:: cpp
+
+   class RoutingCache : public paimon::Cache {
+    public:
+     RoutingCache(std::shared_ptr<paimon::Cache> default_cache,
+                  std::shared_ptr<paimon::Cache> manifest_cache)
+         : default_cache_(std::move(default_cache)),
+           manifest_cache_(std::move(manifest_cache)) {}
+
+     paimon::Result<std::shared_ptr<paimon::CacheValue>> Get(
+         const std::shared_ptr<paimon::CacheKey>& key,
+         std::function<paimon::Result<std::shared_ptr<paimon::CacheValue>>(
+             const std::shared_ptr<paimon::CacheKey>&)> supplier) override {
+       return Select(key)->Get(key, std::move(supplier));
+     }
+
+     // Put(), Invalidate(), InvalidateAll(), and Size() route in the same way.
+
+    private:
+     std::shared_ptr<paimon::Cache> Select(
+         const std::shared_ptr<paimon::CacheKey>& key) const {
+       return key && key->GetKind() == paimon::CacheKind::MANIFEST
+                  ? manifest_cache_
+                  : default_cache_;
+     }
+
+     std::shared_ptr<paimon::Cache> default_cache_;
+     std::shared_ptr<paimon::Cache> manifest_cache_;
+   };
+
+   auto cache = std::make_shared<RoutingCache>(
+       std::make_shared<MyDefaultCache>(),
+       std::make_shared<MyManifestCache>());
+
+   paimon::ScanContextBuilder scan_builder(table_path);
+   scan_builder.WithCache(cache);
+
+Passing ``nullptr`` or omitting ``ScanContextBuilder::WithCache()`` leaves
+manifest caching disabled.
+
+Future Optimizations
+--------------------
+
+- Add hit, miss, bypass, and eviction metrics to read trace or metrics.
+- Add single-flight loading for high-concurrency misses on the same manifest
+  path.
+- Evaluate a decoded-records second-level cache, configurable as a
+  CPU-vs-memory tradeoff.
diff --git a/_sources/user_guide/manifest_entry_cache.rst.txt b/_sources/user_guide/manifest_entry_cache.rst.txt
new file mode 100644
index 00000000..97b33cde
--- /dev/null
+++ b/_sources/user_guide/manifest_entry_cache.rst.txt
@@ -0,0 +1,91 @@
+.. 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.
+
+Manifest Entry Cache
+====================
+
+Overview
+--------
+
+Large tables may contain many manifest entries, while a scan may only need a
+small subset after bucket, partition, and statistics pruning. The snapshot live
+manifest entry cache reduces repeated manifest decoding cost for successive full
+scans that target the same bucket.
+
+The cache stores decoded and merged live manifest entries by table path, branch,
+and bucket for ``ScanMode::ALL``. Each cache value can retain several snapshot
+results for that bucket. Exact snapshot hits are served from the cache; cache
+misses rebuild the target snapshot bucket from the target snapshot's data
+manifests and store the rebuilt live entries.
+
+Request-specific filters are not stored in the cache. Partition, level, and
+predicate filters are still evaluated for each scan, so cached entries can be
+reused safely across different scan predicates for the same bucket.
+
+Configuration
+-------------
+
+Manifest entry caching reuses the cache instance provided by
+``ScanContextBuilder::WithCache()`` and stores bucket-scoped snapshot entries
+under
+``CacheKind::SNAPSHOT_LIVE_MANIFEST``:
+
+.. code-block:: cpp
+
+   auto cache = std::make_shared<LruCache>(128 * 1024 * 1024);
+   ScanContextBuilder context_builder(table_path);
+   PAIMON_ASSIGN_OR_RAISE(
+       std::unique_ptr<ScanContext> scan_context,
+       context_builder
+           .WithCache(cache)
+           .AddOption(Options::SCAN_MANIFEST_ENTRY_CACHE_MAX_SNAPSHOTS, "3")
+           .Finish());
+
+Cache entries are scoped by table path, branch, and bucket, so they can be
+reused across newly created ``TableScan`` and ``FileStoreScan`` instances as
+long as they share the same cache object and scan the same bucket.
+
+``Options::SCAN_MANIFEST_ENTRY_CACHE_MAX_SNAPSHOTS`` controls how many snapshot
+results are retained in each table/branch/bucket cache value. Older snapshots in
+the same bucket are evicted first. The default value is ``0``, which disables
+the cache path. Set it to a positive value to enable the cache when
+``ScanContextBuilder::WithCache()`` is also configured. Physical cache eviction
+is still controlled by the configured ``Cache`` implementation, for example the
+capacity of ``LruCache``.
+
+If no cache is provided through ``ScanContextBuilder::WithCache()``, this
+optimization is skipped. The snapshot manifest entry cache shares the same
+``Cache`` interface with raw manifest and data-file footer caches, but it uses a
+dedicated ``CacheKind`` and a table/branch/bucket key instead of file byte
+ranges.
+
+Limitations
+-----------
+
+The cache is currently used only for ``ScanMode::ALL`` scans that can determine
+a single target bucket. It is skipped for scans without a bucket filter because
+reading or deserializing all buckets would be too expensive for selective
+queries. It is also skipped for row-range scans because row-range pruning is
+applied at manifest-meta level.
+
+Metrics
+-------
+
+The scan metrics expose existing counters for the last scan:
+
+- ``lastScannedManifests``: how many manifest files were loaded during this
+  scan before manifest entry decoding.
diff --git a/_sources/user_guide/metrics.rst.txt b/_sources/user_guide/metrics.rst.txt
new file mode 100644
index 00000000..72ee2a17
--- /dev/null
+++ b/_sources/user_guide/metrics.rst.txt
@@ -0,0 +1,116 @@
+.. 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.
+
+Metrics reference
+=================
+
+``Metrics`` contains counters, gauges, and histogram snapshots. A counter is a non-negative
+integer, a gauge represents current state, and a histogram records a distribution of observed
+values. The scan and prefetch-reader metrics described below are returned as point-in-time
+snapshots. Modifying a returned snapshot does not modify the component that produced it.
+
+Scan planning
+-------------
+
+The names below are declared by ``ScanMetrics``. ``last*`` counters are replaced after each
+successful ``CreatePlan()`` call. Histograms and the cache hit/miss counters accumulate for the
+lifetime of the scan. They are unrelated to ``SetReadSchema()`` and ``ReadAheadCache::Reset()``.
+The first six names match Java ``ScanMetrics``; the remaining names are C++-only.
+
+.. csv-table::
+   :header: "Name", "Type", "Unit", "Meaning"
+   :widths: 34, 12, 12, 52
+
+   "lastScanDuration", "counter", "milliseconds", "Duration of the last successful plan"
+   "scanDuration", "histogram", "milliseconds", "Distribution of successful plan durations"
+   "lastScannedSnapshotId", "counter", "snapshot ID", "Snapshot used by the last plan, or 0"
+   "lastScannedManifests", "counter", "files", "Manifest files selected by the last plan"
+   "lastScanSkippedTableFiles", "counter", "files", "Table files skipped by the last plan"
+   "lastScanResultedTableFiles", "counter", "files", "Table files returned by the last plan"
+   "lastManifestReadDuration", "counter", "milliseconds", "Manifest-list and entry read time for the last plan"
+   "manifestReadDuration", "histogram", "milliseconds", "Distribution of manifest read times"
+   "lastSnapshotCacheEnabled", "counter", "boolean", "Whether snapshot manifest-entry cache was eligible"
+   "lastSnapshotCacheHit", "counter", "boolean", "Whether the last eligible lookup hit"
+   "snapshotCacheHits", "counter", "lookups", "Cumulative exact-snapshot cache hits"
+   "snapshotCacheMisses", "counter", "lookups", "Cumulative eligible cache misses"
+   "lastSnapshotCacheLoadDuration", "counter", "milliseconds", "Cache load time for the last plan"
+   "snapshotCacheLoadDuration", "histogram", "milliseconds", "Distribution of cache load times"
+   "lastSnapshotCacheStoreDuration", "counter", "milliseconds", "Cache store time for the last plan; 0 when not stored"
+   "snapshotCacheStoreDuration", "histogram", "milliseconds", "Distribution of cache store times"
+   "lastLazyDecodeScannedRows", "counter", "manifest rows", "Candidate manifest rows inspected by the last plan"
+   "lastLazyDecodeMaterializedRows", "counter", "manifest rows", "Manifest rows retained after lazy filtering"
+
+Prefetch reader
+---------------
+
+The names below are declared by ``PrefetchMetrics``. Counters and histograms accumulate for the
+lifetime of the prefetch reader, including across ``SetReadSchema()``. ``enabled`` and
+``parallelism`` describe the most recently initialized schema. ``queue-depth`` is reset by
+``SetReadSchema()`` and ``Close()``; ``queue-depth.max`` remains the lifetime maximum.
+These metrics are C++-only and have no counterparts in Java Paimon.
+
+.. csv-table::
+   :header: "Name", "Type", "Unit", "Meaning"
+   :widths: 38, 12, 12, 48
+
+   "prefetch.enabled", "gauge", "boolean", "Whether the most recently initialized schema selected prefetch"
+   "prefetch.parallelism", "gauge", "readers", "Effective reader parallelism"
+   "prefetch.read-ranges.total", "counter", "ranges", "Generated ranges before bitmap filtering"
+   "prefetch.read-ranges.after-bitmap", "counter", "ranges", "Ranges retained after bitmap filtering"
+   "prefetch.seek.count", "counter", "operations", "Underlying reader seek operations"
+   "prefetch.produced-batches", "counter", "batches", "Data batches placed into prefetch queues"
+   "prefetch.consumed-batches", "counter", "batches", "Data batches returned to the consumer"
+   "prefetch.discarded-batches", "counter", "batches", "Data batches released without consumption, plus EOF entries released during cleanup"
+   "prefetch.errors", "counter", "errors", "Errors recorded by the background prefetch loop"
+   "prefetch.adaptive-disabled-count", "counter", "decisions", "Times adaptive strategy disabled prefetch"
+   "prefetch.queue-full-count", "counter", "events", "Times production found a full queue"
+   "prefetch.queue-depth", "gauge", "queue entries", "Current queued entries, including retained EOF markers"
+   "prefetch.queue-depth.max", "gauge", "queue entries", "Maximum queued entries in the reader lifetime"
+   "prefetch.reader-read-latency-us", "histogram", "microseconds", "Underlying reader batch latency"
+   "prefetch.consumer-wait-latency-us", "histogram", "microseconds", "Consumer wait latency per returned batch or EOF"
+
+Prefetch I/O
+------------
+
+``PrefetchIoMetrics`` describes only I/O that passes through the prefetch reader's instrumented
+input streams. It is not a whole-query or whole-table I/O total. All counters accumulate for the
+reader lifetime and are retained across ``SetReadSchema()`` and cache reset. Latency uses relaxed
+atomic count and sum counters instead of per-I/O histograms to reduce hot-path cost. Collection is
+disabled by default; set ``prefetch.io-metrics.enabled`` to ``true`` in the read options to enable
+it. When disabled, these per-I/O metrics are absent and the input streams have no metrics
+instrumentation.
+``io.async.pending`` is current state and returns to zero when all callbacks complete.
+These metrics are C++-only and have no counterparts in Java Paimon.
+
+.. csv-table::
+   :header: "Name", "Type", "Unit", "Meaning"
+   :widths: 34, 12, 12, 52
+
+   "io.read.requests", "counter", "requests", "Synchronous read requests"
+   "io.read.requested-bytes", "counter", "bytes", "Bytes requested by synchronous reads"
+   "io.read.physical-bytes", "counter", "bytes", "Bytes returned by successful synchronous reads"
+   "io.read.failed", "counter", "requests", "Failed synchronous reads"
+   "io.read.latency.count", "counter", "requests", "Completed synchronous read latency samples"
+   "io.read.latency.sum-us", "counter", "microseconds", "Sum of synchronous read latency"
+   "io.async.requests", "counter", "requests", "Asynchronous read requests"
+   "io.async.requested-bytes", "counter", "bytes", "Bytes requested by asynchronous reads"
+   "io.async.physical-bytes", "counter", "bytes", "Bytes attributed to successful asynchronous reads"
+   "io.async.completed", "counter", "requests", "Successful asynchronous reads"
+   "io.async.failed", "counter", "requests", "Failed asynchronous reads"
+   "io.async.pending", "gauge", "requests", "Asynchronous callbacks not yet completed"
+   "io.async.latency.count", "counter", "requests", "Completed asynchronous callback latency samples"
+   "io.async.latency.sum-us", "counter", "microseconds", "Sum of asynchronous callback latency"
diff --git a/_sources/user_guide/parquet_metadata_cache.rst.txt b/_sources/user_guide/parquet_metadata_cache.rst.txt
new file mode 100644
index 00000000..514f1b64
--- /dev/null
+++ b/_sources/user_guide/parquet_metadata_cache.rst.txt
@@ -0,0 +1,143 @@
+.. 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.
+
+Parquet Metadata Cache
+======================
+
+Overview
+--------
+
+Paimon C++ can cache serialized Parquet metadata footer bytes for Parquet data files.
+The cache is used by ``ParquetReaderBuilder`` before opening the Arrow Parquet
+reader. On a cache miss, Paimon C++ loads the Parquet file metadata, serializes
+it as a complete metadata footer, and stores those bytes in the public
+``Cache`` abstraction. On a cache hit, Paimon C++ parses the cached footer bytes into
+``parquet::FileMetaData`` and passes the metadata to the Parquet reader.
+
+The cache stores serialized metadata footer bytes instead of caching a
+``parquet::FileMetaData`` instance. This keeps the cache value compact and
+similar to manifest cache values: the cache weight follows the actual cached
+bytes, while the Parquet library still owns metadata parsing and validation.
+
+This optimization is useful when the same Parquet files are opened repeatedly
+in the same process, for example repeated ``get`` or ``scan`` requests over the
+same snapshot. On a cache hit, the read path avoids reading the Parquet footer
+bytes from the filesystem again. Paimon C++ still parses the cached footer bytes
+into ``parquet::FileMetaData`` for each reader open. ColumnIndex and OffsetIndex
+bytes also use ``CacheKind::DATA_FILE_FOOTER`` with their actual positions and
+lengths. Data pages and column chunks are not stored in this metadata cache.
+
+Configuration
+-------------
+
+Parquet metadata caching is disabled by default. Embedding applications that
+need it can provide a custom ``Cache`` implementation and inject it through
+``ScanContextBuilder`` or ``ReadContextBuilder``. Parquet reader builders
+receive the cache from the read context and create cache keys with
+``CacheKind::DATA_FILE_FOOTER`` internally.
+
+The cache key represents the file footer and is created from the file URI with
+position ``-1`` and length ``-1``. Callers do not need to construct this key
+directly; they only need to route ``CacheKind::DATA_FILE_FOOTER`` entries to an
+appropriate cache backend.
+
+Example:
+
+.. code-block:: cpp
+
+   class RoutingCache : public paimon::Cache {
+    public:
+     RoutingCache(std::shared_ptr<paimon::Cache> default_cache,
+                  std::shared_ptr<paimon::Cache> parquet_metadata_cache)
+         : default_cache_(std::move(default_cache)),
+           parquet_metadata_cache_(std::move(parquet_metadata_cache)) {}
+
+     paimon::Result<std::shared_ptr<paimon::CacheValue>> Get(
+         const std::shared_ptr<paimon::CacheKey>& key,
+         std::function<paimon::Result<std::shared_ptr<paimon::CacheValue>>(
+             const std::shared_ptr<paimon::CacheKey>&)> supplier) override {
+       return Select(key)->Get(key, std::move(supplier));
+     }
+
+     // Put(), Invalidate(), InvalidateAll(), and Size() route in the same way.
+
+    private:
+     std::shared_ptr<paimon::Cache> Select(
+         const std::shared_ptr<paimon::CacheKey>& key) const {
+       return key && key->GetKind() == paimon::CacheKind::DATA_FILE_FOOTER
+                  ? parquet_metadata_cache_
+                  : default_cache_;
+     }
+
+     std::shared_ptr<paimon::Cache> default_cache_;
+     std::shared_ptr<paimon::Cache> parquet_metadata_cache_;
+   };
+
+   auto cache = std::make_shared<RoutingCache>(
+       std::make_shared<MyDefaultCache>(),
+       std::make_shared<MyParquetMetadataCache>());
+
+   paimon::ScanContextBuilder scan_builder(table_path);
+   scan_builder.WithCache(cache);
+
+   paimon::ReadContextBuilder read_builder(table_path);
+   read_builder.WithCache(cache);
+
+Passing ``nullptr`` or omitting ``WithCache()`` leaves Parquet metadata caching
+disabled. If a file URI cannot be obtained, Paimon C++ also bypasses the cache
+and opens the Parquet file normally.
+
+Reader-Local Page Indexes
+-------------------------
+
+Set ``parquet.read.enable-offset-index-cache=true`` to reuse parsed OffsetIndex
+objects during bitmap trimming, page-range planning and filtered decoding within
+one file reader. The option defaults to ``false``; it does not require
+``WithCache()``. Enable it only after measuring the CPU/memory trade-off for the
+workload, especially when projecting many columns.
+
+These objects are not stored in the caller's shared ``Cache``. They are released
+with their owning row-group index reader; the existing limit of 1,024 retained
+row-group readers is a count limit, not a parsed-index byte budget. Restricted
+predicate index readers remain separate so their column hints do not restrict
+later projected-column reads.
+
+Parsed page locations require approximately
+``retained row groups x accessed columns x pages per column x sizeof(PageLocation)``
+bytes, plus vector/map/object overhead, in addition to serialized index buffers.
+For example, with a 24-byte ``PageLocation``, 1,024 retained row groups, 10 accessed
+columns and 1,000 pages per column require about 234 MiB for page locations alone.
+There is no fixed byte upper bound; memory scales with the file's index sizes.
+
+This is independent of ``ReadAheadCache`` and its per-file ``FileBlockCache``,
+which reuse bytes rather than parsed objects. That block cache survives resets
+of the prefetch plan, but does not provide reuse across independent file-cache
+lifetimes. This optimization introduces no data-cache option or shared data cache.
+
+Filesystem or read-ahead byte caching does not replace this optimization: Arrow
+deserializes the cached index bytes again on every ``GetOffsetIndex`` call.
+With the option disabled, Paimon retains the existing byte-buffer reuse without
+retaining parsed OffsetIndex objects.
+
+Future Optimizations
+--------------------
+
+- Add hit, miss, bypass, and eviction metrics for Parquet metadata cache.
+- Add single-flight loading for high-concurrency misses on the same Parquet
+  file.
+- Evaluate sharing cached metadata footer bytes with page-index prefetch logic when
+  those read paths can use the same cache abstraction.
diff --git a/_sources/user_guide/prefetch.rst.txt b/_sources/user_guide/prefetch.rst.txt
new file mode 100644
index 00000000..4e601219
--- /dev/null
+++ b/_sources/user_guide/prefetch.rst.txt
@@ -0,0 +1,72 @@
+.. 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.
+
+Prefetch
+========
+
+.. image:: ../_static/prefetch.svg
+   :alt: File Layout
+   :align: center
+   :width: 100%
+
+In Paimon C++, we use a multi-producer, single-consumer model to optimize file
+reading. The core idea is to split a file into row-based read ranges and assign
+them to multiple reader threads (producers). Each reader thread owns an
+independent result queue that holds its processed RecordBatches. In the main
+reader thread (the consumer), we sort the heads of all queues by the read
+range's starting row and select the RecordBatch with the smallest starting row
+to ensure globally ordered results.
+
+Read Range Splitting Strategy
+=============================
+
+Designing an efficient ReadRange splitting strategy requires balancing two key
+objectives:
+
+- Minimize read amplification: Ensure the data fetched from storage is used
+  effectively, avoiding unnecessary I/O overhead.
+- Reduce ReadRange span: Ideally, the size of a ReadRange should match a single
+  read batch size to enable fine-grained parallel control.
+
+Below we detail how these strategies are applied to Parquet and ORC.
+
+Parquet
+========
+
+Parquet files are organized into RowGroups and Pages. Since C++ Parquet does
+not support row-level seeking, prefetching can only be done at the RowGroup
+level. This naturally avoids read amplification, but introduces a new
+challenge: if a file contains only a small number of RowGroups, parallelism is
+severely limited. Therefore, we recommend users reduce RowGroup size when
+writing Parquet files to increase opportunities for parallel processing.
+
+Another critical difference is the read behavior compared to ORC. ORC strictly
+returns RecordBatches aligned to Stripe boundaries, whereas C++ Parquet may
+return a RecordBatch containing data from multiple RowGroups. This can lead to
+output order confusion during parallel reads. We modified C++ Parquet internals
+to return results strictly aligned to RowGroup boundaries, matching ORC's
+behavior. With this change, parallel reading no longer requires complex seek
+operations, improving overall read efficiency.
+
+ORC
+===
+
+ORC files are organized into Stripes. Paimon C++ generates row ranges from
+Stripe metadata, the selected columns, and the configured natural read size.
+Prefetch is enabled when the estimated compressed size of the selected columns
+exceeds the configured threshold; otherwise the reader uses the normal
+single-reader path.
diff --git a/_sources/user_guide/primary_key_global_index.rst.txt b/_sources/user_guide/primary_key_global_index.rst.txt
new file mode 100644
index 00000000..9307d938
--- /dev/null
+++ b/_sources/user_guide/primary_key_global_index.rst.txt
@@ -0,0 +1,93 @@
+.. 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.
+
+Primary Key Global Index
+========================
+
+Paimon 2.0 primary-key tables support *source-backed* global scalar indexes
+(``pk-btree`` / ``pk-bitmap``). Unlike the Data Evolution global indexes described in
+:doc:`global_index`, which address rows by a table-wide row id, a source-backed payload
+covers an immutable ordered source group from one positive data level of one bucket, and
+its results are group ordinals that are localized back to per-file physical row positions.
+
+paimon-cpp supports the BTree build, maintenance, and read lifecycle of this protocol for
+fixed-bucket primary-key tables. Compaction automatically builds one immutable payload for
+each indexed field and positive data level. Ordinary batch scans evaluate the indexed part
+of the predicate against validated payload groups and narrow covered files to indexed
+splits carrying file-local row ranges. No dedicated build or query API is required.
+
+Table requirements
+------------------
+
+The definitions follow the Java table options:
+
+- ``'pk-btree.index.columns' = 'price'`` with optional
+  ``'fields.price.pk-btree.index.options' = '{"block-size":"64 kb"}'``
+- fixed bucket (``bucket > 0``) for automatic C++ maintenance; Java-compatible postpone
+  bucket schemas remain readable, but the C++ postpone writer does not build payloads
+- ``'deletion-vectors.enabled' = 'true'`` and ``'deletion-vectors.merge-on-read' = 'false'``
+
+Semantics
+---------
+
+- A payload retains its complete ordered source list as the group-ordinal namespace. If
+  part of that list is not in the current scan because it was retired or safely pruned,
+  the payload can still cover the remaining files. There is at most one accepted payload
+  per data level. A payload is rejected if it has no active source at its metadata-declared
+  level, an active source's row count differs, its metadata or row range is invalid, or
+  another payload exists for that level. Active files without accepted coverage are scanned
+  normally.
+- Index construction reads every physical source row without applying deletion vectors,
+  orders source files by file name, and externally sorts ``(value, group row id)``. During
+  maintenance, missing, duplicate, malformed, or incomplete payloads cause their complete current
+  level to be rebuilt. A payload that still covers every active source is reused even if it also
+  lists retired sources. Data files and the corresponding index ADD / DELETE entries are committed
+  in the same snapshot.
+- The builder uses the existing write-buffer and spill settings. A write context needs a
+  temporary directory when a level exceeds the in-memory write buffer and spill is enabled.
+- If payload construction fails, the data-file transition is still committed. Uncovered files at
+  that level fall back to scanning while any previously usable payload remains active, and a later
+  maintenance attempt can rebuild the complete current source group. Structural commit-increment
+  errors are still rejected.
+- Snapshot expiration retains payloads referenced by the snapshots in its retention set and
+  current-branch live tags, and removes retired payloads before their index manifests, including
+  payloads on an external index path. Expiration is rejected while another branch exists until
+  cross-branch file retention is supported. Orphan cleanup covers table-local index manifests and
+  payloads; it does not enumerate a potentially shared global-index external path.
+- ``AND`` predicates narrow with any safely evaluable indexed child; ``OR`` predicates
+  only use the index when every branch is evaluable. Files whose evaluation fails, whose
+  positions are out of range, or whose result needs more than 4096 ranges fall back to a
+  normal scan individually.
+- Indexed splits keep their deletion files aligned with the data file; the reader still
+  applies deletion vectors and the complete original predicate, so index results never
+  change visibility semantics.
+- ``'global-index.enabled' = 'false'`` disables the planner.
+
+Current scope
+-------------
+
+- The BTree payload reader is wired up. ``pk-bitmap`` (and vector / full-text)
+  definitions are recognized for validation, but their evaluation conservatively falls
+  back to a normal scan until their dedicated payload readers are supported.
+- The read path targets the Java release-2.0.0 layout and scan semantics (source metadata
+  v1, ``GlobalIndexMeta`` with ``_SOURCE_META``, commit message v12). Source-file names
+  currently use the existing C++ length-prefixed UTF-8 streams; ASCII and non-null BMP
+  names are compatible with Java ``writeUTF``, while complete modified UTF-8 support for
+  supplementary code points will be handled by a shared stream-level change.
+- Automatic maintenance is synchronous during prepare-commit. Java's asynchronous build
+  scheduling, retries, fairness metrics, and manual rebuild actions are not part of the C++
+  API. Realtime and postpone-bucket writers do not build source-backed payloads.
diff --git a/_sources/user_guide/primary_key_table.rst.txt b/_sources/user_guide/primary_key_table.rst.txt
new file mode 100644
index 00000000..e9cdc10b
--- /dev/null
+++ b/_sources/user_guide/primary_key_table.rst.txt
@@ -0,0 +1,154 @@
+.. 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.
+
+.. Ported from the Paimon documentation:
+.. https://github.com/apache/paimon/blob/master/docs/content/primary-key-table/overview.md
+
+Primary Key Table
+=================
+If you define a table with primary key, you can insert, update or delete records
+in the table.
+
+Primary keys consist of a set of columns that contain unique values for each
+record. Paimon enforces data ordering by sorting the primary key within each
+bucket, allowing users to achieve high performance by applying filtering
+conditions on the primary key.
+
+
+Bucket
+-------
+Unpartitioned tables, or partitions in partitioned tables, are sub-divided into
+buckets, to provide extra structure to the data that may be used for more
+efficient querying.
+
+Each bucket directory contains an LSM tree and its changelog files.
+
+.. note::
+   Changelog is not supported yet for Paimon C++ primary key table write.
+
+The range for a bucket is determined by the hash value of one or more columns in
+the records. Users can specify bucketing columns by providing the bucket-key option.
+If no bucket-key option is specified, the primary key (if defined) or the complete
+record will be used as the bucket key.
+
+A bucket is the smallest storage unit for reads and writes, so the number of
+buckets limits the maximum processing parallelism. This number should not be too
+big, though, as it will result in lots of small files and low read performance.
+In general, the recommended data size in each bucket is about 200MB - 1GB.
+
+Also, see rescale bucket if you want to adjust the number of buckets after a
+table is created.
+
+
+LSM Trees
+-------------
+Paimon adopts the LSM tree (log-structured merge-tree) as the data structure for
+file storage. This documentation briefly introduces the concepts about LSM trees.
+
+Sorted Runs
+~~~~~~~~~~~~~~
+LSM tree organizes files into several sorted runs. A sorted run consists of one
+or multiple data files and each data file belongs to exactly one sorted run.
+
+Records within a data file are sorted by their primary keys. Within a sorted run,
+ranges of primary keys of data files never overlap.
+
+.. image:: ../_static/sorted-runs.png
+   :alt: Sorted Runs
+   :align: center
+   :width: 100%
+
+As you can see, different sorted runs may have overlapped primary key ranges,
+and may even contain the same primary key. When querying the LSM tree, all
+sorted runs must be combined and all records with the same primary key must be
+merged according to the user-specified merge engine and the timestamp of each record.
+
+New records written into the LSM tree will be first buffered in memory. When the
+memory buffer is full, all records in memory will be sorted and flushed to disk.
+A new sorted run is now created.
+
+
+Merge Engines
+-------------
+When Paimon sink receives two or more records with the same primary key, it
+merges them into one record to keep the primary key unique. The
+``merge-engine`` table option decides how. Paimon C++ supports ``deduplicate``
+(the default, which keeps the last record), ``partial-update``, ``first-row``
+and ``aggregation``.
+
+Aggregation
+~~~~~~~~~~~~~~
+The ``aggregation`` merge engine aggregates each value field across the records
+sharing a primary key, using the function configured for that field. Fields
+without a configured function fall back to
+``fields.default-aggregate-function``, and then to ``last_non_null_value``.
+
+.. code-block:: text
+
+   merge-engine = aggregation
+   fields.<field-name>.aggregate-function = <function>
+   fields.default-aggregate-function = <function>
+   fields.<field-name>.ignore-retract = true
+
+The available functions are ``sum``, ``product``, ``min``, ``max``,
+``first_value``, ``last_value``, ``first_non_null_value``,
+``last_non_null_value``, ``bool_and``, ``bool_or``, ``listagg``, ``collect``,
+``merge_map``, ``nested_update``, ``hll_sketch`` and ``theta_sketch``. Each one
+accepts only the field types it is defined for. An unknown function, or a
+function configured on an unsupported field type, is rejected when aggregation
+logic is initialized. Read paths that bypass aggregation may skip this
+validation.
+
+Not every function can process a retraction, that is a record whose row kind is
+``DELETE`` or ``UPDATE_BEFORE``. A function that cannot returns an error, unless
+``fields.<field-name>.ignore-retract`` is set, which drops the retraction
+instead.
+
+product
+^^^^^^^^^^^^^^
+Multiplies the values of a field. It accepts ``TINYINT``, ``SMALLINT``,
+``INT``, ``BIGINT``, ``FLOAT``, ``DOUBLE`` and ``DECIMAL``, and it supports
+retraction by dividing the accumulated value.
+
+.. code-block:: text
+
+   merge-engine = aggregation
+   fields.price.aggregate-function = product
+
+Null values are skipped, so aggregating a null into a field leaves the field
+unchanged, and the first non-null value seeds the product. Retracting into a
+field that is still null leaves it null rather than producing a reciprocal.
+
+Integer arithmetic is exact. A product or a quotient outside the range of the
+field type, a division by zero, and dividing the smallest value of the type by
+``-1`` all fail with an error instead of wrapping around. An integer quotient
+truncates towards zero, so retracting ``3`` from ``10`` yields ``3``.
+
+``FLOAT`` and ``DOUBLE`` follow IEEE 754 instead of reporting an error.
+Retracting a zero from a finite non-zero value yields an infinity carrying the
+sign of both operands, and retracting a zero from a zero yields ``NaN``.
+
+``DECIMAL`` has two boundary behaviors worth knowing, both matching Paimon
+Java:
+
+- The product and the quotient are rounded half up to the scale of the field.
+  A result that no longer fits the precision of the field aggregates to
+  ``NULL`` rather than failing, so a ``DECIMAL(4, 2)`` field holding
+  ``99.99 * 99.99`` becomes ``NULL``.
+- Retraction only accepts a quotient with a finite decimal expansion, and
+  returns an error otherwise. ``1.00 / 8.00`` is accepted and rounds to
+  ``0.13``, while ``2.00 / 3.00`` is rejected.
diff --git a/_sources/user_guide/read.rst.txt b/_sources/user_guide/read.rst.txt
new file mode 100644
index 00000000..adebaecb
--- /dev/null
+++ b/_sources/user_guide/read.rst.txt
@@ -0,0 +1,352 @@
+.. 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.
+
+Read
+====
+Paimon by functionality can be divided into two layers:
+
+- Control Plane: Responsible for accessing and managing Meta (snapshot, manifest, etc.), including:
+  - Catalog / Database access
+  - Table retrieval
+  - Collection and resolution of data files
+
+- Data Plane: Responsible for accessing actual data files, including:
+  - Readers for various file formats
+  - Coordinated reading of file collections
+
+The control plane and data plane interact primarily via DataSplit (the query plan). Paimon C++ currently supports a standard
+DataSplit protocol which includes the necessary meta information to access data files. With DataSplit, a high-performance
+data access path can be integrated.
+
+At compute time, the execution engine (reader) does not need to be aware of the concrete table type or its metadata details.
+It only needs to follow the instructions within the DataSplit (query plan) to perform data reading operations.
+
+With the layered abstraction of the control plane and data plane, and the use of DataSplit as a stable protocol interface,
+the two layers can evolve their functionality and optimize code relatively independently. This design also enables
+cross-language task scheduling and interaction (e.g., Java and C++), substantially reducing engineering maintenance costs
+across the two language ecosystems.
+
+
+Schema Evolution
+-----------------------
+Scope and Compatibility
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+Paimon C++ supports all evolution kinds available in Java Paimon for non-nested types:
+
+- Add column
+- Drop column
+- Reorder columns
+- Rename column
+- Change column type
+
+.. note::
+
+  - Only non-nested type evolution is supported. Nested columns (struct, array, map) are not supported.
+  - Partition keys: Only column reordering is supported; other operations are not supported (consistent with Java Paimon).
+  - Primary key:
+
+    - Adding or dropping columns is not supported.
+    - Other operations are supported (consistent with Java Paimon).
+
+Per-File Schema via Field IDs
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+In DataSplit, each file may have a completely different data schema. Paimon uses field IDs to uniquely identify fields.
+
+Overflow Behavior Disclaimer
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Overflow behavior is undefined for C++ and Java Paimon. Results in overflow scenarios may:
+
+- Be incorrect values,
+- Return an error status,
+- Or be null.
+
+Paimon C++ does not guarantee identical results to Java Paimon in overflow scenarios. Users should not rely on identical
+return values between implementations.
+
+One exception: casting ``float`` or ``double`` to an integer type is well defined and matches Java on every supported
+architecture; see note 2️⃣ below the matrix.
+
+Type Change Support Matrix
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+The table below indicates support for changing a column type from ``source`` to ``target``. Refer to the numbered notes below the table
+for caveats.
+
+.. list-table::
+   :header-rows: 1
+   :widths: 12 10 10 10 10 10 10 8 12 10 8 18 10
+
+   * - src \\ target
+     - tinyint
+     - smallint
+     - int
+     - bigint
+     - float
+     - double
+     - bool
+     - string
+     - binary
+     - date
+     - timestamp (without tz)
+     - decimal
+   * - tinyint
+     - ✅
+     - ✅
+     - ✅
+     - ✅
+     - ✅
+     - ✅
+     - ✅
+     - ✅
+     - ❌
+     - ❌
+     - ❌
+     - ✅
+   * - smallint
+     - ✅ 1️⃣
+     - ✅
+     - ✅
+     - ✅
+     - ✅
+     - ✅
+     - ✅
+     - ✅
+     - ❌
+     - ❌
+     - ❌
+     - ✅
+   * - int
+     - ✅ 1️⃣
+     - ✅ 1️⃣
+     - ✅
+     - ✅
+     - ✅
+     - ✅
+     - ✅
+     - ✅
+     - ❌
+     - ❌
+     - ✅ 1️⃣
+     - ✅
+   * - bigint
+     - ✅ 1️⃣
+     - ✅ 1️⃣
+     - ✅ 1️⃣
+     - ✅
+     - ✅
+     - ✅
+     - ✅
+     - ✅
+     - ❌
+     - ❌
+     - ✅ 6️⃣
+     - ✅
+   * - float
+     - ✅ 2️⃣
+     - ✅ 2️⃣
+     - ✅ 2️⃣
+     - ✅ 2️⃣
+     - ✅
+     - ✅
+     - ✅
+     - ✅ 3️⃣ 4️⃣
+     - ❌
+     - ❌
+     - ❌
+     - ✅
+   * - double
+     - ✅ 2️⃣
+     - ✅ 2️⃣
+     - ✅ 2️⃣
+     - ✅ 2️⃣
+     - ✅ 2️⃣
+     - ✅
+     - ✅
+     - ✅ 3️⃣ 4️⃣
+     - ❌
+     - ❌
+     - ❌
+     - ✅
+   * - bool
+     - ✅
+     - ✅
+     - ✅
+     - ✅
+     - ✅
+     - ✅
+     - ✅
+     - ✅
+     - ❌
+     - ❌
+     - ❌
+     - ✅
+   * - string
+     - ✅
+     - ✅
+     - ✅
+     - ✅
+     - ✅ 3️⃣
+     - ✅ 3️⃣
+     - ✅
+     - ✅
+     - ✅
+     - ✅
+     - ✅ 5️⃣
+     - ✅ 7️⃣
+   * - binary
+     - ❌
+     - ❌
+     - ❌
+     - ❌
+     - ❌
+     - ❌
+     - ❌
+     - ✅
+     - ✅
+     - ❌
+     - ❌
+     - ❌
+   * - date
+     - ❌
+     - ❌
+     - ❌
+     - ❌
+     - ❌
+     - ❌
+     - ❌
+     - ✅
+     - ❌
+     - ✅
+     - ✅ 5️⃣
+     - ❌
+   * - timestamp (without tz)
+     - ❌
+     - ❌
+     - ✅ 1️⃣
+     - ✅
+     - ❌
+     - ❌
+     - ❌
+     - ✅
+     - ❌
+     - ✅
+     - ✅
+     - ❌
+   * - decimal
+     - ✅ 1️⃣
+     - ✅ 1️⃣
+     - ✅ 1️⃣
+     - ✅ 1️⃣
+     - ✅
+     - ✅
+     - ❌
+     - ✅
+     - ❌
+     - ❌
+     - ❌
+     - ✅
+
+.. admonition:: Overflow Behavior Notes
+  :class: note
+
+  1️⃣ Integer downcast overflow behavior matches Java in specific cases.
+    Example: smallint -> tinyint, 32767 becomes -1; int -> smallint, -2147483648 becomes 0.
+
+  2️⃣ Casting float/double to an integer type follows Java semantics on every supported architecture:
+    ``NaN`` becomes 0, an out-of-range value saturates at the int32 bounds (int64 for ``bigint``),
+    and the result is narrowed to the target width by keeping the low bits, the way Java
+    narrowing does.
+
+    Example: float -> tinyint, C++ and Java both: ``MAX_FLOAT -> -1``, ``INFINITY -> -1``,
+    ``NaN -> 0``, ``300.9 -> 44``.
+
+    double -> float overflow produces ``Infinity`` / ``-Infinity``, consistent with Java.
+
+  3️⃣ Keyword differences for special float/double values:
+    - Java: Infinity, -Infinity, NaN
+    - C++:  inf, -inf, nan
+
+  4️⃣ Printing difference:
+    - C++ prints 1.0 as ``1``
+    - Java prints 1.0 as ``1.0``
+
+  5️⃣ Timestamp precision and range differences:
+    - Java: 0000-01-01 00:00:00.000000000 to 9999-12-31 23:59:59.999999999
+    - C++:  1677-09-21 00:12:43.145224192 to 2262-04-11 23:47:16.854775807
+    - C++ only supports nanosecond precision; range is smaller.
+
+  6️⃣ bigint -> timestamp range differences:
+    - Java (ms):   ``[MIN_INT64/1000, MAX_INT64/1000]`` seconds
+    - C++ (ns):    ``[MIN_INT64/1e9,  MAX_INT64/1e9]`` seconds
+
+  7️⃣ string -> decimal with precision > 38:
+    - C++ returns ``null`` if parsing would overflow 128-bit arithmetic.
+    - Java may rescale and return a value based on the rescaled precision.
+    - Example input: ``1111111111111111111111111111111111111.15``, Java returns: ``1111111111111111111111111111111111111.2``, C++ returns: ``null``
+
+Implementation Guidance
+~~~~~~~~~~~~~~~~~~~~~~~
+
+- Use DataSplit as the sole interface between control and data planes. Treat it as the canonical query plan contract.
+- Resolve field types and IDs per file; prefer inline data file metadata, fallback to table schema files when necessary.
+- Expect per-file schema variability; design readers to align by field IDs rather than positional indices.
+- Do not assume identical overflow semantics across C++ and Java; tests should validate acceptable ranges and nullability.
+- For timestamp handling, consider precision/range constraints in C++ when interoperating with Java-produced data splits.
+
+.. _data-evolution-deletion-vectors:
+
+Deletion Vectors on Data-Evolution Tables
+-----------------------------------------
+
+A data-evolution table (``data-evolution.enabled = true``) may enable
+``deletion-vectors.enabled``. Reading such a table is supported: a deleted row disappears
+from the result, including from the columns merged out of the other files that cover it.
+
+How the Deletion Vector Is Located
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+A data-evolution split holds several files per row id range, one per group of columns. The
+deletion vector of such a row range group is not per file: it is maintained against the
+group's *anchor file*, the oldest normal file of the group, compared by
+``(max_sequence_number, file_name)`` and skipping blob and vector-store files. Its positions
+are therefore relative to the anchor file's row id range.
+
+Reading applies that one vector to every file of the group, shifted by the file's offset
+inside the anchor range, so all the readers being merged drop the same rows and stay
+positionally aligned. The blob fallback path has no file reader to wrap for the placeholder
+gaps it pads uncovered row ids with, so it removes the deleted row ids from those gap ranges
+instead.
+
+The rule that picks the anchor has to stay identical to the engine that writes the vectors:
+a vector keyed by any other file of the group is never found, and its deleted rows silently
+come back.
+
+Limitations
+~~~~~~~~~~~
+
+- Only the default 32-bit deletion vectors can be read. ``deletion-vectors.bitmap64`` is not
+  supported yet, and a read fails when it actually encounters a 64-bit deletion vector.
+- Paimon C++ does not write deletion vectors for data-evolution tables, so the deletes
+  themselves have to be issued by another engine.
+- A commit that drops data files from such a table, an overwrite for instance, is refused.
+  Whether it conflicts with a concurrent commit rewriting those files' deletion vectors cannot
+  be decided yet, so it fails rather than committing against a stale state. Appending is
+  unaffected, and so is another engine replacing a deletion vector.
+- Such a table is never compacted; see
+  :ref:`the compaction note <data-evolution-deletion-vectors-compaction>`.
diff --git a/_sources/user_guide/schema.rst.txt b/_sources/user_guide/schema.rst.txt
new file mode 100644
index 00000000..5db69ef9
--- /dev/null
+++ b/_sources/user_guide/schema.rst.txt
@@ -0,0 +1,111 @@
+.. 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.
+
+.. Ported from the Paimon documentation:
+.. https://github.com/apache/paimon/blob/master/docs/content/concepts/spec/schema.md
+
+Schema
+======
+
+The version of the schema file starts from 0 and currently retains all versions of the schema.
+There may be old files that rely on the old schema version, so its deletion should be done with caution.
+
+Schema File is JSON, it includes:
+
+1. ``fields``: data field list. Each data field contains ``id``, ``name``, ``type``. Field ``id`` is used to support schema evolution.
+2. ``partitionKeys``: field name list. Partition definition of the table; it cannot be modified.
+3. ``primaryKeys``: field name list. Primary key definition of the table; it cannot be modified.
+4. ``options``: ``map<string, string>``, unordered. Options of the table, including a lot of capabilities and optimizations.
+
+Example
+-------
+
+.. code-block:: json
+
+   {
+     "version" : 3,
+     "id" : 0,
+     "fields" : [ {
+       "id" : 0,
+       "name" : "order_id",
+       "type" : "BIGINT NOT NULL"
+     }, {
+       "id" : 1,
+       "name" : "order_name",
+       "type" : "STRING"
+     }, {
+       "id" : 2,
+       "name" : "order_user_id",
+       "type" : "BIGINT"
+     }, {
+       "id" : 3,
+       "name" : "order_shop_id",
+       "type" : "BIGINT"
+     } ],
+     "highestFieldId" : 3,
+     "partitionKeys" : [ ],
+     "primaryKeys" : [ "order_id" ],
+     "options" : {
+       "bucket" : "5"
+     },
+     "comment" : "",
+     "timeMillis" : 1720496663041
+   }
+
+Compatibility
+-------------
+
+For old versions:
+
+- Version 1: should put ``bucket -> 1`` to ``options`` if there is no ``bucket`` key.
+- Versions 1 & 2: should put ``file.format -> orc`` to ``options`` if there is no ``file.format`` key.
+
+DataField
+---------
+
+DataField represents a column of the table.
+
+1. ``id``: int, column id, automatic increment; it is used for schema evolution.
+2. ``name``: string, column name.
+3. ``type``: data type, very similar to SQL type string.
+4. ``description``: string.
+
+Nullable MAP Keys
+-----------------
+
+Paimon C++ accepts nullable ``MAP`` key declarations for compatibility with existing schemas.
+A query fails only when the data actually contains a NULL map key.
+
+Update Schema
+-------------
+
+Updating the schema should generate a new schema file.
+
+.. code-block:: text
+
+   warehouse
+   └── default.db
+       └── my_table
+           ├── schema
+               ├── schema-0
+               ├── schema-1
+               └── schema-2
+
+There is a reference to schema in the snapshot. The schema file with the highest numerical value is usually the latest schema file.
+
+Old schema files cannot be directly deleted because there may be old data files that reference old schema files. When
+reading the table, it is necessary to rely on them for schema evolution reading.
diff --git a/_sources/user_guide/snapshot.rst.txt b/_sources/user_guide/snapshot.rst.txt
new file mode 100644
index 00000000..278e72af
--- /dev/null
+++ b/_sources/user_guide/snapshot.rst.txt
@@ -0,0 +1,68 @@
+.. 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.
+
+.. Ported from the Paimon documentation:
+.. https://github.com/apache/paimon/blob/master/docs/content/concepts/spec/snapshot.md
+
+Snapshot
+========
+
+Each commit generates a snapshot file, and the version of the snapshot file starts from 1 and must be continuous.
+``EARLIEST`` and ``LATEST`` are hint files at the beginning and end of the snapshot list, and they can be inaccurate.
+When hint files are inaccurate, the reader will scan all snapshot files to determine the beginning and end.
+
+Directory Layout
+----------------
+
+.. code-block:: shell
+
+   warehouse
+   └── default.db
+       └── my_table
+           ├── snapshot
+               ├── EARLIEST
+               ├── LATEST
+               ├── snapshot-1
+               ├── snapshot-2
+               └── snapshot-3
+
+Writing commit will preempt the next snapshot id, and once the snapshot file is successfully written, this commit will
+become visible.
+
+Snapshot File
+-------------
+
+Snapshot file is JSON and includes:
+
+1. ``version``: Snapshot file version, current is 3.
+2. ``uuid``: Uuid of this snapshot, generated on the client when the snapshot is created and absent only for a snapshot written before uuid was introduced. A commit names the uuid of the snapshot it is based on, so that a catalog can refuse a commit which raced another.
+3. ``id``: Snapshot id, same as the file name.
+4. ``schemaId``: The corresponding schema version for this commit.
+5. ``baseManifestList``: A manifest list recording all changes from the previous snapshots.
+6. ``deltaManifestList``: A manifest list recording all new changes occurred in this snapshot.
+7. ``changelogManifestList``: A manifest list recording all changelog produced in this snapshot; ``null`` if no changelog is produced.
+8. ``indexManifest``: A manifest recording all index files of this table; ``null`` if no table index file exists.
+9. ``commitUser``: Usually generated by UUID; used for recovery of streaming writes—one stream write job with one user.
+10. ``commitIdentifier``: Transaction id corresponding to streaming write; each transaction may result in multiple commits for different ``commitKind`` values.
+11. ``commitKind``: Type of changes in this snapshot, including ``append``, ``compact``, ``overwrite`` and ``analyze``.
+12. ``timeMillis``: Commit time in milliseconds.
+13. ``logOffsets``: Commit log offsets.
+14. ``totalRecordCount``: Record count of all changes occurred in this snapshot.
+15. ``deltaRecordCount``: Record count of all new changes occurred in this snapshot.
+16. ``changelogRecordCount``: Record count of all changelog produced in this snapshot.
+17. ``watermark``: Watermark for input records, from Flink watermark mechanism; ``Long.MIN_VALUE`` if there is no watermark.
+18. ``statistics``: Stats file name for statistics of this table.
diff --git a/_sources/user_guide/system_tables.rst.txt b/_sources/user_guide/system_tables.rst.txt
new file mode 100644
index 00000000..6ac01882
--- /dev/null
+++ b/_sources/user_guide/system_tables.rst.txt
@@ -0,0 +1,70 @@
+.. 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.
+
+System Tables
+=============
+
+Paimon C++ supports reading system tables by appending a system table suffix to
+the data table path. For example, ``/warehouse/db.db/orders$snapshots`` reads
+the snapshots system table for ``orders``.
+
+Branch-qualified paths are also supported. For example,
+``/warehouse/db.db/orders$branch_audit$files`` reads the files system table from
+the ``audit`` branch.
+
+Read-Optimized System Table
+---------------------------
+
+The read-optimized system table is addressed by the ``$ro`` suffix:
+
+.. code-block:: text
+
+   /warehouse/db.db/orders$ro
+
+For primary-key tables, ``$ro`` only plans data files from the highest LSM
+level, which is the level produced by full compaction. This avoids merging data
+from multiple LSM levels during query planning and reading. The tradeoff is that
+the result may lag behind the latest committed data until a full compaction
+publishes the newest records into the highest level.
+
+This stale view is not guaranteed to correspond to any single historical table
+snapshot. Full compaction may finish independently for different buckets. When
+``$ro`` scans the latest snapshot, the selected highest-level files can
+therefore combine bucket states produced by full-compaction commits at different
+snapshot IDs.
+
+For primary-key tables, ``$ro`` also enables value-stats filtering, so file-level
+pruning of the reader predicate can be more aggressive than the base table.
+
+For append-only tables, ``$ro`` has the same read behavior as the base table,
+including streaming reads.
+
+Limitations
+~~~~~~~~~~~
+
+- Primary-key ``$ro`` scans are batch-only. Streaming scans are not supported.
+- Freshness depends on full compaction frequency, and the result may not match
+  any single historical snapshot across buckets.
+- Primary-key tables in bucket-unaware mode are not supported by the current C++
+  scan path.
+
+Typical Usage
+~~~~~~~~~~~~~
+
+Use ``$ro`` for OLAP or batch workloads that can tolerate stale results and
+prefer reading compacted files directly. Use the base table path when the query
+must see the latest committed data.
diff --git a/_sources/user_guide/write.rst.txt b/_sources/user_guide/write.rst.txt
new file mode 100644
index 00000000..89f467db
--- /dev/null
+++ b/_sources/user_guide/write.rst.txt
@@ -0,0 +1,262 @@
+.. 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.
+
+Write
+=====
+Batch writing requires the compute engine to specify the target ``partition``.
+For fixed-bucket tables, the engine must also assign a valid bucket to every
+``RecordBatch``. In unaware-bucket and postpone-bucket modes, the writer can
+resolve the bucket automatically when it is omitted.
+
+Paimon C++ uses Apache Arrow as the :ref:`in-memory columnar format<memory-format>`
+to more efficiently support writing to disk columnar formats such as ORC,
+Parquet, and Avro, thereby improving write throughput.
+
+.. note::
+  Currently supported table types:
+    - Append table
+    - Primary Key table
+
+  Not supported in the current scope:
+    - Changelog
+
+Bucketing Modes
+---------------
+
+- Append tables:
+
+  * Support ``bucket = -1`` (unaware-bucket mode)
+  * Support ``bucket > 0`` (fixed bucket mode)
+
+- PK tables:
+
+  * Support ``bucket = -2`` (postpone bucket mode)
+  * Support ``bucket > 0`` (fixed bucket mode)
+
+.. note::
+   PK tables do not support dynamic bucketing (``bucket = -1``).
+
+RecordBatch Construction
+------------------------
+
+- The compute engine must:
+
+  - Assign the correct ``partition`` for each row.
+  - In fixed-bucket mode, apply the Paimon-consistent bucketing function, set a
+    bucket in ``[0, bucket)``, and group rows into Arrow ``RecordBatch`` objects
+    per partition-bucket combination.
+
+- In unaware-bucket mode (append table with ``bucket = -1``), an omitted bucket
+  is resolved to ``0``.
+- In postpone-bucket mode (primary-key table with ``bucket = -2``), an omitted
+  bucket is resolved to ``-2``.
+
+- Recommended practices:
+
+  - Use schema-aligned Arrow arrays with explicit validity bitmaps and offsets.
+  - Prefer batch sizes tuned for I/O throughput (e.g., tens to hundreds of MB per flush, depending on filesystem and cluster configuration).
+  - Maintain stable sort orders within a batch only if required by downstream merge or compaction logic; otherwise avoid unnecessary ordering costs.
+
+Writing BLOB Columns
+~~~~~~~~~~~~~~~~~~~~
+
+A ``BLOB`` column is a ``LargeBinary`` field carrying Paimon's BLOB field
+metadata, and an ``ARRAY<BLOB>`` column is a top-level ``List`` field whose
+element field carries it. Build the BLOB field with ``paimon::Blob::ArrowField``
+and import it into Arrow; the element field of an ``ARRAY<BLOB>`` column must
+keep that metadata:
+
+.. code-block:: cpp
+
+   PAIMON_ASSIGN_OR_RAISE(std::unique_ptr<::ArrowSchema> c_element,
+                          paimon::Blob::ArrowField("element", /*nullable=*/true));
+   PAIMON_ASSIGN_OR_RAISE_FROM_ARROW(std::shared_ptr<arrow::Field> element,
+                                     arrow::ImportField(c_element.get()));
+   std::shared_ptr<arrow::Schema> schema = arrow::schema(
+       {arrow::field("id", arrow::int32()), arrow::field("frames", arrow::list(element))});
+
+For a column stored in blob files, which includes every ``ARRAY<BLOB>`` column,
+each value or element holds either the raw bytes or a serialized
+``paimon::BlobDescriptor`` produced by ``paimon::Blob::ToDescriptor``; the writer
+copies the referenced data into the blob file. A BLOB column listed in
+``blob-descriptor-field`` or ``blob-view-field`` keeps the reference in the data
+file instead, so the referenced data must remain available.
+
+If the referenced data cannot be reached, the write fails unless a write-null
+option covers the failure: ``blob-write-null-on-missing-file`` covers a
+referenced file that does not exist, and ``blob-write-null-on-fetch-failure``
+covers any other failure to resolve the descriptor or open the data, including
+a missing file when the former is disabled and an offset past the end of the
+file for a descriptor with a dynamic length (``-1``). A covered value is written
+as NULL; in an ``ARRAY<BLOB>`` only that element becomes NULL, not the array.
+Any other failure fails the write, such as a failure to write the blob file or
+to close a referenced file. As in Paimon Java, this includes a file too short
+for the range of a descriptor with a known length, which is only detected while
+the data is copied.
+See :doc:`data_types` for the table requirements and restrictions.
+
+A data-evolution write can update columns of existing rows. The write does not
+locate the updated rows itself: before the commit, each file in its commit
+messages must be assigned the first row id of the rows it covers. A write that
+carries only columns stored in blob files is always such an update, and
+committing it without that id fails. A BLOB column listed in
+``blob-descriptor-field`` or ``blob-view-field`` is stored in the data file
+instead. Paimon C++ does not assign that id and its public API cannot set it,
+so the commit messages must be updated outside Paimon C++, for example by
+Paimon Java after ``CommitMessage::Serialize``. The serialized payload does not
+carry its serialization version, so send ``CommitMessage::CurrentVersion()``
+with it, and pass ``CommitMessage::Deserialize`` the version the returned
+payload was serialized with.
+
+In such an update, a row whose BLOB or ``ARRAY<BLOB>`` value stays unchanged is
+marked with the reserved bytes ``_PAIMON_BLOB_PLACEHOLDER``: as the value itself
+for a BLOB column, or as the only element of the array for an ``ARRAY<BLOB>``
+column. As in Paimon Java, the marker works whatever other columns the update
+carries. Such a row keeps its value from the older files when read. Every write
+stores a value equal to the reserved bytes as such a marker, so that value is
+not supported.
+
+.. note::
+   The C++ writer differs from Paimon Java in these respects:
+
+   - A placeholder is identified by the reserved bytes; Java uses a dedicated
+     placeholder object, which cannot collide with a user value.
+   - A missing file is detected with ``FileSystem::Exists``. Java detects a
+     missing file for an ``ARRAY<BLOB>`` element only from an HTTP 404, and
+     does not write NULL for a 404 under ``blob-write-null-on-fetch-failure``
+     alone.
+   - A descriptor with a dynamic length is copied up to the file length read
+     when it is opened, so data appended to the file during the copy is left
+     out, and a file truncated during the copy fails the write. Java reads it
+     until the end of the file. Its offset past the end of the file also fails
+     to open, whereas Java writes an empty value for it when the file system
+     can seek past the end of a file, as the local one can.
+
+Prepare Commit
+----------------
+
+The compute engine is responsible for triggering the writer nodes' ``PrepareCommit``.
+Triggering conditions depend on the engine's business needs and can follow either:
+
+- Streaming mode: time-based or periodic triggers (e.g., every N seconds).
+- Batch mode: trigger after all data in the batch has been written.
+
+Once the compute engine collects ``CommitMessages`` from all writer nodes, it
+can issue a ``Commit`` request to the control plane (management path) to create
+a new ``Snapshot``.
+
+Compatibility Goals
+~~~~~~~~~~~~~~~~~~~
+
+To ensure interoperability, the ``PrepareCommit`` result produced by Paimon C++
+must be consumable by Paimon Java. Therefore:
+
+- The structure and semantics of ``CommitMessage`` must remain consistent with
+  Java Paimon.
+- Any evolution of the Java-side ``CommitMessage`` schema must be tracked and
+  validated on the C++ side to maintain cross-language compatibility.
+
+Interface Design in Paimon C++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Unlike Java Paimon, Paimon C++ does not expose ``BinaryRow``-like types in its
+public interfaces. To preserve compatibility without leaking internal row
+representations, Paimon C++ provides ``CommitMessage`` only through:
+
+- Serialization: convert the internal commit state into a well-defined binary
+  representation that matches Java Paimon's expectations.
+- Deserialization: parse the Java-compatible binary representation back into
+  C++ commit structures for validation, replay, or tooling needs.
+
+This design ensures that:
+
+- Public APIs are independent of Java-specific row abstractions.
+- Cross-language commit payloads remain stable and versionable.
+- Internal data layouts can evolve without breaking external consumers.
+
+CommitMessage Contract
+~~~~~~~~~~~~~~~~~~~~~~
+
+The ``CommitMessage`` must encode all information required by the coordinator to
+produce a correct ``Snapshot``, which commonly includes (but is not limited to):
+
+- Partition and bucket identifiers associated with written data.
+- New data files, delete files (as applicable to the table type).
+- File-level metadata required for manifest and index updates (e.g., row counts, min/max statistics where applicable).
+- Transactional markers and sequence numbers as required by table semantics.
+- Any per-writer state necessary for deduplication or idempotent commits.
+
+.. note::
+
+   The C++ writer supports Append and PK tables and can produce
+   ``CommitMessage`` objects for both. ``FileStoreCommit`` supports direct
+   file-system commits for both table types on non-object-store paths.
+   Object-store paths require REST catalog commit mode. Changelog is out of
+   scope and should not be emitted in ``CommitMessage`` until explicitly
+   supported.
+
+Serialization and Deserialization
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+- **Binary format:** The binary payload must strictly conform to Java Paimon's
+  ``CommitMessage`` encoding. It does not contain a version tag, so callers
+  must transport ``CommitMessage::CurrentVersion()`` separately and supply it
+  when deserializing.
+- **Serialization API:** Use ``CommitMessage::Serialize`` for one message or
+  ``CommitMessage::SerializeList`` for a list.
+- **Deserialization API:** Use ``CommitMessage::Deserialize`` or
+  ``CommitMessage::DeserializeList`` with the separately supplied
+  serialization version.
+- **Validation:** Conformance and round-trip tests must verify compatibility
+  with Java Paimon for supported message versions.
+
+Operational Flow
+~~~~~~~~~~~~~~~~~~~~~~~
+
+1. Writer nodes perform data ingestion and produce Arrow ``RecordBatch``
+   organized by partition and bucket.
+
+2. Writers flush batches into ORC, Parquet, or Avro files via registered
+   ``file.format`` and ``file-system`` backends, producing file-level metadata
+   and per-batch commit state.
+
+3. Each writer invokes ``PrepareCommit``, which:
+   - Aggregates per-writer state into ``CommitMessage`` objects.
+   - Returns ``CommitMessage`` objects; it does not serialize them.
+
+4. The compute engine gathers ``CommitMessage`` objects from all writers. For
+   cross-process transport, it explicitly calls ``Serialize`` or
+   ``SerializeList`` and carries ``CurrentVersion()`` alongside the payload.
+
+5. For a direct file-system commit on a non-object-store path, the engine
+   passes the objects to ``FileStoreCommit`` for either an Append or PK table.
+   For a table of a catalog which owns its versions, such as a REST catalog, it
+   passes that catalog and the table identifier to
+   ``WriteContextBuilder::WithCatalog`` and ``CommitContextBuilder::WithCatalog``.
+   The writer loads the latest snapshot from the catalog, and the current schema
+   from it as well when it writes to the main branch; a write aimed at another
+   branch reads the schema published under ``branch/branch-<name>`` instead. On
+   ``Commit``, the snapshot and the statistics of the change go to the catalog,
+   which decides whether this commit wins, and one that lost the race is rebased
+   and retried the way a file-system commit is. A caller without a catalog
+   client can instead enable REST catalog commit mode, call ``Commit``, obtain
+   the JSON request from ``GetLastCommitTableRequest``, and send that request to
+   the REST catalog itself. That request body names no branch, so a commit aimed
+   at one has to be sent to the URL of ``tbl$branch_dev`` rather than of ``tbl``.
+
+6. The local committer or REST catalog validates the messages, updates
+   manifests/metadata, and finalizes the snapshot atomically.
diff --git a/_sphinx_design_static/design-tabs.js b/_sphinx_design_static/design-tabs.js
new file mode 100644
index 00000000..b25bd6a4
--- /dev/null
+++ b/_sphinx_design_static/design-tabs.js
@@ -0,0 +1,101 @@
+// @ts-check
+
+// Extra JS capability for selected tabs to be synced
+// The selection is stored in local storage so that it persists across page loads.
+
+/**
+ * @type {Record<string, HTMLElement[]>}
+ */
+let sd_id_to_elements = {};
+const storageKeyPrefix = "sphinx-design-tab-id-";
+
+/**
+ * Create a key for a tab element.
+ * @param {HTMLElement} el - The tab element.
+ * @returns {[string, string, string] | null} - The key.
+ *
+ */
+function create_key(el) {
+  let syncId = el.getAttribute("data-sync-id");
+  let syncGroup = el.getAttribute("data-sync-group");
+  if (!syncId || !syncGroup) return null;
+  return [syncGroup, syncId, syncGroup + "--" + syncId];
+}
+
+/**
+ * Initialize the tab selection.
+ *
+ */
+function ready() {
+  // Find all tabs with sync data
+
+  /** @type {string[]} */
+  let groups = [];
+
+  document.querySelectorAll(".sd-tab-label").forEach((label) => {
+    if (label instanceof HTMLElement) {
+      let data = create_key(label);
+      if (data) {
+        let [group, id, key] = data;
+
+        // add click event listener
+        // @ts-ignore
+        label.onclick = onSDLabelClick;
+
+        // store map of key to elements
+        if (!sd_id_to_elements[key]) {
+          sd_id_to_elements[key] = [];
+        }
+        sd_id_to_elements[key].push(label);
+
+        if (groups.indexOf(group) === -1) {
+          groups.push(group);
+          // Check if a specific tab has been selected via URL parameter
+          const tabParam = new URLSearchParams(window.location.search).get(
+            group
+          );
+          if (tabParam) {
+            console.log(
+              "sphinx-design: Selecting tab id for group '" +
+                group +
+                "' from URL parameter: " +
+                tabParam
+            );
+            window.sessionStorage.setItem(storageKeyPrefix + group, tabParam);
+          }
+        }
+
+        // Check is a specific tab has been selected previously
+        let previousId = window.sessionStorage.getItem(
+          storageKeyPrefix + group
+        );
+        if (previousId === id) {
+          // console.log(
+          //   "sphinx-design: Selecting tab from session storage: " + id
+          // );
+          // @ts-ignore
+          label.previousElementSibling.checked = true;
+        }
+      }
+    }
+  });
+}
+
+/**
+ *  Activate other tabs with the same sync id.
+ *
+ * @this {HTMLElement} - The element that was clicked.
+ */
+function onSDLabelClick() {
+  let data = create_key(this);
+  if (!data) return;
+  let [group, id, key] = data;
+  for (const label of sd_id_to_elements[key]) {
+    if (label === this) continue;
+    // @ts-ignore
+    label.previousElementSibling.checked = true;
+  }
+  window.sessionStorage.setItem(storageKeyPrefix + group, id);
+}
+
+document.addEventListener("DOMContentLoaded", ready, false);
diff --git a/_sphinx_design_static/sphinx-design.min.css b/_sphinx_design_static/sphinx-design.min.css
new file mode 100644
index 00000000..860c36da
--- /dev/null
+++ b/_sphinx_design_static/sphinx-design.min.css
@@ -0,0 +1 @@
+.sd-bg-primary{background-color:var(--sd-color-primary) !important}.sd-bg-text-primary{color:var(--sd-color-primary-text) !important}button.sd-bg-primary:focus,button.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}a.sd-bg-primary:focus,a.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}.sd-bg-secondary{background-color:var(--sd-color-secondary) !important}.sd-bg-text-secondary{color:var(--sd-color-secondary-text) !import [...]
diff --git a/_static/base-stemmer.js b/_static/base-stemmer.js
new file mode 100644
index 00000000..e6fa0c49
--- /dev/null
+++ b/_static/base-stemmer.js
@@ -0,0 +1,476 @@
+// @ts-check
+
+/**@constructor*/
+BaseStemmer = function() {
+    /** @protected */
+    this.current = '';
+    this.cursor = 0;
+    this.limit = 0;
+    this.limit_backward = 0;
+    this.bra = 0;
+    this.ket = 0;
+
+    /**
+     * @param {string} value
+     */
+    this.setCurrent = function(value) {
+        this.current = value;
+        this.cursor = 0;
+        this.limit = this.current.length;
+        this.limit_backward = 0;
+        this.bra = this.cursor;
+        this.ket = this.limit;
+    };
+
+    /**
+     * @return {string}
+     */
+    this.getCurrent = function() {
+        return this.current;
+    };
+
+    /**
+     * @param {BaseStemmer} other
+     */
+    this.copy_from = function(other) {
+        /** @protected */
+        this.current          = other.current;
+        this.cursor           = other.cursor;
+        this.limit            = other.limit;
+        this.limit_backward   = other.limit_backward;
+        this.bra              = other.bra;
+        this.ket              = other.ket;
+    };
+
+    /**
+     * @param {number[]} s
+     * @param {number} min
+     * @param {number} max
+     * @return {boolean}
+     */
+    this.in_grouping = function(s, min, max) {
+        /** @protected */
+        if (this.cursor >= this.limit) return false;
+        var ch = this.current.charCodeAt(this.cursor);
+        if (ch > max || ch < min) return false;
+        ch -= min;
+        if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) == 0) return false;
+        this.cursor++;
+        return true;
+    };
+
+    /**
+     * @param {number[]} s
+     * @param {number} min
+     * @param {number} max
+     * @return {boolean}
+     */
+    this.go_in_grouping = function(s, min, max) {
+        /** @protected */
+        while (this.cursor < this.limit) {
+            var ch = this.current.charCodeAt(this.cursor);
+            if (ch > max || ch < min)
+                return true;
+            ch -= min;
+            if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) == 0)
+                return true;
+            this.cursor++;
+        }
+        return false;
+    };
+
+    /**
+     * @param {number[]} s
+     * @param {number} min
+     * @param {number} max
+     * @return {boolean}
+     */
+    this.in_grouping_b = function(s, min, max) {
+        /** @protected */
+        if (this.cursor <= this.limit_backward) return false;
+        var ch = this.current.charCodeAt(this.cursor - 1);
+        if (ch > max || ch < min) return false;
+        ch -= min;
+        if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) == 0) return false;
+        this.cursor--;
+        return true;
+    };
+
+    /**
+     * @param {number[]} s
+     * @param {number} min
+     * @param {number} max
+     * @return {boolean}
+     */
+    this.go_in_grouping_b = function(s, min, max) {
+        /** @protected */
+        while (this.cursor > this.limit_backward) {
+            var ch = this.current.charCodeAt(this.cursor - 1);
+            if (ch > max || ch < min) return true;
+            ch -= min;
+            if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) == 0) return true;
+            this.cursor--;
+        }
+        return false;
+    };
+
+    /**
+     * @param {number[]} s
+     * @param {number} min
+     * @param {number} max
+     * @return {boolean}
+     */
+    this.out_grouping = function(s, min, max) {
+        /** @protected */
+        if (this.cursor >= this.limit) return false;
+        var ch = this.current.charCodeAt(this.cursor);
+        if (ch > max || ch < min) {
+            this.cursor++;
+            return true;
+        }
+        ch -= min;
+        if ((s[ch >>> 3] & (0X1 << (ch & 0x7))) == 0) {
+            this.cursor++;
+            return true;
+        }
+        return false;
+    };
+
+    /**
+     * @param {number[]} s
+     * @param {number} min
+     * @param {number} max
+     * @return {boolean}
+     */
+    this.go_out_grouping = function(s, min, max) {
+        /** @protected */
+        while (this.cursor < this.limit) {
+            var ch = this.current.charCodeAt(this.cursor);
+            if (ch <= max && ch >= min) {
+                ch -= min;
+                if ((s[ch >>> 3] & (0X1 << (ch & 0x7))) != 0) {
+                    return true;
+                }
+            }
+            this.cursor++;
+        }
+        return false;
+    };
+
+    /**
+     * @param {number[]} s
+     * @param {number} min
+     * @param {number} max
+     * @return {boolean}
+     */
+    this.out_grouping_b = function(s, min, max) {
+        /** @protected */
+        if (this.cursor <= this.limit_backward) return false;
+        var ch = this.current.charCodeAt(this.cursor - 1);
+        if (ch > max || ch < min) {
+            this.cursor--;
+            return true;
+        }
+        ch -= min;
+        if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) == 0) {
+            this.cursor--;
+            return true;
+        }
+        return false;
+    };
+
+    /**
+     * @param {number[]} s
+     * @param {number} min
+     * @param {number} max
+     * @return {boolean}
+     */
+    this.go_out_grouping_b = function(s, min, max) {
+        /** @protected */
+        while (this.cursor > this.limit_backward) {
+            var ch = this.current.charCodeAt(this.cursor - 1);
+            if (ch <= max && ch >= min) {
+                ch -= min;
+                if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) != 0) {
+                    return true;
+                }
+            }
+            this.cursor--;
+        }
+        return false;
+    };
+
+    /**
+     * @param {string} s
+     * @return {boolean}
+     */
+    this.eq_s = function(s)
+    {
+        /** @protected */
+        if (this.limit - this.cursor < s.length) return false;
+        if (this.current.slice(this.cursor, this.cursor + s.length) != s)
+        {
+            return false;
+        }
+        this.cursor += s.length;
+        return true;
+    };
+
+    /**
+     * @param {string} s
+     * @return {boolean}
+     */
+    this.eq_s_b = function(s)
+    {
+        /** @protected */
+        if (this.cursor - this.limit_backward < s.length) return false;
+        if (this.current.slice(this.cursor - s.length, this.cursor) != s)
+        {
+            return false;
+        }
+        this.cursor -= s.length;
+        return true;
+    };
+
+    /**
+     * @param {Among[]} v
+     * @return {number}
+     */
+    this.find_among = function(v)
+    {
+        /** @protected */
+        var i = 0;
+        var j = v.length;
+
+        var c = this.cursor;
+        var l = this.limit;
+
+        var common_i = 0;
+        var common_j = 0;
+
+        var first_key_inspected = false;
+
+        while (true)
+        {
+            var k = i + ((j - i) >>> 1);
+            var diff = 0;
+            var common = common_i < common_j ? common_i : common_j; // smaller
+            // w[0]: string, w[1]: substring_i, w[2]: result, w[3]: function (optional)
+            var w = v[k];
+            var i2;
+            for (i2 = common; i2 < w[0].length; i2++)
+            {
+                if (c + common == l)
+                {
+                    diff = -1;
+                    break;
+                }
+                diff = this.current.charCodeAt(c + common) - w[0].charCodeAt(i2);
+                if (diff != 0) break;
+                common++;
+            }
+            if (diff < 0)
+            {
+                j = k;
+                common_j = common;
+            }
+            else
+            {
+                i = k;
+                common_i = common;
+            }
+            if (j - i <= 1)
+            {
+                if (i > 0) break; // v->s has been inspected
+                if (j == i) break; // only one item in v
+
+                // - but now we need to go round once more to get
+                // v->s inspected. This looks messy, but is actually
+                // the optimal approach.
+
+                if (first_key_inspected) break;
+                first_key_inspected = true;
+            }
+        }
+        do {
+            var w = v[i];
+            if (common_i >= w[0].length)
+            {
+                this.cursor = c + w[0].length;
+                if (w.length < 4) return w[2];
+                var res = w[3](this);
+                this.cursor = c + w[0].length;
+                if (res) return w[2];
+            }
+            i = w[1];
+        } while (i >= 0);
+        return 0;
+    };
+
+    // find_among_b is for backwards processing. Same comments apply
+    /**
+     * @param {Among[]} v
+     * @return {number}
+     */
+    this.find_among_b = function(v)
+    {
+        /** @protected */
+        var i = 0;
+        var j = v.length
+
+        var c = this.cursor;
+        var lb = this.limit_backward;
+
+        var common_i = 0;
+        var common_j = 0;
+
+        var first_key_inspected = false;
+
+        while (true)
+        {
+            var k = i + ((j - i) >> 1);
+            var diff = 0;
+            var common = common_i < common_j ? common_i : common_j;
+            var w = v[k];
+            var i2;
+            for (i2 = w[0].length - 1 - common; i2 >= 0; i2--)
+            {
+                if (c - common == lb)
+                {
+                    diff = -1;
+                    break;
+                }
+                diff = this.current.charCodeAt(c - 1 - common) - w[0].charCodeAt(i2);
+                if (diff != 0) break;
+                common++;
+            }
+            if (diff < 0)
+            {
+                j = k;
+                common_j = common;
+            }
+            else
+            {
+                i = k;
+                common_i = common;
+            }
+            if (j - i <= 1)
+            {
+                if (i > 0) break;
+                if (j == i) break;
+                if (first_key_inspected) break;
+                first_key_inspected = true;
+            }
+        }
+        do {
+            var w = v[i];
+            if (common_i >= w[0].length)
+            {
+                this.cursor = c - w[0].length;
+                if (w.length < 4) return w[2];
+                var res = w[3](this);
+                this.cursor = c - w[0].length;
+                if (res) return w[2];
+            }
+            i = w[1];
+        } while (i >= 0);
+        return 0;
+    };
+
+    /* to replace chars between c_bra and c_ket in this.current by the
+     * chars in s.
+     */
+    /**
+     * @param {number} c_bra
+     * @param {number} c_ket
+     * @param {string} s
+     * @return {number}
+     */
+    this.replace_s = function(c_bra, c_ket, s)
+    {
+        /** @protected */
+        var adjustment = s.length - (c_ket - c_bra);
+        this.current = this.current.slice(0, c_bra) + s + this.current.slice(c_ket);
+        this.limit += adjustment;
+        if (this.cursor >= c_ket) this.cursor += adjustment;
+        else if (this.cursor > c_bra) this.cursor = c_bra;
+        return adjustment;
+    };
+
+    /**
+     * @return {boolean}
+     */
+    this.slice_check = function()
+    {
+        /** @protected */
+        if (this.bra < 0 ||
+            this.bra > this.ket ||
+            this.ket > this.limit ||
+            this.limit > this.current.length)
+        {
+            return false;
+        }
+        return true;
+    };
+
+    /**
+     * @param {number} c_bra
+     * @return {boolean}
+     */
+    this.slice_from = function(s)
+    {
+        /** @protected */
+        var result = false;
+        if (this.slice_check())
+        {
+            this.replace_s(this.bra, this.ket, s);
+            result = true;
+        }
+        return result;
+    };
+
+    /**
+     * @return {boolean}
+     */
+    this.slice_del = function()
+    {
+        /** @protected */
+        return this.slice_from("");
+    };
+
+    /**
+     * @param {number} c_bra
+     * @param {number} c_ket
+     * @param {string} s
+     */
+    this.insert = function(c_bra, c_ket, s)
+    {
+        /** @protected */
+        var adjustment = this.replace_s(c_bra, c_ket, s);
+        if (c_bra <= this.bra) this.bra += adjustment;
+        if (c_bra <= this.ket) this.ket += adjustment;
+    };
+
+    /**
+     * @return {string}
+     */
+    this.slice_to = function()
+    {
+        /** @protected */
+        var result = '';
+        if (this.slice_check())
+        {
+            result = this.current.slice(this.bra, this.ket);
+        }
+        return result;
+    };
+
+    /**
+     * @return {string}
+     */
+    this.assign_to = function()
+    {
+        /** @protected */
+        return this.current.slice(0, this.limit);
+    };
+};
diff --git a/_static/basic.css b/_static/basic.css
new file mode 100644
index 00000000..4738b2ed
--- /dev/null
+++ b/_static/basic.css
@@ -0,0 +1,906 @@
+/*
+ * Sphinx stylesheet -- basic theme.
+ */
+
+/* -- main layout ----------------------------------------------------------- */
+
+div.clearer {
+    clear: both;
+}
+
+div.section::after {
+    display: block;
+    content: '';
+    clear: left;
+}
+
+/* -- relbar ---------------------------------------------------------------- */
+
+div.related {
+    width: 100%;
+    font-size: 90%;
+}
+
+div.related h3 {
+    display: none;
+}
+
+div.related ul {
+    margin: 0;
+    padding: 0 0 0 10px;
+    list-style: none;
+}
+
+div.related li {
+    display: inline;
+}
+
+div.related li.right {
+    float: right;
+    margin-right: 5px;
+}
+
+/* -- sidebar --------------------------------------------------------------- */
+
+div.sphinxsidebarwrapper {
+    padding: 10px 5px 0 10px;
+}
+
+div.sphinxsidebar {
+    float: left;
+    width: 230px;
+    margin-left: -100%;
+    font-size: 90%;
+    word-wrap: break-word;
+    overflow-wrap : break-word;
+}
+
+div.sphinxsidebar ul {
+    list-style: none;
+}
+
+div.sphinxsidebar ul ul,
+div.sphinxsidebar ul.want-points {
+    margin-left: 20px;
+    list-style: square;
+}
+
+div.sphinxsidebar ul ul {
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
+div.sphinxsidebar form {
+    margin-top: 10px;
+}
+
+div.sphinxsidebar input {
+    border: 1px solid #98dbcc;
+    font-family: sans-serif;
+    font-size: 1em;
+}
+
+div.sphinxsidebar #searchbox form.search {
+    overflow: hidden;
+}
+
+div.sphinxsidebar #searchbox input[type="text"] {
+    float: left;
+    width: 80%;
+    padding: 0.25em;
+    box-sizing: border-box;
+}
+
+div.sphinxsidebar #searchbox input[type="submit"] {
+    float: left;
+    width: 20%;
+    border-left: none;
+    padding: 0.25em;
+    box-sizing: border-box;
+}
+
+
+img {
+    border: 0;
+    max-width: 100%;
+}
+
+/* -- search page ----------------------------------------------------------- */
+
+ul.search {
+    margin-top: 10px;
+}
+
+ul.search li {
+    padding: 5px 0;
+}
+
+ul.search li a {
+    font-weight: bold;
+}
+
+ul.search li p.context {
+    color: #888;
+    margin: 2px 0 0 30px;
+    text-align: left;
+}
+
+ul.keywordmatches li.goodmatch a {
+    font-weight: bold;
+}
+
+/* -- index page ------------------------------------------------------------ */
+
+table.contentstable {
+    width: 90%;
+    margin-left: auto;
+    margin-right: auto;
+}
+
+table.contentstable p.biglink {
+    line-height: 150%;
+}
+
+a.biglink {
+    font-size: 1.3em;
+}
+
+span.linkdescr {
+    font-style: italic;
+    padding-top: 5px;
+    font-size: 90%;
+}
+
+/* -- general index --------------------------------------------------------- */
+
+table.indextable {
+    width: 100%;
+}
+
+table.indextable td {
+    text-align: left;
+    vertical-align: top;
+}
+
+table.indextable ul {
+    margin-top: 0;
+    margin-bottom: 0;
+    list-style-type: none;
+}
+
+table.indextable > tbody > tr > td > ul {
+    padding-left: 0em;
+}
+
+table.indextable tr.pcap {
+    height: 10px;
+}
+
+table.indextable tr.cap {
+    margin-top: 10px;
+    background-color: #f2f2f2;
+}
+
+img.toggler {
+    margin-right: 3px;
+    margin-top: 3px;
+    cursor: pointer;
+}
+
+div.modindex-jumpbox {
+    border-top: 1px solid #ddd;
+    border-bottom: 1px solid #ddd;
+    margin: 1em 0 1em 0;
+    padding: 0.4em;
+}
+
+div.genindex-jumpbox {
+    border-top: 1px solid #ddd;
+    border-bottom: 1px solid #ddd;
+    margin: 1em 0 1em 0;
+    padding: 0.4em;
+}
+
+/* -- domain module index --------------------------------------------------- */
+
+table.modindextable td {
+    padding: 2px;
+    border-collapse: collapse;
+}
+
+/* -- general body styles --------------------------------------------------- */
+
+div.body {
+    min-width: 360px;
+    max-width: 800px;
+}
+
+div.body p, div.body dd, div.body li, div.body blockquote {
+    -moz-hyphens: auto;
+    -ms-hyphens: auto;
+    -webkit-hyphens: auto;
+    hyphens: auto;
+}
+
+a.headerlink {
+    visibility: hidden;
+}
+
+a:visited {
+    color: #551A8B;
+}
+
+h1:hover > a.headerlink,
+h2:hover > a.headerlink,
+h3:hover > a.headerlink,
+h4:hover > a.headerlink,
+h5:hover > a.headerlink,
+h6:hover > a.headerlink,
+dt:hover > a.headerlink,
+caption:hover > a.headerlink,
+p.caption:hover > a.headerlink,
+div.code-block-caption:hover > a.headerlink {
+    visibility: visible;
+}
+
+div.body p.caption {
+    text-align: inherit;
+}
+
+div.body td {
+    text-align: left;
+}
+
+.first {
+    margin-top: 0 !important;
+}
+
+p.rubric {
+    margin-top: 30px;
+    font-weight: bold;
+}
+
+img.align-left, figure.align-left, .figure.align-left, object.align-left {
+    clear: left;
+    float: left;
+    margin-right: 1em;
+}
+
+img.align-right, figure.align-right, .figure.align-right, object.align-right {
+    clear: right;
+    float: right;
+    margin-left: 1em;
+}
+
+img.align-center, figure.align-center, .figure.align-center, object.align-center {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+}
+
+img.align-default, figure.align-default, .figure.align-default {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+}
+
+.align-left {
+    text-align: left;
+}
+
+.align-center {
+    text-align: center;
+}
+
+.align-default {
+    text-align: center;
+}
+
+.align-right {
+    text-align: right;
+}
+
+/* -- sidebars -------------------------------------------------------------- */
+
+div.sidebar,
+aside.sidebar {
+    margin: 0 0 0.5em 1em;
+    border: 1px solid #ddb;
+    padding: 7px;
+    background-color: #ffe;
+    width: 40%;
+    float: right;
+    clear: right;
+    overflow-x: auto;
+}
+
+p.sidebar-title {
+    font-weight: bold;
+}
+
+nav.contents,
+aside.topic,
+div.admonition, div.topic, blockquote {
+    clear: left;
+}
+
+/* -- topics ---------------------------------------------------------------- */
+
+nav.contents,
+aside.topic,
+div.topic {
+    border: 1px solid #ccc;
+    padding: 7px;
+    margin: 10px 0 10px 0;
+}
+
+p.topic-title {
+    font-size: 1.1em;
+    font-weight: bold;
+    margin-top: 10px;
+}
+
+/* -- admonitions ----------------------------------------------------------- */
+
+div.admonition {
+    margin-top: 10px;
+    margin-bottom: 10px;
+    padding: 7px;
+}
+
+div.admonition dt {
+    font-weight: bold;
+}
+
+p.admonition-title {
+    margin: 0px 10px 5px 0px;
+    font-weight: bold;
+}
+
+div.body p.centered {
+    text-align: center;
+    margin-top: 25px;
+}
+
+/* -- content of sidebars/topics/admonitions -------------------------------- */
+
+div.sidebar > :last-child,
+aside.sidebar > :last-child,
+nav.contents > :last-child,
+aside.topic > :last-child,
+div.topic > :last-child,
+div.admonition > :last-child {
+    margin-bottom: 0;
+}
+
+div.sidebar::after,
+aside.sidebar::after,
+nav.contents::after,
+aside.topic::after,
+div.topic::after,
+div.admonition::after,
+blockquote::after {
+    display: block;
+    content: '';
+    clear: both;
+}
+
+/* -- tables ---------------------------------------------------------------- */
+
+table.docutils {
+    margin-top: 10px;
+    margin-bottom: 10px;
+    border: 0;
+    border-collapse: collapse;
+}
+
+table.align-center {
+    margin-left: auto;
+    margin-right: auto;
+}
+
+table.align-default {
+    margin-left: auto;
+    margin-right: auto;
+}
+
+table caption span.caption-number {
+    font-style: italic;
+}
+
+table caption span.caption-text {
+}
+
+table.docutils td, table.docutils th {
+    padding: 1px 8px 1px 5px;
+    border-top: 0;
+    border-left: 0;
+    border-right: 0;
+    border-bottom: 1px solid #aaa;
+}
+
+th {
+    text-align: left;
+    padding-right: 5px;
+}
+
+table.citation {
+    border-left: solid 1px gray;
+    margin-left: 1px;
+}
+
+table.citation td {
+    border-bottom: none;
+}
+
+th > :first-child,
+td > :first-child {
+    margin-top: 0px;
+}
+
+th > :last-child,
+td > :last-child {
+    margin-bottom: 0px;
+}
+
+/* -- figures --------------------------------------------------------------- */
+
+div.figure, figure {
+    margin: 0.5em;
+    padding: 0.5em;
+}
+
+div.figure p.caption, figcaption {
+    padding: 0.3em;
+}
+
+div.figure p.caption span.caption-number,
+figcaption span.caption-number {
+    font-style: italic;
+}
+
+div.figure p.caption span.caption-text,
+figcaption span.caption-text {
+}
+
+/* -- field list styles ----------------------------------------------------- */
+
+table.field-list td, table.field-list th {
+    border: 0 !important;
+}
+
+.field-list ul {
+    margin: 0;
+    padding-left: 1em;
+}
+
+.field-list p {
+    margin: 0;
+}
+
+.field-name {
+    -moz-hyphens: manual;
+    -ms-hyphens: manual;
+    -webkit-hyphens: manual;
+    hyphens: manual;
+}
+
+/* -- hlist styles ---------------------------------------------------------- */
+
+table.hlist {
+    margin: 1em 0;
+}
+
+table.hlist td {
+    vertical-align: top;
+}
+
+/* -- object description styles --------------------------------------------- */
+
+.sig {
+	font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
+}
+
+.sig-name, code.descname {
+    background-color: transparent;
+    font-weight: bold;
+}
+
+.sig-name {
+	font-size: 1.1em;
+}
+
+code.descname {
+    font-size: 1.2em;
+}
+
+.sig-prename, code.descclassname {
+    background-color: transparent;
+}
+
+.optional {
+    font-size: 1.3em;
+}
+
+.sig-paren {
+    font-size: larger;
+}
+
+.sig-param.n {
+	font-style: italic;
+}
+
+/* C++ specific styling */
+
+.sig-inline.c-texpr,
+.sig-inline.cpp-texpr {
+	font-family: unset;
+}
+
+.sig.c   .k, .sig.c   .kt,
+.sig.cpp .k, .sig.cpp .kt {
+	color: #0033B3;
+}
+
+.sig.c   .m,
+.sig.cpp .m {
+	color: #1750EB;
+}
+
+.sig.c   .s, .sig.c   .sc,
+.sig.cpp .s, .sig.cpp .sc {
+	color: #067D17;
+}
+
+
+/* -- other body styles ----------------------------------------------------- */
+
+ol.arabic {
+    list-style: decimal;
+}
+
+ol.loweralpha {
+    list-style: lower-alpha;
+}
+
+ol.upperalpha {
+    list-style: upper-alpha;
+}
+
+ol.lowerroman {
+    list-style: lower-roman;
+}
+
+ol.upperroman {
+    list-style: upper-roman;
+}
+
+:not(li) > ol > li:first-child > :first-child,
+:not(li) > ul > li:first-child > :first-child {
+    margin-top: 0px;
+}
+
+:not(li) > ol > li:last-child > :last-child,
+:not(li) > ul > li:last-child > :last-child {
+    margin-bottom: 0px;
+}
+
+ol.simple ol p,
+ol.simple ul p,
+ul.simple ol p,
+ul.simple ul p {
+    margin-top: 0;
+}
+
+ol.simple > li:not(:first-child) > p,
+ul.simple > li:not(:first-child) > p {
+    margin-top: 0;
+}
+
+ol.simple p,
+ul.simple p {
+    margin-bottom: 0;
+}
+
+aside.footnote > span,
+div.citation > span {
+    float: left;
+}
+aside.footnote > span:last-of-type,
+div.citation > span:last-of-type {
+  padding-right: 0.5em;
+}
+aside.footnote > p {
+  margin-left: 2em;
+}
+div.citation > p {
+  margin-left: 4em;
+}
+aside.footnote > p:last-of-type,
+div.citation > p:last-of-type {
+    margin-bottom: 0em;
+}
+aside.footnote > p:last-of-type:after,
+div.citation > p:last-of-type:after {
+    content: "";
+    clear: both;
+}
+
+dl.field-list {
+    display: grid;
+    grid-template-columns: fit-content(30%) auto;
+}
+
+dl.field-list > dt {
+    font-weight: bold;
+    word-break: break-word;
+    padding-left: 0.5em;
+    padding-right: 5px;
+}
+
+dl.field-list > dd {
+    padding-left: 0.5em;
+    margin-top: 0em;
+    margin-left: 0em;
+    margin-bottom: 0em;
+}
+
+dl {
+    margin-bottom: 15px;
+}
+
+dd > :first-child {
+    margin-top: 0px;
+}
+
+dd ul, dd table {
+    margin-bottom: 10px;
+}
+
+dd {
+    margin-top: 3px;
+    margin-bottom: 10px;
+    margin-left: 30px;
+}
+
+.sig dd {
+    margin-top: 0px;
+    margin-bottom: 0px;
+}
+
+.sig dl {
+    margin-top: 0px;
+    margin-bottom: 0px;
+}
+
+dl > dd:last-child,
+dl > dd:last-child > :last-child {
+    margin-bottom: 0;
+}
+
+dt:target, span.highlighted {
+    background-color: #fbe54e;
+}
+
+rect.highlighted {
+    fill: #fbe54e;
+}
+
+dl.glossary dt {
+    font-weight: bold;
+    font-size: 1.1em;
+}
+
+.versionmodified {
+    font-style: italic;
+}
+
+.system-message {
+    background-color: #fda;
+    padding: 5px;
+    border: 3px solid red;
+}
+
+.footnote:target  {
+    background-color: #ffa;
+}
+
+.line-block {
+    display: block;
+    margin-top: 1em;
+    margin-bottom: 1em;
+}
+
+.line-block .line-block {
+    margin-top: 0;
+    margin-bottom: 0;
+    margin-left: 1.5em;
+}
+
+.guilabel, .menuselection {
+    font-family: sans-serif;
+}
+
+.accelerator {
+    text-decoration: underline;
+}
+
+.classifier {
+    font-style: oblique;
+}
+
+.classifier:before {
+    font-style: normal;
+    margin: 0 0.5em;
+    content: ":";
+    display: inline-block;
+}
+
+abbr, acronym {
+    border-bottom: dotted 1px;
+    cursor: help;
+}
+
+/* -- code displays --------------------------------------------------------- */
+
+pre {
+    overflow: auto;
+    overflow-y: hidden;  /* fixes display issues on Chrome browsers */
+}
+
+pre, div[class*="highlight-"] {
+    clear: both;
+}
+
+span.pre {
+    -moz-hyphens: none;
+    -ms-hyphens: none;
+    -webkit-hyphens: none;
+    hyphens: none;
+    white-space: nowrap;
+}
+
+div[class*="highlight-"] {
+    margin: 1em 0;
+}
+
+td.linenos pre {
+    border: 0;
+    background-color: transparent;
+    color: #aaa;
+}
+
+table.highlighttable {
+    display: block;
+}
+
+table.highlighttable tbody {
+    display: block;
+}
+
+table.highlighttable tr {
+    display: flex;
+}
+
+table.highlighttable td {
+    margin: 0;
+    padding: 0;
+}
+
+table.highlighttable td.linenos {
+    padding-right: 0.5em;
+}
+
+table.highlighttable td.code {
+    flex: 1;
+    overflow: hidden;
+}
+
+.highlight .hll {
+    display: block;
+}
+
+div.highlight pre,
+table.highlighttable pre {
+    margin: 0;
+}
+
+div.code-block-caption + div {
+    margin-top: 0;
+}
+
+div.code-block-caption {
+    margin-top: 1em;
+    padding: 2px 5px;
+    font-size: small;
+}
+
+div.code-block-caption code {
+    background-color: transparent;
+}
+
+table.highlighttable td.linenos,
+span.linenos,
+div.highlight span.gp {  /* gp: Generic.Prompt */
+  user-select: none;
+  -webkit-user-select: text; /* Safari fallback only */
+  -webkit-user-select: none; /* Chrome/Safari */
+  -moz-user-select: none; /* Firefox */
+  -ms-user-select: none; /* IE10+ */
+}
+
+div.code-block-caption span.caption-number {
+    padding: 0.1em 0.3em;
+    font-style: italic;
+}
+
+div.code-block-caption span.caption-text {
+}
+
+div.literal-block-wrapper {
+    margin: 1em 0;
+}
+
+code.xref, a code {
+    background-color: transparent;
+    font-weight: bold;
+}
+
+h1 code, h2 code, h3 code, h4 code, h5 code, h6 code {
+    background-color: transparent;
+}
+
+.viewcode-link {
+    float: right;
+}
+
+.viewcode-back {
+    float: right;
+    font-family: sans-serif;
+}
+
+div.viewcode-block:target {
+    margin: -1px -10px;
+    padding: 0 10px;
+}
+
+/* -- math display ---------------------------------------------------------- */
+
+img.math {
+    vertical-align: middle;
+}
+
+div.body div.math p {
+    text-align: center;
+}
+
+span.eqno {
+    float: right;
+}
+
+span.eqno a.headerlink {
+    position: absolute;
+    z-index: 1;
+}
+
+div.math:hover a.headerlink {
+    visibility: visible;
+}
+
+/* -- printout stylesheet --------------------------------------------------- */
+
+@media print {
+    div.document,
+    div.documentwrapper,
+    div.bodywrapper {
+        margin: 0 !important;
+        width: 100%;
+    }
+
+    div.sphinxsidebar,
+    div.related,
+    div.footer,
+    #top-link {
+        display: none;
+    }
+}
\ No newline at end of file
diff --git a/_static/check-solid.svg b/_static/check-solid.svg
new file mode 100644
index 00000000..92fad4b5
--- /dev/null
+++ b/_static/check-solid.svg
@@ -0,0 +1,4 @@
+<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-check" width="44" height="44" viewBox="0 0 24 24" stroke-width="2" stroke="#22863a" fill="none" stroke-linecap="round" stroke-linejoin="round">
+  <path stroke="none" d="M0 0h24v24H0z" fill="none"/>
+  <path d="M5 12l5 5l10 -10" />
+</svg>
diff --git a/_static/clipboard.min.js b/_static/clipboard.min.js
new file mode 100644
index 00000000..54b3c463
--- /dev/null
+++ b/_static/clipboard.min.js
@@ -0,0 +1,7 @@
+/*!
+ * clipboard.js v2.0.8
+ * https://clipboardjs.com/
+ *
+ * Licensed MIT © Zeno Rocha
+ */
+!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var  [...]
\ No newline at end of file
diff --git a/_static/copy-button.svg b/_static/copy-button.svg
new file mode 100644
index 00000000..9c074dae
--- /dev/null
+++ b/_static/copy-button.svg
@@ -0,0 +1,5 @@
+<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-copy" width="44" height="44" viewBox="0 0 24 24" stroke-width="1.5" stroke="#000000" fill="none" stroke-linecap="round" stroke-linejoin="round">
+  <path stroke="none" d="M0 0h24v24H0z" fill="none"/>
+  <rect x="8" y="8" width="12" height="12" rx="2" />
+  <path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2" />
+</svg>
diff --git a/_static/copybutton.css b/_static/copybutton.css
new file mode 100644
index 00000000..f1916ec7
--- /dev/null
+++ b/_static/copybutton.css
@@ -0,0 +1,94 @@
+/* Copy buttons */
+button.copybtn {
+    position: absolute;
+    display: flex;
+    top: .3em;
+    right: .3em;
+    width: 1.7em;
+    height: 1.7em;
+	opacity: 0;
+    transition: opacity 0.3s, border .3s, background-color .3s;
+    user-select: none;
+    padding: 0;
+    border: none;
+    outline: none;
+    border-radius: 0.4em;
+    /* The colors that GitHub uses */
+    border: #1b1f2426 1px solid;
+    background-color: #f6f8fa;
+    color: #57606a;
+}
+
+button.copybtn.success {
+    border-color: #22863a;
+    color: #22863a;
+}
+
+button.copybtn svg {
+    stroke: currentColor;
+    width: 1.5em;
+    height: 1.5em;
+    padding: 0.1em;
+}
+
+div.highlight  {
+    position: relative;
+}
+
+/* Show the copybutton */
+.highlight:hover button.copybtn, button.copybtn.success {
+	opacity: 1;
+}
+
+.highlight button.copybtn:hover {
+    background-color: rgb(235, 235, 235);
+}
+
+.highlight button.copybtn:active {
+    background-color: rgb(187, 187, 187);
+}
+
+/**
+ * A minimal CSS-only tooltip copied from:
+ *   https://codepen.io/mildrenben/pen/rVBrpK
+ *
+ * To use, write HTML like the following:
+ *
+ * <p class="o-tooltip--left" data-tooltip="Hey">Short</p>
+ */
+ .o-tooltip--left {
+  position: relative;
+ }
+
+ .o-tooltip--left:after {
+    opacity: 0;
+    visibility: hidden;
+    position: absolute;
+    content: attr(data-tooltip);
+    padding: .2em;
+    font-size: .8em;
+    left: -.2em;
+    background: grey;
+    color: white;
+    white-space: nowrap;
+    z-index: 2;
+    border-radius: 2px;
+    transform: translateX(-102%) translateY(0);
+    transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1);
+}
+
+.o-tooltip--left:hover:after {
+    display: block;
+    opacity: 1;
+    visibility: visible;
+    transform: translateX(-100%) translateY(0);
+    transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1);
+    transition-delay: .5s;
+}
+
+/* By default the copy button shouldn't show up when printing a page */
+@media print {
+    button.copybtn {
+        display: none;
+    }
+}
diff --git a/_static/copybutton.js b/_static/copybutton.js
new file mode 100644
index 00000000..167d9e9c
--- /dev/null
+++ b/_static/copybutton.js
@@ -0,0 +1,248 @@
+// Localization support
+const messages = {
+  'en': {
+    'copy': 'Copy',
+    'copy_to_clipboard': 'Copy to clipboard',
+    'copy_success': 'Copied!',
+    'copy_failure': 'Failed to copy',
+  },
+  'es' : {
+    'copy': 'Copiar',
+    'copy_to_clipboard': 'Copiar al portapapeles',
+    'copy_success': '¡Copiado!',
+    'copy_failure': 'Error al copiar',
+  },
+  'de' : {
+    'copy': 'Kopieren',
+    'copy_to_clipboard': 'In die Zwischenablage kopieren',
+    'copy_success': 'Kopiert!',
+    'copy_failure': 'Fehler beim Kopieren',
+  },
+  'fr' : {
+    'copy': 'Copier',
+    'copy_to_clipboard': 'Copier dans le presse-papier',
+    'copy_success': 'Copié !',
+    'copy_failure': 'Échec de la copie',
+  },
+  'ru': {
+    'copy': 'Скопировать',
+    'copy_to_clipboard': 'Скопировать в буфер',
+    'copy_success': 'Скопировано!',
+    'copy_failure': 'Не удалось скопировать',
+  },
+  'zh-CN': {
+    'copy': '复制',
+    'copy_to_clipboard': '复制到剪贴板',
+    'copy_success': '复制成功!',
+    'copy_failure': '复制失败',
+  },
+  'it' : {
+    'copy': 'Copiare',
+    'copy_to_clipboard': 'Copiato negli appunti',
+    'copy_success': 'Copiato!',
+    'copy_failure': 'Errore durante la copia',
+  }
+}
+
+let locale = 'en'
+if( document.documentElement.lang !== undefined
+    && messages[document.documentElement.lang] !== undefined ) {
+  locale = document.documentElement.lang
+}
+
+let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT;
+if (doc_url_root == '#') {
+    doc_url_root = '';
+}
+
+/**
+ * SVG files for our copy buttons
+ */
+let iconCheck = `<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-check" width="44" height="44" viewBox="0 0 24 24" stroke-width="2" stroke="#22863a" fill="none" stroke-linecap="round" stroke-linejoin="round">
+  <title>${messages[locale]['copy_success']}</title>
+  <path stroke="none" d="M0 0h24v24H0z" fill="none"/>
+  <path d="M5 12l5 5l10 -10" />
+</svg>`
+
+// If the user specified their own SVG use that, otherwise use the default
+let iconCopy = ``;
+if (!iconCopy) {
+  iconCopy = `<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-copy" width="44" height="44" viewBox="0 0 24 24" stroke-width="1.5" stroke="#000000" fill="none" stroke-linecap="round" stroke-linejoin="round">
+  <title>${messages[locale]['copy_to_clipboard']}</title>
+  <path stroke="none" d="M0 0h24v24H0z" fill="none"/>
+  <rect x="8" y="8" width="12" height="12" rx="2" />
+  <path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2" />
+</svg>`
+}
+
+/**
+ * Set up copy/paste for code blocks
+ */
+
+const runWhenDOMLoaded = cb => {
+  if (document.readyState != 'loading') {
+    cb()
+  } else if (document.addEventListener) {
+    document.addEventListener('DOMContentLoaded', cb)
+  } else {
+    document.attachEvent('onreadystatechange', function() {
+      if (document.readyState == 'complete') cb()
+    })
+  }
+}
+
+const codeCellId = index => `codecell${index}`
+
+// Clears selected text since ClipboardJS will select the text when copying
+const clearSelection = () => {
+  if (window.getSelection) {
+    window.getSelection().removeAllRanges()
+  } else if (document.selection) {
+    document.selection.empty()
+  }
+}
+
+// Changes tooltip text for a moment, then changes it back
+// We want the timeout of our `success` class to be a bit shorter than the
+// tooltip and icon change, so that we can hide the icon before changing back.
+var timeoutIcon = 2000;
+var timeoutSuccessClass = 1500;
+
+const temporarilyChangeTooltip = (el, oldText, newText) => {
+  el.setAttribute('data-tooltip', newText)
+  el.classList.add('success')
+  // Remove success a little bit sooner than we change the tooltip
+  // So that we can use CSS to hide the copybutton first
+  setTimeout(() => el.classList.remove('success'), timeoutSuccessClass)
+  setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon)
+}
+
+// Changes the copy button icon for two seconds, then changes it back
+const temporarilyChangeIcon = (el) => {
+  el.innerHTML = iconCheck;
+  setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon)
+}
+
+const addCopyButtonToCodeCells = () => {
+  // If ClipboardJS hasn't loaded, wait a bit and try again. This
+  // happens because we load ClipboardJS asynchronously.
+  if (window.ClipboardJS === undefined) {
+    setTimeout(addCopyButtonToCodeCells, 250)
+    return
+  }
+
+  // Add copybuttons to all of our code cells
+  const COPYBUTTON_SELECTOR = 'div.highlight pre';
+  const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR)
+  codeCells.forEach((codeCell, index) => {
+    const id = codeCellId(index)
+    codeCell.setAttribute('id', id)
+
+    const clipboardButton = id =>
+    `<button class="copybtn o-tooltip--left" data-tooltip="${messages[locale]['copy']}" data-clipboard-target="#${id}">
+      ${iconCopy}
+    </button>`
+    codeCell.insertAdjacentHTML('afterend', clipboardButton(id))
+  })
+
+function escapeRegExp(string) {
+    return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
+}
+
+/**
+ * Removes excluded text from a Node.
+ *
+ * @param {Node} target Node to filter.
+ * @param {string} exclude CSS selector of nodes to exclude.
+ * @returns {DOMString} Text from `target` with text removed.
+ */
+function filterText(target, exclude) {
+    const clone = target.cloneNode(true);  // clone as to not modify the live DOM
+    if (exclude) {
+        // remove excluded nodes
+        clone.querySelectorAll(exclude).forEach(node => node.remove());
+    }
+    return clone.innerText;
+}
+
+// Callback when a copy button is clicked. Will be passed the node that was clicked
+// should then grab the text and replace pieces of text that shouldn't be used in output
+function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") {
+    var regexp;
+    var match;
+
+    // Do we check for line continuation characters and "HERE-documents"?
+    var useLineCont = !!lineContinuationChar
+    var useHereDoc = !!hereDocDelim
+
+    // create regexp to capture prompt and remaining line
+    if (isRegexp) {
+        regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)')
+    } else {
+        regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)')
+    }
+
+    const outputLines = [];
+    var promptFound = false;
+    var gotLineCont = false;
+    var gotHereDoc = false;
+    const lineGotPrompt = [];
+    for (const line of textContent.split('\n')) {
+        match = line.match(regexp)
+        if (match || gotLineCont || gotHereDoc) {
+            promptFound = regexp.test(line)
+            lineGotPrompt.push(promptFound)
+            if (removePrompts && promptFound) {
+                outputLines.push(match[2])
+            } else {
+                outputLines.push(line)
+            }
+            gotLineCont = line.endsWith(lineContinuationChar) & useLineCont
+            if (line.includes(hereDocDelim) & useHereDoc)
+                gotHereDoc = !gotHereDoc
+        } else if (!onlyCopyPromptLines) {
+            outputLines.push(line)
+        } else if (copyEmptyLines && line.trim() === '') {
+            outputLines.push(line)
+        }
+    }
+
+    // If no lines with the prompt were found then just use original lines
+    if (lineGotPrompt.some(v => v === true)) {
+        textContent = outputLines.join('\n');
+    }
+
+    // Remove a trailing newline to avoid auto-running when pasting
+    if (textContent.endsWith("\n")) {
+        textContent = textContent.slice(0, -1)
+    }
+    return textContent
+}
+
+
+var copyTargetText = (trigger) => {
+  var target = document.querySelector(trigger.attributes['data-clipboard-target'].value);
+
+  // get filtered text
+  let exclude = '.linenos';
+
+  let text = filterText(target, exclude);
+  return formatCopyText(text, '>>> |\\.\\.\\. |\\$ |In \\[\\d*\\]: | {2,5}\\.\\.\\.: ', true, true, true, true, '\\', '')
+}
+
+  // Initialize with a callback so we can modify the text before copy
+  const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText})
+
+  // Update UI with error/success messages
+  clipboard.on('success', event => {
+    clearSelection()
+    temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success'])
+    temporarilyChangeIcon(event.trigger)
+  })
+
+  clipboard.on('error', event => {
+    temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure'])
+  })
+}
+
+runWhenDOMLoaded(addCopyButtonToCodeCells)
\ No newline at end of file
diff --git a/_static/copybutton_funcs.js b/_static/copybutton_funcs.js
new file mode 100644
index 00000000..dbe1aaad
--- /dev/null
+++ b/_static/copybutton_funcs.js
@@ -0,0 +1,73 @@
+function escapeRegExp(string) {
+    return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
+}
+
+/**
+ * Removes excluded text from a Node.
+ *
+ * @param {Node} target Node to filter.
+ * @param {string} exclude CSS selector of nodes to exclude.
+ * @returns {DOMString} Text from `target` with text removed.
+ */
+export function filterText(target, exclude) {
+    const clone = target.cloneNode(true);  // clone as to not modify the live DOM
+    if (exclude) {
+        // remove excluded nodes
+        clone.querySelectorAll(exclude).forEach(node => node.remove());
+    }
+    return clone.innerText;
+}
+
+// Callback when a copy button is clicked. Will be passed the node that was clicked
+// should then grab the text and replace pieces of text that shouldn't be used in output
+export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") {
+    var regexp;
+    var match;
+
+    // Do we check for line continuation characters and "HERE-documents"?
+    var useLineCont = !!lineContinuationChar
+    var useHereDoc = !!hereDocDelim
+
+    // create regexp to capture prompt and remaining line
+    if (isRegexp) {
+        regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)')
+    } else {
+        regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)')
+    }
+
+    const outputLines = [];
+    var promptFound = false;
+    var gotLineCont = false;
+    var gotHereDoc = false;
+    const lineGotPrompt = [];
+    for (const line of textContent.split('\n')) {
+        match = line.match(regexp)
+        if (match || gotLineCont || gotHereDoc) {
+            promptFound = regexp.test(line)
+            lineGotPrompt.push(promptFound)
+            if (removePrompts && promptFound) {
+                outputLines.push(match[2])
+            } else {
+                outputLines.push(line)
+            }
+            gotLineCont = line.endsWith(lineContinuationChar) & useLineCont
+            if (line.includes(hereDocDelim) & useHereDoc)
+                gotHereDoc = !gotHereDoc
+        } else if (!onlyCopyPromptLines) {
+            outputLines.push(line)
+        } else if (copyEmptyLines && line.trim() === '') {
+            outputLines.push(line)
+        }
+    }
+
+    // If no lines with the prompt were found then just use original lines
+    if (lineGotPrompt.some(v => v === true)) {
+        textContent = outputLines.join('\n');
+    }
+
+    // Remove a trailing newline to avoid auto-running when pasting
+    if (textContent.endsWith("\n")) {
+        textContent = textContent.slice(0, -1)
+    }
+    return textContent
+}
diff --git a/_static/design-tabs.js b/_static/design-tabs.js
new file mode 100644
index 00000000..b25bd6a4
--- /dev/null
+++ b/_static/design-tabs.js
@@ -0,0 +1,101 @@
+// @ts-check
+
+// Extra JS capability for selected tabs to be synced
+// The selection is stored in local storage so that it persists across page loads.
+
+/**
+ * @type {Record<string, HTMLElement[]>}
+ */
+let sd_id_to_elements = {};
+const storageKeyPrefix = "sphinx-design-tab-id-";
+
+/**
+ * Create a key for a tab element.
+ * @param {HTMLElement} el - The tab element.
+ * @returns {[string, string, string] | null} - The key.
+ *
+ */
+function create_key(el) {
+  let syncId = el.getAttribute("data-sync-id");
+  let syncGroup = el.getAttribute("data-sync-group");
+  if (!syncId || !syncGroup) return null;
+  return [syncGroup, syncId, syncGroup + "--" + syncId];
+}
+
+/**
+ * Initialize the tab selection.
+ *
+ */
+function ready() {
+  // Find all tabs with sync data
+
+  /** @type {string[]} */
+  let groups = [];
+
+  document.querySelectorAll(".sd-tab-label").forEach((label) => {
+    if (label instanceof HTMLElement) {
+      let data = create_key(label);
+      if (data) {
+        let [group, id, key] = data;
+
+        // add click event listener
+        // @ts-ignore
+        label.onclick = onSDLabelClick;
+
+        // store map of key to elements
+        if (!sd_id_to_elements[key]) {
+          sd_id_to_elements[key] = [];
+        }
+        sd_id_to_elements[key].push(label);
+
+        if (groups.indexOf(group) === -1) {
+          groups.push(group);
+          // Check if a specific tab has been selected via URL parameter
+          const tabParam = new URLSearchParams(window.location.search).get(
+            group
+          );
+          if (tabParam) {
+            console.log(
+              "sphinx-design: Selecting tab id for group '" +
+                group +
+                "' from URL parameter: " +
+                tabParam
+            );
+            window.sessionStorage.setItem(storageKeyPrefix + group, tabParam);
+          }
+        }
+
+        // Check is a specific tab has been selected previously
+        let previousId = window.sessionStorage.getItem(
+          storageKeyPrefix + group
+        );
+        if (previousId === id) {
+          // console.log(
+          //   "sphinx-design: Selecting tab from session storage: " + id
+          // );
+          // @ts-ignore
+          label.previousElementSibling.checked = true;
+        }
+      }
+    }
+  });
+}
+
+/**
+ *  Activate other tabs with the same sync id.
+ *
+ * @this {HTMLElement} - The element that was clicked.
+ */
+function onSDLabelClick() {
+  let data = create_key(this);
+  if (!data) return;
+  let [group, id, key] = data;
+  for (const label of sd_id_to_elements[key]) {
+    if (label === this) continue;
+    // @ts-ignore
+    label.previousElementSibling.checked = true;
+  }
+  window.sessionStorage.setItem(storageKeyPrefix + group, id);
+}
+
+document.addEventListener("DOMContentLoaded", ready, false);
diff --git a/_static/doctools.js b/_static/doctools.js
new file mode 100644
index 00000000..807cdb17
--- /dev/null
+++ b/_static/doctools.js
@@ -0,0 +1,150 @@
+/*
+ * Base JavaScript utilities for all Sphinx HTML documentation.
+ */
+"use strict";
+
+const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([
+  "TEXTAREA",
+  "INPUT",
+  "SELECT",
+  "BUTTON",
+]);
+
+const _ready = (callback) => {
+  if (document.readyState !== "loading") {
+    callback();
+  } else {
+    document.addEventListener("DOMContentLoaded", callback);
+  }
+};
+
+/**
+ * Small JavaScript module for the documentation.
+ */
+const Documentation = {
+  init: () => {
+    Documentation.initDomainIndexTable();
+    Documentation.initOnKeyListeners();
+  },
+
+  /**
+   * i18n support
+   */
+  TRANSLATIONS: {},
+  PLURAL_EXPR: (n) => (n === 1 ? 0 : 1),
+  LOCALE: "unknown",
+
+  // gettext and ngettext don't access this so that the functions
+  // can safely bound to a different name (_ = Documentation.gettext)
+  gettext: (string) => {
+    const translated = Documentation.TRANSLATIONS[string];
+    switch (typeof translated) {
+      case "undefined":
+        return string; // no translation
+      case "string":
+        return translated; // translation exists
+      default:
+        return translated[0]; // (singular, plural) translation tuple exists
+    }
+  },
+
+  ngettext: (singular, plural, n) => {
+    const translated = Documentation.TRANSLATIONS[singular];
+    if (typeof translated !== "undefined")
+      return translated[Documentation.PLURAL_EXPR(n)];
+    return n === 1 ? singular : plural;
+  },
+
+  addTranslations: (catalog) => {
+    Object.assign(Documentation.TRANSLATIONS, catalog.messages);
+    Documentation.PLURAL_EXPR = new Function(
+      "n",
+      `return (${catalog.plural_expr})`,
+    );
+    Documentation.LOCALE = catalog.locale;
+  },
+
+  /**
+   * helper function to focus on search bar
+   */
+  focusSearchBar: () => {
+    document.querySelectorAll("input[name=q]")[0]?.focus();
+  },
+
+  /**
+   * Initialise the domain index toggle buttons
+   */
+  initDomainIndexTable: () => {
+    const toggler = (el) => {
+      const idNumber = el.id.substr(7);
+      const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`);
+      if (el.src.substr(-9) === "minus.png") {
+        el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`;
+        toggledRows.forEach((el) => (el.style.display = "none"));
+      } else {
+        el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`;
+        toggledRows.forEach((el) => (el.style.display = ""));
+      }
+    };
+
+    const togglerElements = document.querySelectorAll("img.toggler");
+    togglerElements.forEach((el) =>
+      el.addEventListener("click", (event) => toggler(event.currentTarget)),
+    );
+    togglerElements.forEach((el) => (el.style.display = ""));
+    if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler);
+  },
+
+  initOnKeyListeners: () => {
+    // only install a listener if it is really needed
+    if (
+      !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS
+      && !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS
+    )
+      return;
+
+    document.addEventListener("keydown", (event) => {
+      // bail for input elements
+      if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName))
+        return;
+      // bail with special keys
+      if (event.altKey || event.ctrlKey || event.metaKey) return;
+
+      if (!event.shiftKey) {
+        switch (event.key) {
+          case "ArrowLeft":
+            if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break;
+
+            const prevLink = document.querySelector('link[rel="prev"]');
+            if (prevLink && prevLink.href) {
+              window.location.href = prevLink.href;
+              event.preventDefault();
+            }
+            break;
+          case "ArrowRight":
+            if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break;
+
+            const nextLink = document.querySelector('link[rel="next"]');
+            if (nextLink && nextLink.href) {
+              window.location.href = nextLink.href;
+              event.preventDefault();
+            }
+            break;
+        }
+      }
+
+      // some keyboard layouts may need Shift to get /
+      switch (event.key) {
+        case "/":
+          if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break;
+          Documentation.focusSearchBar();
+          event.preventDefault();
+      }
+    });
+  },
+};
+
+// quick alias for translations
+const _ = Documentation.gettext;
+
+_ready(Documentation.init);
diff --git a/_static/documentation_options.js b/_static/documentation_options.js
new file mode 100644
index 00000000..7e4c114f
--- /dev/null
+++ b/_static/documentation_options.js
@@ -0,0 +1,13 @@
+const DOCUMENTATION_OPTIONS = {
+    VERSION: '',
+    LANGUAGE: 'en',
+    COLLAPSE_INDEX: false,
+    BUILDER: 'html',
+    FILE_SUFFIX: '.html',
+    LINK_SUFFIX: '.html',
+    HAS_SOURCE: true,
+    SOURCELINK_SUFFIX: '.txt',
+    NAVIGATION_WITH_KEYS: false,
+    SHOW_SEARCH_SUMMARY: true,
+    ENABLE_SEARCH_SHORTCUTS: true,
+};
\ No newline at end of file
diff --git a/_static/english-stemmer.js b/_static/english-stemmer.js
new file mode 100644
index 00000000..056760ee
--- /dev/null
+++ b/_static/english-stemmer.js
@@ -0,0 +1,1066 @@
+// Generated from english.sbl by Snowball 3.0.1 - https://snowballstem.org/
+
+/**@constructor*/
+var EnglishStemmer = function() {
+    var base = new BaseStemmer();
+
+    /** @const */ var a_0 = [
+        ["arsen", -1, -1],
+        ["commun", -1, -1],
+        ["emerg", -1, -1],
+        ["gener", -1, -1],
+        ["later", -1, -1],
+        ["organ", -1, -1],
+        ["past", -1, -1],
+        ["univers", -1, -1]
+    ];
+
+    /** @const */ var a_1 = [
+        ["'", -1, 1],
+        ["'s'", 0, 1],
+        ["'s", -1, 1]
+    ];
+
+    /** @const */ var a_2 = [
+        ["ied", -1, 2],
+        ["s", -1, 3],
+        ["ies", 1, 2],
+        ["sses", 1, 1],
+        ["ss", 1, -1],
+        ["us", 1, -1]
+    ];
+
+    /** @const */ var a_3 = [
+        ["succ", -1, 1],
+        ["proc", -1, 1],
+        ["exc", -1, 1]
+    ];
+
+    /** @const */ var a_4 = [
+        ["even", -1, 2],
+        ["cann", -1, 2],
+        ["inn", -1, 2],
+        ["earr", -1, 2],
+        ["herr", -1, 2],
+        ["out", -1, 2],
+        ["y", -1, 1]
+    ];
+
... 366313 lines suppressed ...