You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iceberg.apache.org by gi...@apache.org on 2025/03/21 02:02:26 UTC
(iceberg-rust) branch gh-pages updated: deploy: eaa36e672838b95fb3f27e255e4184d92dc873ac
This is an automated email from the ASF dual-hosted git repository.
github-bot pushed a commit to branch gh-pages
in repository https://gitbox.apache.org/repos/asf/iceberg-rust.git
The following commit(s) were added to refs/heads/gh-pages by this push:
new 88e32c18 deploy: eaa36e672838b95fb3f27e255e4184d92dc873ac
88e32c18 is described below
commit 88e32c18f37733c7239cb349e071b2a7b161a86d
Author: liurenjie1024 <li...@users.noreply.github.com>
AuthorDate: Fri Mar 21 02:02:21 2025 +0000
deploy: eaa36e672838b95fb3f27e255e4184d92dc873ac
---
api/iceberg/spec/enum.DataContentType.html | 10 +-
api/iceberg/spec/enum.DataFileBuilderError.html | 4 +-
api/iceberg/spec/enum.DataFileFormat.html | 14 +-
api/iceberg/spec/enum.ManifestStatus.html | 6 +-
api/iceberg/spec/fn.read_data_files_from_avro.html | 2 +-
api/iceberg/spec/fn.write_data_files_to_avro.html | 2 +-
.../manifest/data_file/enum.DataContentType.html | 11 +
.../data_file/enum.DataFileBuilderError.html | 11 +
.../manifest/data_file/enum.DataFileFormat.html | 11 +
.../data_file/fn.read_data_files_from_avro.html | 11 +
.../data_file/fn.write_data_files_to_avro.html | 11 +
.../spec/manifest/data_file/struct.DataFile.html | 11 +
.../manifest/data_file/struct.DataFileBuilder.html | 11 +
.../spec/manifest/entry/enum.ManifestStatus.html | 11 +
.../spec/manifest/entry/struct.ManifestEntry.html | 11 +
.../spec/manifest/entry/type.ManifestEntryRef.html | 11 +
.../spec/manifest/enum.DataContentType.html | 11 -
.../spec/manifest/enum.DataFileBuilderError.html | 11 -
api/iceberg/spec/manifest/enum.DataFileFormat.html | 11 -
api/iceberg/spec/manifest/enum.ManifestStatus.html | 11 -
.../manifest/fn.read_data_files_from_avro.html | 11 -
.../spec/manifest/fn.write_data_files_to_avro.html | 11 -
.../manifest/metadata/struct.ManifestMetadata.html | 11 +
api/iceberg/spec/manifest/struct.DataFile.html | 11 -
.../spec/manifest/struct.DataFileBuilder.html | 11 -
.../spec/manifest/struct.ManifestEntry.html | 11 -
.../spec/manifest/struct.ManifestMetadata.html | 11 -
.../spec/manifest/struct.ManifestWriter.html | 11 -
.../manifest/struct.ManifestWriterBuilder.html | 11 -
.../spec/manifest/type.ManifestEntryRef.html | 11 -
.../manifest/writer/struct.ManifestWriter.html | 11 +
.../writer/struct.ManifestWriterBuilder.html | 11 +
api/iceberg/spec/struct.DataFile.html | 38 +-
api/iceberg/spec/struct.DataFileBuilder.html | 40 +-
api/iceberg/spec/struct.Manifest.html | 14 +-
api/iceberg/spec/struct.ManifestEntry.html | 47 +-
api/iceberg/spec/struct.ManifestMetadata.html | 32 +-
api/iceberg/spec/struct.ManifestWriter.html | 10 +-
api/iceberg/spec/struct.ManifestWriterBuilder.html | 10 +-
api/iceberg/spec/type.ManifestEntryRef.html | 4 +-
api/search-index.js | 2 +-
api/search.desc/iceberg/iceberg-desc-0-.js | 2 +-
api/src-files.js | 2 +-
api/src/iceberg/spec/manifest.rs.html | 5909 --------------------
api/src/iceberg/spec/manifest/_serde.rs.html | 771 +++
api/src/iceberg/spec/manifest/data_file.rs.html | 705 +++
api/src/iceberg/spec/manifest/entry.rs.html | 1127 ++++
api/src/iceberg/spec/manifest/metadata.rs.html | 319 ++
api/src/iceberg/spec/manifest/mod.rs.html | 1995 +++++++
api/src/iceberg/spec/manifest/writer.rs.html | 1261 +++++
api/trait.impl/core/marker/trait.Freeze.js | 2 +-
api/trait.impl/core/marker/trait.Send.js | 2 +-
api/trait.impl/core/marker/trait.Sync.js | 2 +-
api/trait.impl/core/marker/trait.Unpin.js | 2 +-
.../core/panic/unwind_safe/trait.RefUnwindSafe.js | 2 +-
.../core/panic/unwind_safe/trait.UnwindSafe.js | 2 +-
api/type.impl/alloc/sync/struct.Arc.js | 2 +-
57 files changed, 6463 insertions(+), 6163 deletions(-)
diff --git a/api/iceberg/spec/enum.DataContentType.html b/api/iceberg/spec/enum.DataContentType.html
index e137087d..ab14f569 100644
--- a/api/iceberg/spec/enum.DataContentType.html
+++ b/api/iceberg/spec/enum.DataContentType.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Type of content stored by the data file: data, equality deletes, or position deletes (all v1 files are data files)"><title>DataContentType in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98 [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Type of content stored by the data file: data, equality deletes, or position deletes (all v1 files are data files)"><title>DataContentType in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98 [...]
Data = 0,
PositionDeletes = 1,
EqualityDeletes = 2,
@@ -7,11 +7,11 @@ position deletes (all v1 files are data files)</p>
</div></details><h2 id="variants" class="variants section-header">Variants<a href="#variants" class="anchor">§</a></h2><div class="variants"><section id="variant.Data" class="variant"><a href="#variant.Data" class="anchor">§</a><h3 class="code-header">Data = 0</h3></section><div class="docblock"><p>value: 0</p>
</div><section id="variant.PositionDeletes" class="variant"><a href="#variant.PositionDeletes" class="anchor">§</a><h3 class="code-header">PositionDeletes = 1</h3></section><div class="docblock"><p>value: 1</p>
</div><section id="variant.EqualityDeletes" class="variant"><a href="#variant.EqualityDeletes" class="anchor">§</a><h3 class="code-header">EqualityDeletes = 2</h3></section><div class="docblock"><p>value: 2</p>
-</div></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-DataContentType" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1506">source</a><a href="#impl-Clone-for-DataContentType" class="anchor">§</a><h3 class="code-header">impl <a class="trait" [...]
- __D: <a class="trait" href="https://docs.rs/serde/1.0.217/serde/de/trait.Deserializer.html" title="trait serde::de::Deserializer">Deserializer</a><'de>,</div></h4></section></summary><div class='docblock'>Deserialize this value from the given Serde deserializer. <a href="https://docs.rs/serde/1.0.217/serde/de/trait.Deserialize.html#tymethod.deserialize">Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Parti [...]
+</div></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-DataContentType" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#291">source</a><a href="#impl-Clone-for-DataContentType" class="anchor">§</a><h3 class="code-header">impl <a clas [...]
+ __D: <a class="trait" href="https://docs.rs/serde/1.0.217/serde/de/trait.Deserializer.html" title="trait serde::de::Deserializer">Deserializer</a><'de>,</div></h4></section></summary><div class='docblock'>Deserialize this value from the given Serde deserializer. <a href="https://docs.rs/serde/1.0.217/serde/de/trait.Deserialize.html#tymethod.deserialize">Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Parti [...]
by <code>==</code>.</div></details><details class="toggle method-toggle" open><summary><section id="method.ne" class="method trait-impl"><span class="rightside"><span class="since" title="Stable since Rust version 1.0.0">1.0.0</span> · <a class="src" href="https://doc.rust-lang.org/nightly/src/core/cmp.rs.html#263">source</a></span><a href="#method.ne" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html#method.ne" class= [...]
-sufficient, and should not be overridden without very good reason.</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Serialize-for-DataContentType" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1506">source</a><a href="#impl-Serialize-for-DataContentType" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://docs.rs/serde/1.0.217/serde/ser/trait.Serialize.html" title=" [...]
- __S: <a class="trait" href="https://docs.rs/serde/1.0.217/serde/ser/trait.Serializer.html" title="trait serde::ser::Serializer">Serializer</a>,</div></h4></section></summary><div class='docblock'>Serialize this value into the given Serde serializer. <a href="https://docs.rs/serde/1.0.217/serde/ser/trait.Serialize.html#tymethod.serialize">Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-TryFrom%3Ci32%3E-for-DataCo [...]
+sufficient, and should not be overridden without very good reason.</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Serialize-for-DataContentType" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#291">source</a><a href="#impl-Serialize-for-DataContentType" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://docs.rs/serde/1.0.217/serde/ser/trait.Serialize.html [...]
+ __S: <a class="trait" href="https://docs.rs/serde/1.0.217/serde/ser/trait.Serializer.html" title="trait serde::ser::Serializer">Serializer</a>,</div></h4></section></summary><div class='docblock'>Serialize this value into the given Serde serializer. <a href="https://docs.rs/serde/1.0.217/serde/ser/trait.Serialize.html#tymethod.serialize">Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-TryFrom%3Ci32%3E-for-DataCo [...]
T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#141">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="https:/ [...]
T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a href= [...]
diff --git a/api/iceberg/spec/enum.DataFileBuilderError.html b/api/iceberg/spec/enum.DataFileBuilderError.html
index e0ab95fa..c4cbc7af 100644
--- a/api/iceberg/spec/enum.DataFileBuilderError.html
+++ b/api/iceberg/spec/enum.DataFileBuilderError.html
@@ -1,10 +1,10 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Error type for DataFileBuilder"><title>DataFileBuilderError in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff2,FiraSans-Medium-8 [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Error type for DataFileBuilder"><title>DataFileBuilderError in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff2,FiraSans-Medium-8 [...]
UninitializedField(&'static <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.str.html">str</a>),
ValidationError(<a class="struct" href="https://doc.rust-lang.org/nightly/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>),
}</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Error type for DataFileBuilder</p>
</div></details><h2 id="variants" class="variants section-header">Variants (Non-exhaustive)<a href="#variants" class="anchor">§</a></h2><details class="toggle non-exhaustive"><summary class="hideme"><span>This enum is marked as non-exhaustive</span></summary><div class="docblock">Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.</di [...]
</div><section id="variant.ValidationError" class="variant"><a href="#variant.ValidationError" class="anchor">§</a><h3 class="code-header">ValidationError(<a class="struct" href="https://doc.rust-lang.org/nightly/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>)</h3></section><div class="docblock"><p>Custom validation error</p>
-</div></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Debug-for-DataFileBuilderError" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1248">source</a><a href="#impl-Debug-for-DataFileBuilderError" class="anchor">§</a><h3 class="code-header">impl <a cla [...]
+</div></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Debug-for-DataFileBuilderError" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#33">source</a><a href="#impl-Debug-for-DataFileBuilderError" class="anchor">§</a><h3 class="code-header">imp [...]
T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#141">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
T: <a class="trait" href="https://doc.rust-lang.org/nightly/core/error/trait.Error.html" title="trait core::error::Error">Error</a> + 'static,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.as_error_source" class="method trait-impl"><a href="#method.as_error_source" class="anchor">§</a><h4 class="code-header">fn <a class="fn">as_error_source</a>(&self) -> &(dyn <a class="trait" href="https://doc [...]
to benefit from Rust’s automatic dereferencing of method
diff --git a/api/iceberg/spec/enum.DataFileFormat.html b/api/iceberg/spec/enum.DataFileFormat.html
index d8b78740..9cc6c228 100644
--- a/api/iceberg/spec/enum.DataFileFormat.html
+++ b/api/iceberg/spec/enum.DataFileFormat.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Format of this data."><title>DataFileFormat in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff2,FiraSans-Medium-8f9a781e4970d388. [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Format of this data."><title>DataFileFormat in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff2,FiraSans-Medium-8f9a781e4970d388. [...]
Avro,
Orc,
Parquet,
@@ -6,14 +6,14 @@
</div></details><h2 id="variants" class="variants section-header">Variants<a href="#variants" class="anchor">§</a></h2><div class="variants"><section id="variant.Avro" class="variant"><a href="#variant.Avro" class="anchor">§</a><h3 class="code-header">Avro</h3></section><div class="docblock"><p>Avro file format: <a href="https://avro.apache.org/">https://avro.apache.org/</a></p>
</div><section id="variant.Orc" class="variant"><a href="#variant.Orc" class="anchor">§</a><h3 class="code-header">Orc</h3></section><div class="docblock"><p>Orc file format: <a href="https://orc.apache.org/">https://orc.apache.org/</a></p>
</div><section id="variant.Parquet" class="variant"><a href="#variant.Parquet" class="anchor">§</a><h3 class="code-header">Parquet</h3></section><div class="docblock"><p>Parquet file format: <a href="https://parquet.apache.org/">https://parquet.apache.org/</a></p>
-</div></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-DataFileFormat" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1533">source</a><a href="#impl-Clone-for-DataFileFormat" class="anchor">§</a><h3 class="code-header">impl <a class="trait" h [...]
+</div></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-DataFileFormat" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#318">source</a><a href="#impl-Clone-for-DataFileFormat" class="anchor">§</a><h3 class="code-header">impl <a class= [...]
Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/str/traits/trait.FromStr.html" title="trait core::str::traits::FromStr">FromStr</a>,
- <Self as <a class="trait" href="https://doc.rust-lang.org/nightly/core/str/traits/trait.FromStr.html" title="trait core::str::traits::FromStr">FromStr</a>>::<a class="associatedtype" href="https://doc.rust-lang.org/nightly/core/str/traits/trait.FromStr.html#associatedtype.Err" title="type core::str::traits::FromStr::Err">Err</a>: <a class="trait" href="https://doc.rust-lang.org/nightly/core/fmt/trait.Display.html" title="trait core::fmt::Display">Display</a>,</div></h3></sectio [...]
- __D: <a class="trait" href="https://docs.rs/serde/1.0.217/serde/de/trait.Deserializer.html" title="trait serde::de::Deserializer">Deserializer</a><'de>,</div></h4></section></summary><div class='docblock'>Deserialize this value from the given Serde deserializer. <a href="https://docs.rs/serde/1.0.217/serde/de/trait.Deserialize.html#tymethod.deserialize">Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Displ [...]
+ <Self as <a class="trait" href="https://doc.rust-lang.org/nightly/core/str/traits/trait.FromStr.html" title="trait core::str::traits::FromStr">FromStr</a>>::<a class="associatedtype" href="https://doc.rust-lang.org/nightly/core/str/traits/trait.FromStr.html#associatedtype.Err" title="type core::str::traits::FromStr::Err">Err</a>: <a class="trait" href="https://doc.rust-lang.org/nightly/core/fmt/trait.Display.html" title="trait core::fmt::Display">Display</a>,</div></h3></sectio [...]
+ __D: <a class="trait" href="https://docs.rs/serde/1.0.217/serde/de/trait.Deserializer.html" title="trait serde::de::Deserializer">Deserializer</a><'de>,</div></h4></section></summary><div class='docblock'>Deserialize this value from the given Serde deserializer. <a href="https://docs.rs/serde/1.0.217/serde/de/trait.Deserialize.html#tymethod.deserialize">Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Displ [...]
by <code>==</code>.</div></details><details class="toggle method-toggle" open><summary><section id="method.ne" class="method trait-impl"><span class="rightside"><span class="since" title="Stable since Rust version 1.0.0">1.0.0</span> · <a class="src" href="https://doc.rust-lang.org/nightly/src/core/cmp.rs.html#263">source</a></span><a href="#method.ne" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html#method.ne" class= [...]
-sufficient, and should not be overridden without very good reason.</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Serialize-for-DataFileFormat" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1533">source</a><a href="#impl-Serialize-for-DataFileFormat" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://docs.rs/serde/1.0.217/serde/ser/trait.Serialize.html" title="tr [...]
- Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/fmt/trait.Display.html" title="trait core::fmt::Display">Display</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.serialize" class="method trait-impl"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1533">source</a><a href="#method.serialize" class="anchor">§</a><h4 class="code-header">fn <a href="https://docs.rs/ [...]
- __S: <a class="trait" href="https://docs.rs/serde/1.0.217/serde/ser/trait.Serializer.html" title="trait serde::ser::Serializer">Serializer</a>,</div></h4></section></summary><div class='docblock'>Serialize this value into the given Serde serializer. <a href="https://docs.rs/serde/1.0.217/serde/ser/trait.Serialize.html#tymethod.serialize">Read more</a></div></details></div></details><section id="impl-Copy-for-DataFileFormat" class="impl"><a class="src rightside" href="../../src/iceber [...]
+sufficient, and should not be overridden without very good reason.</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Serialize-for-DataFileFormat" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#318">source</a><a href="#impl-Serialize-for-DataFileFormat" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://docs.rs/serde/1.0.217/serde/ser/trait.Serialize.html" [...]
+ Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/fmt/trait.Display.html" title="trait core::fmt::Display">Display</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.serialize" class="method trait-impl"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#318">source</a><a href="#method.serialize" class="anchor">§</a><h4 class="code-header">fn <a href="https:/ [...]
+ __S: <a class="trait" href="https://docs.rs/serde/1.0.217/serde/ser/trait.Serializer.html" title="trait serde::ser::Serializer">Serializer</a>,</div></h4></section></summary><div class='docblock'>Serialize this value into the given Serde serializer. <a href="https://docs.rs/serde/1.0.217/serde/ser/trait.Serialize.html#tymethod.serialize">Read more</a></div></details></div></details><section id="impl-Copy-for-DataFileFormat" class="impl"><a class="src rightside" href="../../src/iceber [...]
T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#141">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="https:/ [...]
T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a href= [...]
diff --git a/api/iceberg/spec/enum.ManifestStatus.html b/api/iceberg/spec/enum.ManifestStatus.html
index 491144ca..83d80537 100644
--- a/api/iceberg/spec/enum.ManifestStatus.html
+++ b/api/iceberg/spec/enum.ManifestStatus.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Used to track additions and deletions in ManifestEntry."><title>ManifestStatus in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Used to track additions and deletions in ManifestEntry."><title>ManifestStatus in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff [...]
Existing = 0,
Added = 1,
Deleted = 2,
@@ -7,9 +7,9 @@
</div><section id="variant.Added" class="variant"><a href="#variant.Added" class="anchor">§</a><h3 class="code-header">Added = 1</h3></section><div class="docblock"><p>Value: 1</p>
</div><section id="variant.Deleted" class="variant"><a href="#variant.Deleted" class="anchor">§</a><h3 class="code-header">Deleted = 2</h3></section><div class="docblock"><p>Value: 2</p>
<p>Deletes are informational only and not used in scans.</p>
-</div></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-ManifestStatus" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1219">source</a><a href="#impl-Clone-for-ManifestStatus" class="anchor">§</a><h3 class="code-header">impl <a class="trait" h [...]
+</div></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-ManifestStatus" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest/entry.rs.html#153">source</a><a href="#impl-Clone-for-ManifestStatus" class="anchor">§</a><h3 class="code-header">impl <a class="tra [...]
by <code>==</code>.</div></details><details class="toggle method-toggle" open><summary><section id="method.ne" class="method trait-impl"><span class="rightside"><span class="since" title="Stable since Rust version 1.0.0">1.0.0</span> · <a class="src" href="https://doc.rust-lang.org/nightly/src/core/cmp.rs.html#263">source</a></span><a href="#method.ne" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html#method.ne" class= [...]
-sufficient, and should not be overridden without very good reason.</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-TryFrom%3Ci32%3E-for-ManifestStatus" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1231-1245">source</a><a href="#impl-TryFrom%3Ci32%3E-for-ManifestStatus" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait [...]
+sufficient, and should not be overridden without very good reason.</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-TryFrom%3Ci32%3E-for-ManifestStatus" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest/entry.rs.html#165-179">source</a><a href="#impl-TryFrom%3Ci32%3E-for-ManifestStatus" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/t [...]
T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#141">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="https:/ [...]
T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a href= [...]
diff --git a/api/iceberg/spec/fn.read_data_files_from_avro.html b/api/iceberg/spec/fn.read_data_files_from_avro.html
index fb64a593..a0f838f7 100644
--- a/api/iceberg/spec/fn.read_data_files_from_avro.html
+++ b/api/iceberg/spec/fn.read_data_files_from_avro.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Parse data files from avro bytes."><title>read_data_files_from_avro in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff2,FiraSans- [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Parse data files from avro bytes."><title>read_data_files_from_avro in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff2,FiraSans- [...]
reader: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&mut R</a>,
schema: &<a class="struct" href="struct.Schema.html" title="struct iceberg::spec::Schema">Schema</a>,
partition_spec_id: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i32.html">i32</a>,
diff --git a/api/iceberg/spec/fn.write_data_files_to_avro.html b/api/iceberg/spec/fn.write_data_files_to_avro.html
index 095bbccb..7762a89f 100644
--- a/api/iceberg/spec/fn.write_data_files_to_avro.html
+++ b/api/iceberg/spec/fn.write_data_files_to_avro.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Convert data files to avro bytes and write to writer. Return the bytes written."><title>write_data_files_to_avro in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,Fira [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Convert data files to avro bytes and write to writer. Return the bytes written."><title>write_data_files_to_avro in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,Fira [...]
writer: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&mut W</a>,
data_files: impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/iter/traits/collect/trait.IntoIterator.html" title="trait core::iter::traits::collect::IntoIterator">IntoIterator</a><Item = <a class="struct" href="struct.DataFile.html" title="struct iceberg::spec::DataFile">DataFile</a>>,
partition_type: &<a class="struct" href="struct.StructType.html" title="struct iceberg::spec::StructType">StructType</a>,
diff --git a/api/iceberg/spec/manifest/data_file/enum.DataContentType.html b/api/iceberg/spec/manifest/data_file/enum.DataContentType.html
new file mode 100644
index 00000000..0d4f620c
--- /dev/null
+++ b/api/iceberg/spec/manifest/data_file/enum.DataContentType.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta http-equiv="refresh" content="0;URL=../../../../iceberg/spec/enum.DataContentType.html">
+ <title>Redirection</title>
+</head>
+<body>
+ <p>Redirecting to <a href="../../../../iceberg/spec/enum.DataContentType.html">../../../../iceberg/spec/enum.DataContentType.html</a>...</p>
+ <script>location.replace("../../../../iceberg/spec/enum.DataContentType.html" + location.search + location.hash);</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/api/iceberg/spec/manifest/data_file/enum.DataFileBuilderError.html b/api/iceberg/spec/manifest/data_file/enum.DataFileBuilderError.html
new file mode 100644
index 00000000..b671f138
--- /dev/null
+++ b/api/iceberg/spec/manifest/data_file/enum.DataFileBuilderError.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta http-equiv="refresh" content="0;URL=../../../../iceberg/spec/enum.DataFileBuilderError.html">
+ <title>Redirection</title>
+</head>
+<body>
+ <p>Redirecting to <a href="../../../../iceberg/spec/enum.DataFileBuilderError.html">../../../../iceberg/spec/enum.DataFileBuilderError.html</a>...</p>
+ <script>location.replace("../../../../iceberg/spec/enum.DataFileBuilderError.html" + location.search + location.hash);</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/api/iceberg/spec/manifest/data_file/enum.DataFileFormat.html b/api/iceberg/spec/manifest/data_file/enum.DataFileFormat.html
new file mode 100644
index 00000000..f38cbc9f
--- /dev/null
+++ b/api/iceberg/spec/manifest/data_file/enum.DataFileFormat.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta http-equiv="refresh" content="0;URL=../../../../iceberg/spec/enum.DataFileFormat.html">
+ <title>Redirection</title>
+</head>
+<body>
+ <p>Redirecting to <a href="../../../../iceberg/spec/enum.DataFileFormat.html">../../../../iceberg/spec/enum.DataFileFormat.html</a>...</p>
+ <script>location.replace("../../../../iceberg/spec/enum.DataFileFormat.html" + location.search + location.hash);</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/api/iceberg/spec/manifest/data_file/fn.read_data_files_from_avro.html b/api/iceberg/spec/manifest/data_file/fn.read_data_files_from_avro.html
new file mode 100644
index 00000000..1fdb5774
--- /dev/null
+++ b/api/iceberg/spec/manifest/data_file/fn.read_data_files_from_avro.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta http-equiv="refresh" content="0;URL=../../../../iceberg/spec/fn.read_data_files_from_avro.html">
+ <title>Redirection</title>
+</head>
+<body>
+ <p>Redirecting to <a href="../../../../iceberg/spec/fn.read_data_files_from_avro.html">../../../../iceberg/spec/fn.read_data_files_from_avro.html</a>...</p>
+ <script>location.replace("../../../../iceberg/spec/fn.read_data_files_from_avro.html" + location.search + location.hash);</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/api/iceberg/spec/manifest/data_file/fn.write_data_files_to_avro.html b/api/iceberg/spec/manifest/data_file/fn.write_data_files_to_avro.html
new file mode 100644
index 00000000..827a3826
--- /dev/null
+++ b/api/iceberg/spec/manifest/data_file/fn.write_data_files_to_avro.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta http-equiv="refresh" content="0;URL=../../../../iceberg/spec/fn.write_data_files_to_avro.html">
+ <title>Redirection</title>
+</head>
+<body>
+ <p>Redirecting to <a href="../../../../iceberg/spec/fn.write_data_files_to_avro.html">../../../../iceberg/spec/fn.write_data_files_to_avro.html</a>...</p>
+ <script>location.replace("../../../../iceberg/spec/fn.write_data_files_to_avro.html" + location.search + location.hash);</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/api/iceberg/spec/manifest/data_file/struct.DataFile.html b/api/iceberg/spec/manifest/data_file/struct.DataFile.html
new file mode 100644
index 00000000..2692d5a5
--- /dev/null
+++ b/api/iceberg/spec/manifest/data_file/struct.DataFile.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta http-equiv="refresh" content="0;URL=../../../../iceberg/spec/struct.DataFile.html">
+ <title>Redirection</title>
+</head>
+<body>
+ <p>Redirecting to <a href="../../../../iceberg/spec/struct.DataFile.html">../../../../iceberg/spec/struct.DataFile.html</a>...</p>
+ <script>location.replace("../../../../iceberg/spec/struct.DataFile.html" + location.search + location.hash);</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/api/iceberg/spec/manifest/data_file/struct.DataFileBuilder.html b/api/iceberg/spec/manifest/data_file/struct.DataFileBuilder.html
new file mode 100644
index 00000000..67be1ac9
--- /dev/null
+++ b/api/iceberg/spec/manifest/data_file/struct.DataFileBuilder.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta http-equiv="refresh" content="0;URL=../../../../iceberg/spec/struct.DataFileBuilder.html">
+ <title>Redirection</title>
+</head>
+<body>
+ <p>Redirecting to <a href="../../../../iceberg/spec/struct.DataFileBuilder.html">../../../../iceberg/spec/struct.DataFileBuilder.html</a>...</p>
+ <script>location.replace("../../../../iceberg/spec/struct.DataFileBuilder.html" + location.search + location.hash);</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/api/iceberg/spec/manifest/entry/enum.ManifestStatus.html b/api/iceberg/spec/manifest/entry/enum.ManifestStatus.html
new file mode 100644
index 00000000..b501ef6d
--- /dev/null
+++ b/api/iceberg/spec/manifest/entry/enum.ManifestStatus.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta http-equiv="refresh" content="0;URL=../../../../iceberg/spec/enum.ManifestStatus.html">
+ <title>Redirection</title>
+</head>
+<body>
+ <p>Redirecting to <a href="../../../../iceberg/spec/enum.ManifestStatus.html">../../../../iceberg/spec/enum.ManifestStatus.html</a>...</p>
+ <script>location.replace("../../../../iceberg/spec/enum.ManifestStatus.html" + location.search + location.hash);</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/api/iceberg/spec/manifest/entry/struct.ManifestEntry.html b/api/iceberg/spec/manifest/entry/struct.ManifestEntry.html
new file mode 100644
index 00000000..183542d6
--- /dev/null
+++ b/api/iceberg/spec/manifest/entry/struct.ManifestEntry.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta http-equiv="refresh" content="0;URL=../../../../iceberg/spec/struct.ManifestEntry.html">
+ <title>Redirection</title>
+</head>
+<body>
+ <p>Redirecting to <a href="../../../../iceberg/spec/struct.ManifestEntry.html">../../../../iceberg/spec/struct.ManifestEntry.html</a>...</p>
+ <script>location.replace("../../../../iceberg/spec/struct.ManifestEntry.html" + location.search + location.hash);</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/api/iceberg/spec/manifest/entry/type.ManifestEntryRef.html b/api/iceberg/spec/manifest/entry/type.ManifestEntryRef.html
new file mode 100644
index 00000000..e091162c
--- /dev/null
+++ b/api/iceberg/spec/manifest/entry/type.ManifestEntryRef.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta http-equiv="refresh" content="0;URL=../../../../iceberg/spec/type.ManifestEntryRef.html">
+ <title>Redirection</title>
+</head>
+<body>
+ <p>Redirecting to <a href="../../../../iceberg/spec/type.ManifestEntryRef.html">../../../../iceberg/spec/type.ManifestEntryRef.html</a>...</p>
+ <script>location.replace("../../../../iceberg/spec/type.ManifestEntryRef.html" + location.search + location.hash);</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/api/iceberg/spec/manifest/enum.DataContentType.html b/api/iceberg/spec/manifest/enum.DataContentType.html
deleted file mode 100644
index 27d2106f..00000000
--- a/api/iceberg/spec/manifest/enum.DataContentType.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta http-equiv="refresh" content="0;URL=../../../iceberg/spec/enum.DataContentType.html">
- <title>Redirection</title>
-</head>
-<body>
- <p>Redirecting to <a href="../../../iceberg/spec/enum.DataContentType.html">../../../iceberg/spec/enum.DataContentType.html</a>...</p>
- <script>location.replace("../../../iceberg/spec/enum.DataContentType.html" + location.search + location.hash);</script>
-</body>
-</html>
\ No newline at end of file
diff --git a/api/iceberg/spec/manifest/enum.DataFileBuilderError.html b/api/iceberg/spec/manifest/enum.DataFileBuilderError.html
deleted file mode 100644
index 91359279..00000000
--- a/api/iceberg/spec/manifest/enum.DataFileBuilderError.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta http-equiv="refresh" content="0;URL=../../../iceberg/spec/enum.DataFileBuilderError.html">
- <title>Redirection</title>
-</head>
-<body>
- <p>Redirecting to <a href="../../../iceberg/spec/enum.DataFileBuilderError.html">../../../iceberg/spec/enum.DataFileBuilderError.html</a>...</p>
- <script>location.replace("../../../iceberg/spec/enum.DataFileBuilderError.html" + location.search + location.hash);</script>
-</body>
-</html>
\ No newline at end of file
diff --git a/api/iceberg/spec/manifest/enum.DataFileFormat.html b/api/iceberg/spec/manifest/enum.DataFileFormat.html
deleted file mode 100644
index e5fa4cf2..00000000
--- a/api/iceberg/spec/manifest/enum.DataFileFormat.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta http-equiv="refresh" content="0;URL=../../../iceberg/spec/enum.DataFileFormat.html">
- <title>Redirection</title>
-</head>
-<body>
- <p>Redirecting to <a href="../../../iceberg/spec/enum.DataFileFormat.html">../../../iceberg/spec/enum.DataFileFormat.html</a>...</p>
- <script>location.replace("../../../iceberg/spec/enum.DataFileFormat.html" + location.search + location.hash);</script>
-</body>
-</html>
\ No newline at end of file
diff --git a/api/iceberg/spec/manifest/enum.ManifestStatus.html b/api/iceberg/spec/manifest/enum.ManifestStatus.html
deleted file mode 100644
index b7f26a3d..00000000
--- a/api/iceberg/spec/manifest/enum.ManifestStatus.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta http-equiv="refresh" content="0;URL=../../../iceberg/spec/enum.ManifestStatus.html">
- <title>Redirection</title>
-</head>
-<body>
- <p>Redirecting to <a href="../../../iceberg/spec/enum.ManifestStatus.html">../../../iceberg/spec/enum.ManifestStatus.html</a>...</p>
- <script>location.replace("../../../iceberg/spec/enum.ManifestStatus.html" + location.search + location.hash);</script>
-</body>
-</html>
\ No newline at end of file
diff --git a/api/iceberg/spec/manifest/fn.read_data_files_from_avro.html b/api/iceberg/spec/manifest/fn.read_data_files_from_avro.html
deleted file mode 100644
index edad2295..00000000
--- a/api/iceberg/spec/manifest/fn.read_data_files_from_avro.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta http-equiv="refresh" content="0;URL=../../../iceberg/spec/fn.read_data_files_from_avro.html">
- <title>Redirection</title>
-</head>
-<body>
- <p>Redirecting to <a href="../../../iceberg/spec/fn.read_data_files_from_avro.html">../../../iceberg/spec/fn.read_data_files_from_avro.html</a>...</p>
- <script>location.replace("../../../iceberg/spec/fn.read_data_files_from_avro.html" + location.search + location.hash);</script>
-</body>
-</html>
\ No newline at end of file
diff --git a/api/iceberg/spec/manifest/fn.write_data_files_to_avro.html b/api/iceberg/spec/manifest/fn.write_data_files_to_avro.html
deleted file mode 100644
index 9c2eaf35..00000000
--- a/api/iceberg/spec/manifest/fn.write_data_files_to_avro.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta http-equiv="refresh" content="0;URL=../../../iceberg/spec/fn.write_data_files_to_avro.html">
- <title>Redirection</title>
-</head>
-<body>
- <p>Redirecting to <a href="../../../iceberg/spec/fn.write_data_files_to_avro.html">../../../iceberg/spec/fn.write_data_files_to_avro.html</a>...</p>
- <script>location.replace("../../../iceberg/spec/fn.write_data_files_to_avro.html" + location.search + location.hash);</script>
-</body>
-</html>
\ No newline at end of file
diff --git a/api/iceberg/spec/manifest/metadata/struct.ManifestMetadata.html b/api/iceberg/spec/manifest/metadata/struct.ManifestMetadata.html
new file mode 100644
index 00000000..2db789b5
--- /dev/null
+++ b/api/iceberg/spec/manifest/metadata/struct.ManifestMetadata.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta http-equiv="refresh" content="0;URL=../../../../iceberg/spec/struct.ManifestMetadata.html">
+ <title>Redirection</title>
+</head>
+<body>
+ <p>Redirecting to <a href="../../../../iceberg/spec/struct.ManifestMetadata.html">../../../../iceberg/spec/struct.ManifestMetadata.html</a>...</p>
+ <script>location.replace("../../../../iceberg/spec/struct.ManifestMetadata.html" + location.search + location.hash);</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/api/iceberg/spec/manifest/struct.DataFile.html b/api/iceberg/spec/manifest/struct.DataFile.html
deleted file mode 100644
index a26d1761..00000000
--- a/api/iceberg/spec/manifest/struct.DataFile.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta http-equiv="refresh" content="0;URL=../../../iceberg/spec/struct.DataFile.html">
- <title>Redirection</title>
-</head>
-<body>
- <p>Redirecting to <a href="../../../iceberg/spec/struct.DataFile.html">../../../iceberg/spec/struct.DataFile.html</a>...</p>
- <script>location.replace("../../../iceberg/spec/struct.DataFile.html" + location.search + location.hash);</script>
-</body>
-</html>
\ No newline at end of file
diff --git a/api/iceberg/spec/manifest/struct.DataFileBuilder.html b/api/iceberg/spec/manifest/struct.DataFileBuilder.html
deleted file mode 100644
index 3883e0c7..00000000
--- a/api/iceberg/spec/manifest/struct.DataFileBuilder.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta http-equiv="refresh" content="0;URL=../../../iceberg/spec/struct.DataFileBuilder.html">
- <title>Redirection</title>
-</head>
-<body>
- <p>Redirecting to <a href="../../../iceberg/spec/struct.DataFileBuilder.html">../../../iceberg/spec/struct.DataFileBuilder.html</a>...</p>
- <script>location.replace("../../../iceberg/spec/struct.DataFileBuilder.html" + location.search + location.hash);</script>
-</body>
-</html>
\ No newline at end of file
diff --git a/api/iceberg/spec/manifest/struct.ManifestEntry.html b/api/iceberg/spec/manifest/struct.ManifestEntry.html
deleted file mode 100644
index f8de5195..00000000
--- a/api/iceberg/spec/manifest/struct.ManifestEntry.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta http-equiv="refresh" content="0;URL=../../../iceberg/spec/struct.ManifestEntry.html">
- <title>Redirection</title>
-</head>
-<body>
- <p>Redirecting to <a href="../../../iceberg/spec/struct.ManifestEntry.html">../../../iceberg/spec/struct.ManifestEntry.html</a>...</p>
- <script>location.replace("../../../iceberg/spec/struct.ManifestEntry.html" + location.search + location.hash);</script>
-</body>
-</html>
\ No newline at end of file
diff --git a/api/iceberg/spec/manifest/struct.ManifestMetadata.html b/api/iceberg/spec/manifest/struct.ManifestMetadata.html
deleted file mode 100644
index 7b375115..00000000
--- a/api/iceberg/spec/manifest/struct.ManifestMetadata.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta http-equiv="refresh" content="0;URL=../../../iceberg/spec/struct.ManifestMetadata.html">
- <title>Redirection</title>
-</head>
-<body>
- <p>Redirecting to <a href="../../../iceberg/spec/struct.ManifestMetadata.html">../../../iceberg/spec/struct.ManifestMetadata.html</a>...</p>
- <script>location.replace("../../../iceberg/spec/struct.ManifestMetadata.html" + location.search + location.hash);</script>
-</body>
-</html>
\ No newline at end of file
diff --git a/api/iceberg/spec/manifest/struct.ManifestWriter.html b/api/iceberg/spec/manifest/struct.ManifestWriter.html
deleted file mode 100644
index e09e3d7b..00000000
--- a/api/iceberg/spec/manifest/struct.ManifestWriter.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta http-equiv="refresh" content="0;URL=../../../iceberg/spec/struct.ManifestWriter.html">
- <title>Redirection</title>
-</head>
-<body>
- <p>Redirecting to <a href="../../../iceberg/spec/struct.ManifestWriter.html">../../../iceberg/spec/struct.ManifestWriter.html</a>...</p>
- <script>location.replace("../../../iceberg/spec/struct.ManifestWriter.html" + location.search + location.hash);</script>
-</body>
-</html>
\ No newline at end of file
diff --git a/api/iceberg/spec/manifest/struct.ManifestWriterBuilder.html b/api/iceberg/spec/manifest/struct.ManifestWriterBuilder.html
deleted file mode 100644
index e30bc942..00000000
--- a/api/iceberg/spec/manifest/struct.ManifestWriterBuilder.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta http-equiv="refresh" content="0;URL=../../../iceberg/spec/struct.ManifestWriterBuilder.html">
- <title>Redirection</title>
-</head>
-<body>
- <p>Redirecting to <a href="../../../iceberg/spec/struct.ManifestWriterBuilder.html">../../../iceberg/spec/struct.ManifestWriterBuilder.html</a>...</p>
- <script>location.replace("../../../iceberg/spec/struct.ManifestWriterBuilder.html" + location.search + location.hash);</script>
-</body>
-</html>
\ No newline at end of file
diff --git a/api/iceberg/spec/manifest/type.ManifestEntryRef.html b/api/iceberg/spec/manifest/type.ManifestEntryRef.html
deleted file mode 100644
index 4e08677e..00000000
--- a/api/iceberg/spec/manifest/type.ManifestEntryRef.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta http-equiv="refresh" content="0;URL=../../../iceberg/spec/type.ManifestEntryRef.html">
- <title>Redirection</title>
-</head>
-<body>
- <p>Redirecting to <a href="../../../iceberg/spec/type.ManifestEntryRef.html">../../../iceberg/spec/type.ManifestEntryRef.html</a>...</p>
- <script>location.replace("../../../iceberg/spec/type.ManifestEntryRef.html" + location.search + location.hash);</script>
-</body>
-</html>
\ No newline at end of file
diff --git a/api/iceberg/spec/manifest/writer/struct.ManifestWriter.html b/api/iceberg/spec/manifest/writer/struct.ManifestWriter.html
new file mode 100644
index 00000000..ed5db309
--- /dev/null
+++ b/api/iceberg/spec/manifest/writer/struct.ManifestWriter.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta http-equiv="refresh" content="0;URL=../../../../iceberg/spec/struct.ManifestWriter.html">
+ <title>Redirection</title>
+</head>
+<body>
+ <p>Redirecting to <a href="../../../../iceberg/spec/struct.ManifestWriter.html">../../../../iceberg/spec/struct.ManifestWriter.html</a>...</p>
+ <script>location.replace("../../../../iceberg/spec/struct.ManifestWriter.html" + location.search + location.hash);</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/api/iceberg/spec/manifest/writer/struct.ManifestWriterBuilder.html b/api/iceberg/spec/manifest/writer/struct.ManifestWriterBuilder.html
new file mode 100644
index 00000000..14659fe8
--- /dev/null
+++ b/api/iceberg/spec/manifest/writer/struct.ManifestWriterBuilder.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta http-equiv="refresh" content="0;URL=../../../../iceberg/spec/struct.ManifestWriterBuilder.html">
+ <title>Redirection</title>
+</head>
+<body>
+ <p>Redirecting to <a href="../../../../iceberg/spec/struct.ManifestWriterBuilder.html">../../../../iceberg/spec/struct.ManifestWriterBuilder.html</a>...</p>
+ <script>location.replace("../../../../iceberg/spec/struct.ManifestWriterBuilder.html" + location.search + location.hash);</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/api/iceberg/spec/struct.DataFile.html b/api/iceberg/spec/struct.DataFile.html
index ee6ebe4e..805474b9 100644
--- a/api/iceberg/spec/struct.DataFile.html
+++ b/api/iceberg/spec/struct.DataFile.html
@@ -1,40 +1,40 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Data file carries data file path, partition tuple, metrics, …"><title>DataFile in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff [...]
-</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-DataFile" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1371-1453">source</a><a href="#impl-DataFile" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.DataFile.html" title="struct icebe [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.file_path" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1377-1379">source</a><h4 class="code-header">pub fn <a href="#method.file_path" class="fn">file_path</a>(&self) -> &<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.str.html">str</a></h4></section></summary><div class="docblock"><p>Get the file path as full URI with FS [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.file_format" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1381-1383">source</a><h4 class="code-header">pub fn <a href="#method.file_format" class="fn">file_format</a>(&self) -> <a class="enum" href="enum.DataFileFormat.html" title="enum iceberg::spec::DataFileFormat">DataFileFormat</a></h4></section></summary><div class="docblock"><p>Get the file format [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.partition" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1385-1387">source</a><h4 class="code-header">pub fn <a href="#method.partition" class="fn">partition</a>(&self) -> &<a class="struct" href="struct.Struct.html" title="struct iceberg::spec::Struct">Struct</a></h4></section></summary><div class="docblock"><p>Get the partition values of the file.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.record_count" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1389-1391">source</a><h4 class="code-header">pub fn <a href="#method.record_count" class="fn">record_count</a>(&self) -> <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u64.html">u64</a></h4></section></summary><div class="docblock"><p>Get the record count in the data f [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.file_size_in_bytes" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1393-1395">source</a><h4 class="code-header">pub fn <a href="#method.file_size_in_bytes" class="fn">file_size_in_bytes</a>(&self) -> <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u64.html">u64</a></h4></section></summary><div class="docblock"><p>Get the file siz [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.column_sizes" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1400-1402">source</a><h4 class="code-header">pub fn <a href="#method.column_sizes" class="fn">column_sizes</a>(&self) -> &<a class="struct" href="https://doc.rust-lang.org/nightly/std/collections/hash/map/struct.HashMap.html" title="struct std::collections::hash::map::HashMap">HashMap</a>< [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Data file carries data file path, partition tuple, metrics, …"><title>DataFile in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff [...]
+</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-DataFile" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#156-238">source</a><a href="#impl-DataFile" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.DataFile.html" title="stru [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.file_path" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#162-164">source</a><h4 class="code-header">pub fn <a href="#method.file_path" class="fn">file_path</a>(&self) -> &<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.str.html">str</a></h4></section></summary><div class="docblock"><p>Get the file path as full URI [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.file_format" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#166-168">source</a><h4 class="code-header">pub fn <a href="#method.file_format" class="fn">file_format</a>(&self) -> <a class="enum" href="enum.DataFileFormat.html" title="enum iceberg::spec::DataFileFormat">DataFileFormat</a></h4></section></summary><div class="docblock"><p>Get the file [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.partition" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#170-172">source</a><h4 class="code-header">pub fn <a href="#method.partition" class="fn">partition</a>(&self) -> &<a class="struct" href="struct.Struct.html" title="struct iceberg::spec::Struct">Struct</a></h4></section></summary><div class="docblock"><p>Get the partition values of the [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.record_count" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#174-176">source</a><h4 class="code-header">pub fn <a href="#method.record_count" class="fn">record_count</a>(&self) -> <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u64.html">u64</a></h4></section></summary><div class="docblock"><p>Get the record count in th [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.file_size_in_bytes" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#178-180">source</a><h4 class="code-header">pub fn <a href="#method.file_size_in_bytes" class="fn">file_size_in_bytes</a>(&self) -> <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u64.html">u64</a></h4></section></summary><div class="docblock"><p>Get the [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.column_sizes" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#185-187">source</a><h4 class="code-header">pub fn <a href="#method.column_sizes" class="fn">column_sizes</a>(&self) -> &<a class="struct" href="https://doc.rust-lang.org/nightly/std/collections/hash/map/struct.HashMap.html" title="struct std::collections::hash::map::HashMap">HashMap [...]
Map from column id to the total size on disk of all regions that
store the column. Does not include bytes necessary to read other
columns, like footers. Null for row-oriented formats (Avro)</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.value_counts" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1406-1408">source</a><h4 class="code-header">pub fn <a href="#method.value_counts" class="fn">value_counts</a>(&self) -> &<a class="struct" href="https://doc.rust-lang.org/nightly/std/collections/hash/map/struct.HashMap.html" title="struct std::collections::hash::map::HashMap">HashMap</a>< [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.value_counts" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#191-193">source</a><h4 class="code-header">pub fn <a href="#method.value_counts" class="fn">value_counts</a>(&self) -> &<a class="struct" href="https://doc.rust-lang.org/nightly/std/collections/hash/map/struct.HashMap.html" title="struct std::collections::hash::map::HashMap">HashMap [...]
Map from column id to number of values in the column (including null
and NaN values)</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.null_value_counts" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1411-1413">source</a><h4 class="code-header">pub fn <a href="#method.null_value_counts" class="fn">null_value_counts</a>(&self) -> &<a class="struct" href="https://doc.rust-lang.org/nightly/std/collections/hash/map/struct.HashMap.html" title="struct std::collections::hash::map::HashMap"> [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.null_value_counts" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#196-198">source</a><h4 class="code-header">pub fn <a href="#method.null_value_counts" class="fn">null_value_counts</a>(&self) -> &<a class="struct" href="https://doc.rust-lang.org/nightly/std/collections/hash/map/struct.HashMap.html" title="struct std::collections::hash::map::H [...]
Map from column id to number of null values in the column</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.nan_value_counts" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1416-1418">source</a><h4 class="code-header">pub fn <a href="#method.nan_value_counts" class="fn">nan_value_counts</a>(&self) -> &<a class="struct" href="https://doc.rust-lang.org/nightly/std/collections/hash/map/struct.HashMap.html" title="struct std::collections::hash::map::HashMap">Has [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.nan_value_counts" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#201-203">source</a><h4 class="code-header">pub fn <a href="#method.nan_value_counts" class="fn">nan_value_counts</a>(&self) -> &<a class="struct" href="https://doc.rust-lang.org/nightly/std/collections/hash/map/struct.HashMap.html" title="struct std::collections::hash::map::Hash [...]
Map from column id to number of NaN values in the column</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.lower_bounds" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1421-1423">source</a><h4 class="code-header">pub fn <a href="#method.lower_bounds" class="fn">lower_bounds</a>(&self) -> &<a class="struct" href="https://doc.rust-lang.org/nightly/std/collections/hash/map/struct.HashMap.html" title="struct std::collections::hash::map::HashMap">HashMap</a>< [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.lower_bounds" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#206-208">source</a><h4 class="code-header">pub fn <a href="#method.lower_bounds" class="fn">lower_bounds</a>(&self) -> &<a class="struct" href="https://doc.rust-lang.org/nightly/std/collections/hash/map/struct.HashMap.html" title="struct std::collections::hash::map::HashMap">HashMap [...]
Map from column id to lower bound in the column serialized as binary.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.upper_bounds" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1426-1428">source</a><h4 class="code-header">pub fn <a href="#method.upper_bounds" class="fn">upper_bounds</a>(&self) -> &<a class="struct" href="https://doc.rust-lang.org/nightly/std/collections/hash/map/struct.HashMap.html" title="struct std::collections::hash::map::HashMap">HashMap</a>< [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.upper_bounds" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#211-213">source</a><h4 class="code-header">pub fn <a href="#method.upper_bounds" class="fn">upper_bounds</a>(&self) -> &<a class="struct" href="https://doc.rust-lang.org/nightly/std/collections/hash/map/struct.HashMap.html" title="struct std::collections::hash::map::HashMap">HashMap [...]
Map from column id to upper bound in the column serialized as binary.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.key_metadata" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1430-1432">source</a><h4 class="code-header">pub fn <a href="#method.key_metadata" class="fn">key_metadata</a>(&self) -> <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a><&[<a class="primitive" href="https://d [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.split_offsets" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1435-1437">source</a><h4 class="code-header">pub fn <a href="#method.split_offsets" class="fn">split_offsets</a>(&self) -> &[<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i64.html">i64</a>]</h4></section></summary><div class="docblock"><p>Get the split offsets of [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.key_metadata" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#215-217">source</a><h4 class="code-header">pub fn <a href="#method.key_metadata" class="fn">key_metadata</a>(&self) -> <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a><&[<a class="primitive" href="h [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.split_offsets" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#220-222">source</a><h4 class="code-header">pub fn <a href="#method.split_offsets" class="fn">split_offsets</a>(&self) -> &[<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i64.html">i64</a>]</h4></section></summary><div class="docblock"><p>Get the split of [...]
For example, all row group offsets in a Parquet file.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.equality_ids" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1441-1443">source</a><h4 class="code-header">pub fn <a href="#method.equality_ids" class="fn">equality_ids</a>(&self) -> &[<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i32.html">i32</a>]</h4></section></summary><div class="docblock"><p>Get the equality ids of the [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.equality_ids" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#226-228">source</a><h4 class="code-header">pub fn <a href="#method.equality_ids" class="fn">equality_ids</a>(&self) -> &[<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i32.html">i32</a>]</h4></section></summary><div class="docblock"><p>Get the equality id [...]
Field ids used to determine row equality in equality delete files.
null when content is not EqualityDeletes.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.sort_order_id" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1450-1452">source</a><h4 class="code-header">pub fn <a href="#method.sort_order_id" class="fn">sort_order_id</a>(&self) -> <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="primitive" href="https://doc. [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.sort_order_id" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#235-237">source</a><h4 class="code-header">pub fn <a href="#method.sort_order_id" class="fn">sort_order_id</a>(&self) -> <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="primitive" href="http [...]
Only data files and equality delete files should be
written with a non-null order id. Position deletes are required to be
sorted by file and position, not a table order, and should set sort
order id to null. Readers must ignore sort order id for position
delete files.</p>
-</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-DataFile" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1248">source</a><a href="#impl-Clone-for-DataFile" class="anchor">§</a><h3 class="code-header">impl <a c [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-DataFile" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#33">source</a><a href="#impl-Clone-for-DataFile" class="anchor">§</a><h3 class="code-header">i [...]
by <code>==</code>.</div></details><details class="toggle method-toggle" open><summary><section id="method.ne" class="method trait-impl"><span class="rightside"><span class="since" title="Stable since Rust version 1.0.0">1.0.0</span> · <a class="src" href="https://doc.rust-lang.org/nightly/src/core/cmp.rs.html#263">source</a></span><a href="#method.ne" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html#method.ne" class= [...]
-sufficient, and should not be overridden without very good reason.</div></details></div></details><section id="impl-Eq-for-DataFile" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1248">source</a><a href="#impl-Eq-for-DataFile" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/cmp/trait.Eq.html" title="trait core::cmp::Eq">Eq</a> for <a class="struct" href="struct.DataFile.html" title="struc [...]
+sufficient, and should not be overridden without very good reason.</div></details></div></details><section id="impl-Eq-for-DataFile" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#33">source</a><a href="#impl-Eq-for-DataFile" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/cmp/trait.Eq.html" title="trait core::cmp::Eq">Eq</a> for <a class="struct" href="struct.DataFile.html" titl [...]
T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#141">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="https:/ [...]
T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a href= [...]
diff --git a/api/iceberg/spec/struct.DataFileBuilder.html b/api/iceberg/spec/struct.DataFileBuilder.html
index 6efba714..f472c83e 100644
--- a/api/iceberg/spec/struct.DataFileBuilder.html
+++ b/api/iceberg/spec/struct.DataFileBuilder.html
@@ -1,38 +1,38 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Builder for `DataFile`."><title>DataFileBuilder in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff2,FiraSans-Medium-8f9a781e4970d [...]
-</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-DataFileBuilder" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1248">source</a><a href="#impl-DataFileBuilder" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.DataFileBuilder.html" tit [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Builder for `DataFile`."><title>DataFileBuilder in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff2,FiraSans-Medium-8f9a781e4970d [...]
+</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-DataFileBuilder" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#33">source</a><a href="#impl-DataFileBuilder" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.DataFileBuilder.h [...]
<p>Type of content stored by the data file: data, equality deletes,
or position deletes (all v1 files are data files)</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.file_path" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1248">source</a><h4 class="code-header">pub fn <a href="#method.file_path" class="fn">file_path</a>(&mut self, value: <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>) -> <a class="primitive" href="https://doc. [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.file_path" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#33">source</a><h4 class="code-header">pub fn <a href="#method.file_path" class="fn">file_path</a>(&mut self, value: <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>) -> <a class="primitive" href="http [...]
<p>Full URI for the file with FS scheme</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.file_format" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1248">source</a><h4 class="code-header">pub fn <a href="#method.file_format" class="fn">file_format</a>(&mut self, value: <a class="enum" href="enum.DataFileFormat.html" title="enum iceberg::spec::DataFileFormat">DataFileFormat</a>) -> <a class="primitive" href="https://doc.rust-lang.org/nightly/s [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.file_format" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#33">source</a><h4 class="code-header">pub fn <a href="#method.file_format" class="fn">file_format</a>(&mut self, value: <a class="enum" href="enum.DataFileFormat.html" title="enum iceberg::spec::DataFileFormat">DataFileFormat</a>) -> <a class="primitive" href="https://doc.rust-lang.org/n [...]
<p>String file format name, avro, orc or parquet</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.partition" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1248">source</a><h4 class="code-header">pub fn <a href="#method.partition" class="fn">partition</a>(&mut self, value: <a class="struct" href="struct.Struct.html" title="struct iceberg::spec::Struct">Struct</a>) -> <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.h [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.partition" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#33">source</a><h4 class="code-header">pub fn <a href="#method.partition" class="fn">partition</a>(&mut self, value: <a class="struct" href="struct.Struct.html" title="struct iceberg::spec::Struct">Struct</a>) -> <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.ref [...]
<p>Partition data tuple, schema based on the partition spec output using
partition field ids for the struct field ids</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.record_count" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1248">source</a><h4 class="code-header">pub fn <a href="#method.record_count" class="fn">record_count</a>(&mut self, value: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u64.html">u64</a>) -> <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.r [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.record_count" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#33">source</a><h4 class="code-header">pub fn <a href="#method.record_count" class="fn">record_count</a>(&mut self, value: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u64.html">u64</a>) -> <a class="primitive" href="https://doc.rust-lang.org/nightly/std/pri [...]
<p>Number of records in this file</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.file_size_in_bytes" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1248">source</a><h4 class="code-header">pub fn <a href="#method.file_size_in_bytes" class="fn">file_size_in_bytes</a>(&mut self, value: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u64.html">u64</a>) -> <a class="primitive" href="https://doc.rust-lang.org/night [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.file_size_in_bytes" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#33">source</a><h4 class="code-header">pub fn <a href="#method.file_size_in_bytes" class="fn">file_size_in_bytes</a>(&mut self, value: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u64.html">u64</a>) -> <a class="primitive" href="https://doc.rust-lang.o [...]
<p>Total file size in bytes</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.column_sizes" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1248">source</a><h4 class="code-header">pub fn <a href="#method.column_sizes" class="fn">column_sizes</a>(&mut self, value: <a class="struct" href="https://doc.rust-lang.org/nightly/std/collections/hash/map/struct.HashMap.html" title="struct std::collections::hash::map::HashMap">HashMap</a><<a cl [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.column_sizes" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#33">source</a><h4 class="code-header">pub fn <a href="#method.column_sizes" class="fn">column_sizes</a>(&mut self, value: <a class="struct" href="https://doc.rust-lang.org/nightly/std/collections/hash/map/struct.HashMap.html" title="struct std::collections::hash::map::HashMap">HashMap</a>& [...]
key field id: 117
value field id: 118</p>
<p>Map from column id to the total size on disk of all regions that
store the column. Does not include bytes necessary to read other
columns, like footers. Leave null for row-oriented formats (Avro)</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.value_counts" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1248">source</a><h4 class="code-header">pub fn <a href="#method.value_counts" class="fn">value_counts</a>(&mut self, value: <a class="struct" href="https://doc.rust-lang.org/nightly/std/collections/hash/map/struct.HashMap.html" title="struct std::collections::hash::map::HashMap">HashMap</a><<a cl [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.value_counts" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#33">source</a><h4 class="code-header">pub fn <a href="#method.value_counts" class="fn">value_counts</a>(&mut self, value: <a class="struct" href="https://doc.rust-lang.org/nightly/std/collections/hash/map/struct.HashMap.html" title="struct std::collections::hash::map::HashMap">HashMap</a>& [...]
key field id: 119
value field id: 120</p>
<p>Map from column id to number of values in the column (including null
and NaN values)</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.null_value_counts" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1248">source</a><h4 class="code-header">pub fn <a href="#method.null_value_counts" class="fn">null_value_counts</a>(&mut self, value: <a class="struct" href="https://doc.rust-lang.org/nightly/std/collections/hash/map/struct.HashMap.html" title="struct std::collections::hash::map::HashMap">HashM [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.null_value_counts" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#33">source</a><h4 class="code-header">pub fn <a href="#method.null_value_counts" class="fn">null_value_counts</a>(&mut self, value: <a class="struct" href="https://doc.rust-lang.org/nightly/std/collections/hash/map/struct.HashMap.html" title="struct std::collections::hash::map::HashMa [...]
key field id: 121
value field id: 122</p>
<p>Map from column id to number of null values in the column</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.nan_value_counts" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1248">source</a><h4 class="code-header">pub fn <a href="#method.nan_value_counts" class="fn">nan_value_counts</a>(&mut self, value: <a class="struct" href="https://doc.rust-lang.org/nightly/std/collections/hash/map/struct.HashMap.html" title="struct std::collections::hash::map::HashMap">HashMap< [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.nan_value_counts" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#33">source</a><h4 class="code-header">pub fn <a href="#method.nan_value_counts" class="fn">nan_value_counts</a>(&mut self, value: <a class="struct" href="https://doc.rust-lang.org/nightly/std/collections/hash/map/struct.HashMap.html" title="struct std::collections::hash::map::HashMap"> [...]
key field id: 138
value field id: 139</p>
<p>Map from column id to number of NaN values in the column</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.lower_bounds" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1248">source</a><h4 class="code-header">pub fn <a href="#method.lower_bounds" class="fn">lower_bounds</a>(&mut self, value: <a class="struct" href="https://doc.rust-lang.org/nightly/std/collections/hash/map/struct.HashMap.html" title="struct std::collections::hash::map::HashMap">HashMap</a><<a cl [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.lower_bounds" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#33">source</a><h4 class="code-header">pub fn <a href="#method.lower_bounds" class="fn">lower_bounds</a>(&mut self, value: <a class="struct" href="https://doc.rust-lang.org/nightly/std/collections/hash/map/struct.HashMap.html" title="struct std::collections::hash::map::HashMap">HashMap</a>& [...]
key field id: 126
value field id: 127</p>
<p>Map from column id to lower bound in the column serialized as binary.
@@ -42,7 +42,7 @@ in the column for the file.</p>
<ul>
<li><a href="https://iceberg.apache.org/spec/#binary-single-value-serialization">Binary single-value serialization</a></li>
</ul>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.upper_bounds" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1248">source</a><h4 class="code-header">pub fn <a href="#method.upper_bounds" class="fn">upper_bounds</a>(&mut self, value: <a class="struct" href="https://doc.rust-lang.org/nightly/std/collections/hash/map/struct.HashMap.html" title="struct std::collections::hash::map::HashMap">HashMap</a><<a cl [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.upper_bounds" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#33">source</a><h4 class="code-header">pub fn <a href="#method.upper_bounds" class="fn">upper_bounds</a>(&mut self, value: <a class="struct" href="https://doc.rust-lang.org/nightly/std/collections/hash/map/struct.HashMap.html" title="struct std::collections::hash::map::HashMap">HashMap</a>& [...]
key field id: 129
value field id: 130</p>
<p>Map from column id to upper bound in the column serialized as binary.
@@ -52,19 +52,19 @@ values in the column for the file.</p>
<ul>
<li><a href="https://iceberg.apache.org/spec/#binary-single-value-serialization">Binary single-value serialization</a></li>
</ul>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.key_metadata" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1248">source</a><h4 class="code-header">pub fn <a href="#method.key_metadata" class="fn">key_metadata</a>(&mut self, value: <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="struct" href="https://doc.rust-l [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.key_metadata" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#33">source</a><h4 class="code-header">pub fn <a href="#method.key_metadata" class="fn">key_metadata</a>(&mut self, value: <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="struct" href="https://do [...]
<p>Implementation-specific key metadata for encryption</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.split_offsets" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1248">source</a><h4 class="code-header">pub fn <a href="#method.split_offsets" class="fn">split_offsets</a>(&mut self, value: <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a><<a class="primitive" href="https://doc.rust-la [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.split_offsets" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#33">source</a><h4 class="code-header">pub fn <a href="#method.split_offsets" class="fn">split_offsets</a>(&mut self, value: <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a><<a class="primitive" href="https://doc [...]
element field id: 133</p>
<p>Split offsets for the data file. For example, all row group offsets
in a Parquet file. Must be sorted ascending</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.equality_ids" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1248">source</a><h4 class="code-header">pub fn <a href="#method.equality_ids" class="fn">equality_ids</a>(&mut self, value: <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a><<a class="primitive" href="https://doc.rust-lang. [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.equality_ids" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#33">source</a><h4 class="code-header">pub fn <a href="#method.equality_ids" class="fn">equality_ids</a>(&mut self, value: <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a><<a class="primitive" href="https://doc.ru [...]
element field id: 136</p>
<p>Field ids used to determine row equality in equality delete files.
Required when content is EqualityDeletes and should be null
otherwise. Fields with ids listed in this column must be present
in the delete file</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.sort_order_id" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1248">source</a><h4 class="code-header">pub fn <a href="#method.sort_order_id" class="fn">sort_order_id</a>(&mut self, value: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i32.html">i32</a>) -> <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitiv [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.sort_order_id" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#33">source</a><h4 class="code-header">pub fn <a href="#method.sort_order_id" class="fn">sort_order_id</a>(&mut self, value: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i32.html">i32</a>) -> <a class="primitive" href="https://doc.rust-lang.org/nightly/std/ [...]
<p>ID representing sort order for this file.</p>
<p>If sort order ID is missing or unknown, then the order is assumed to
be unsorted. Only data files and equality delete files should be
@@ -72,12 +72,12 @@ written with a non-null order id. Position deletes are required to be
sorted by file and position, not a table order, and should set sort
order id to null. Readers must ignore sort order id for position
delete files.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.partition_spec_id" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1248">source</a><h4 class="code-header">pub fn <a href="#method.partition_spec_id" class="fn">partition_spec_id</a>(&mut self, value: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i32.html">i32</a>) -> <a class="primitive" href="https://doc.rust-lang.org/nightly/ [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.partition_spec_id" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#33">source</a><h4 class="code-header">pub fn <a href="#method.partition_spec_id" class="fn">partition_spec_id</a>(&mut self, value: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i32.html">i32</a>) -> <a class="primitive" href="https://doc.rust-lang.org/ [...]
in process.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.build" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1248">source</a><h4 class="code-header">pub fn <a href="#method.build" class="fn">build</a>(&self) -> <a class="enum" href="https://doc.rust-lang.org/nightly/core/result/enum.Result.html" title="enum core::result::Result">Result</a><<a class="struct" href="struct.DataFile.html" title="struct iceberg: [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.build" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#33">source</a><h4 class="code-header">pub fn <a href="#method.build" class="fn">build</a>(&self) -> <a class="enum" href="https://doc.rust-lang.org/nightly/core/result/enum.Result.html" title="enum core::result::Result">Result</a><<a class="struct" href="struct.DataFile.html" title="struct [...]
<h5 id="errors"><a class="doc-anchor" href="#errors">§</a>Errors</h5>
<p>If a required field has not been initialized.</p>
-</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-DataFileBuilder" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1248">source</a><a href="#impl-Clone-for-DataFileBuilder" class="anchor">§</a><h3 class="code-hea [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-DataFileBuilder" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest/data_file.rs.html#33">source</a><a href="#impl-Clone-for-DataFileBuilder" class="anchor">§</a><h3 class=" [...]
T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#141">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="https:/ [...]
T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a href= [...]
diff --git a/api/iceberg/spec/struct.Manifest.html b/api/iceberg/spec/struct.Manifest.html
index 1d8ba914..c11879ad 100644
--- a/api/iceberg/spec/struct.Manifest.html
+++ b/api/iceberg/spec/struct.Manifest.html
@@ -1,11 +1,11 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="A manifest contains metadata and a list of entries."><title>Manifest in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff2,FiraSans [...]
-</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Manifest" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#51-121">source</a><a href="#impl-Manifest" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.Manifest.html" title="struct iceberg: [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.entries" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#104-106">source</a><h4 class="code-header">pub fn <a href="#method.entries" class="fn">entries</a>(&self) -> &[<a class="type" href="type.ManifestEntryRef.html" title="type iceberg::spec::ManifestEntryRef">ManifestEntryRef</a>]</h4></section></summary><div class="docblock"><p>Entries slice.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.into_parts" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#109-112">source</a><h4 class="code-header">pub fn <a href="#method.into_parts" class="fn">into_parts</a>(self) -> (<a class="struct" href="https://doc.rust-lang.org/nightly/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a><<a class="type" href="type.ManifestEntryRef.html" title="type [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.new" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#115-120">source</a><h4 class="code-header">pub fn <a href="#method.new" class="fn">new</a>(metadata: <a class="struct" href="struct.ManifestMetadata.html" title="struct iceberg::spec::ManifestMetadata">ManifestMetadata</a>, entries: <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/vec/struct.Vec.h [...]
-</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-Manifest" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#45">source</a><a href="#impl-Clone-for-Manifest" class="anchor">§</a><h3 class="code-header">impl <a cla [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="A manifest contains metadata and a list of entries."><title>Manifest in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff2,FiraSans [...]
+</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Manifest" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest/mod.rs.html#45-115">source</a><a href="#impl-Manifest" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.Manifest.html" title="struct iceb [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.entries" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/mod.rs.html#98-100">source</a><h4 class="code-header">pub fn <a href="#method.entries" class="fn">entries</a>(&self) -> &[<a class="type" href="type.ManifestEntryRef.html" title="type iceberg::spec::ManifestEntryRef">ManifestEntryRef</a>]</h4></section></summary><div class="docblock"><p>Entries slice.</p>
+</div></details><details class="toggle method-toggle" open><summary><section id="method.into_parts" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/mod.rs.html#103-106">source</a><h4 class="code-header">pub fn <a href="#method.into_parts" class="fn">into_parts</a>(self) -> (<a class="struct" href="https://doc.rust-lang.org/nightly/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a><<a class="type" href="type.ManifestEntryRef.html" title=" [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.new" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/mod.rs.html#109-114">source</a><h4 class="code-header">pub fn <a href="#method.new" class="fn">new</a>(metadata: <a class="struct" href="struct.ManifestMetadata.html" title="struct iceberg::spec::ManifestMetadata">ManifestMetadata</a>, entries: <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/vec/struct.V [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-Manifest" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest/mod.rs.html#39">source</a><a href="#impl-Clone-for-Manifest" class="anchor">§</a><h3 class="code-header">impl <a [...]
by <code>==</code>.</div></details><details class="toggle method-toggle" open><summary><section id="method.ne" class="method trait-impl"><span class="rightside"><span class="since" title="Stable since Rust version 1.0.0">1.0.0</span> · <a class="src" href="https://doc.rust-lang.org/nightly/src/core/cmp.rs.html#263">source</a></span><a href="#method.ne" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html#method.ne" class= [...]
-sufficient, and should not be overridden without very good reason.</div></details></div></details><section id="impl-Eq-for-Manifest" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#45">source</a><a href="#impl-Eq-for-Manifest" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/cmp/trait.Eq.html" title="trait core::cmp::Eq">Eq</a> for <a class="struct" href="struct.Manifest.html" title="struct [...]
+sufficient, and should not be overridden without very good reason.</div></details></div></details><section id="impl-Eq-for-Manifest" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest/mod.rs.html#39">source</a><a href="#impl-Eq-for-Manifest" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/cmp/trait.Eq.html" title="trait core::cmp::Eq">Eq</a> for <a class="struct" href="struct.Manifest.html" title="str [...]
T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#141">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="https:/ [...]
T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a href= [...]
diff --git a/api/iceberg/spec/struct.ManifestEntry.html b/api/iceberg/spec/struct.ManifestEntry.html
index 0e6740bf..68a94869 100644
--- a/api/iceberg/spec/struct.ManifestEntry.html
+++ b/api/iceberg/spec/struct.ManifestEntry.html
@@ -1,22 +1,41 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="A manifest is an immutable Avro file that lists data files or delete files, along with each file’s partition data tuple, metrics, and tracking information."><title>ManifestEntry in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML( [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="A manifest is an immutable Avro file that lists data files or delete files, along with each file’s partition data tuple, metrics, and tracking information."><title>ManifestEntry in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML( [...]
+ pub status: <a class="enum" href="enum.ManifestStatus.html" title="enum iceberg::spec::ManifestStatus">ManifestStatus</a>,
+ pub snapshot_id: <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i64.html">i64</a>>,
+ pub sequence_number: <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i64.html">i64</a>>,
+ pub file_sequence_number: <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i64.html">i64</a>>,
+ pub data_file: <a class="struct" href="struct.DataFile.html" title="struct iceberg::spec::DataFile">DataFile</a>,
+}</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>A manifest is an immutable Avro file that lists data files or delete
files, along with each file’s partition data tuple, metrics, and tracking
information.</p>
-</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-ManifestEntry" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1104">source</a><a href="#impl-ManifestEntry" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.ManifestEntry.html" title="st [...]
+</div></details><h2 id="fields" class="fields section-header">Fields<a href="#fields" class="anchor">§</a></h2><span id="structfield.status" class="structfield section-header"><a href="#structfield.status" class="anchor field">§</a><code>status: <a class="enum" href="enum.ManifestStatus.html" title="enum iceberg::spec::ManifestStatus">ManifestStatus</a></code></span><div class="docblock"><p>field: 0</p>
+<p>Used to track additions and deletions.</p>
+</div><span id="structfield.snapshot_id" class="structfield section-header"><a href="#structfield.snapshot_id" class="anchor field">§</a><code>snapshot_id: <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i64.html">i64</a>></code></span><div class="docblock"><p>field id: 1</p>
+<p>Snapshot id where the file was added, or deleted if status is 2.
+Inherited when null.</p>
+</div><span id="structfield.sequence_number" class="structfield section-header"><a href="#structfield.sequence_number" class="anchor field">§</a><code>sequence_number: <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i64.html">i64</a>></code></span><div class="docblock"><p>field id: 3</p>
+<p>Data sequence number of the file.
+Inherited when null and status is 1 (added).</p>
+</div><span id="structfield.file_sequence_number" class="structfield section-header"><a href="#structfield.file_sequence_number" class="anchor field">§</a><code>file_sequence_number: <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i64.html">i64</a>></code></span><div class="docblock"><p>field id: 4</p>
+<p>File sequence number indicating when the file was added.
+Inherited when null and status is 1 (added).</p>
+</div><span id="structfield.data_file" class="structfield section-header"><a href="#structfield.data_file" class="anchor field">§</a><code>data_file: <a class="struct" href="struct.DataFile.html" title="struct iceberg::spec::DataFile">DataFile</a></code></span><div class="docblock"><p>field id: 2</p>
+<p>File path, partition tuple, metrics, …</p>
+</div><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-ManifestEntry" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest/entry.rs.html#38">source</a><a href="#impl-ManifestEntry" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.ManifestEntry.html" title="struct i [...]
On the builder, call <code>.status(...)</code>, <code>.snapshot_id(...)</code>(optional), <code>.sequence_number(...)</code>(optional), <code>.file_sequence_number(...)</code>(optional), <code>.data_file(...)</code> to set the values of the fields.
Finally, call <code>.build()</code> to create the instance of <code>ManifestEntry</code>.</p>
-</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-ManifestEntry-1" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1134-1216">source</a><a href="#impl-ManifestEntry-1" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.ManifestEntry.html" title="struct iceberg::spec::ManifestEntry">ManifestEntry</a></h3></section></summary><div class="impl-items"><details class="togg [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.status" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1144-1146">source</a><h4 class="code-header">pub fn <a href="#method.status" class="fn">status</a>(&self) -> <a class="enum" href="enum.ManifestStatus.html" title="enum iceberg::spec::ManifestStatus">ManifestStatus</a></h4></section></summary><div class="docblock"><p>Status of this manifest entry</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.content_type" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1150-1152">source</a><h4 class="code-header">pub fn <a href="#method.content_type" class="fn">content_type</a>(&self) -> <a class="enum" href="enum.DataContentType.html" title="enum iceberg::spec::DataContentType">DataContentType</a></h4></section></summary><div class="docblock"><p>Content type o [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.file_format" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1156-1158">source</a><h4 class="code-header">pub fn <a href="#method.file_format" class="fn">file_format</a>(&self) -> <a class="enum" href="enum.DataFileFormat.html" title="enum iceberg::spec::DataFileFormat">DataFileFormat</a></h4></section></summary><div class="docblock"><p>File format of this [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.file_path" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1162-1164">source</a><h4 class="code-header">pub fn <a href="#method.file_path" class="fn">file_path</a>(&self) -> &<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.str.html">str</a></h4></section></summary><div class="docblock"><p>Data file path of this manifest entry.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.record_count" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1168-1170">source</a><h4 class="code-header">pub fn <a href="#method.record_count" class="fn">record_count</a>(&self) -> <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u64.html">u64</a></h4></section></summary><div class="docblock"><p>Data file record count of the mani [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.snapshot_id" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1195-1197">source</a><h4 class="code-header">pub fn <a href="#method.snapshot_id" class="fn">snapshot_id</a>(&self) -> <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="primitive" href="https://doc.rust-l [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.sequence_number" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1201-1203">source</a><h4 class="code-header">pub fn <a href="#method.sequence_number" class="fn">sequence_number</a>(&self) -> <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="primitive" href="https: [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.file_size_in_bytes" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1207-1209">source</a><h4 class="code-header">pub fn <a href="#method.file_size_in_bytes" class="fn">file_size_in_bytes</a>(&self) -> <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u64.html">u64</a></h4></section></summary><div class="docblock"><p>File size in bytes.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.data_file" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1213-1215">source</a><h4 class="code-header">pub fn <a href="#method.data_file" class="fn">data_file</a>(&self) -> &<a class="struct" href="struct.DataFile.html" title="struct iceberg::spec::DataFile">DataFile</a></h4></section></summary><div class="docblock"><p>get a reference to the actual dat [...]
-</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-ManifestEntry" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1104">source</a><a href="#impl-Clone-for-ManifestEntry" class="anchor">§</a><h3 class="code-header" [...]
+</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-ManifestEntry-1" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest/entry.rs.html#68-150">source</a><a href="#impl-ManifestEntry-1" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.ManifestEntry.html" title="struct iceberg::spec::ManifestEntry">ManifestEntry</a></h3></section></summary><div class="impl-items"><details class="t [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.status" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/entry.rs.html#78-80">source</a><h4 class="code-header">pub fn <a href="#method.status" class="fn">status</a>(&self) -> <a class="enum" href="enum.ManifestStatus.html" title="enum iceberg::spec::ManifestStatus">ManifestStatus</a></h4></section></summary><div class="docblock"><p>Status of this manifest entry</p>
+</div></details><details class="toggle method-toggle" open><summary><section id="method.content_type" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/entry.rs.html#84-86">source</a><h4 class="code-header">pub fn <a href="#method.content_type" class="fn">content_type</a>(&self) -> <a class="enum" href="enum.DataContentType.html" title="enum iceberg::spec::DataContentType">DataContentType</a></h4></section></summary><div class="docblock"><p>Content type [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.file_format" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/entry.rs.html#90-92">source</a><h4 class="code-header">pub fn <a href="#method.file_format" class="fn">file_format</a>(&self) -> <a class="enum" href="enum.DataFileFormat.html" title="enum iceberg::spec::DataFileFormat">DataFileFormat</a></h4></section></summary><div class="docblock"><p>File format of thi [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.file_path" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/entry.rs.html#96-98">source</a><h4 class="code-header">pub fn <a href="#method.file_path" class="fn">file_path</a>(&self) -> &<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.str.html">str</a></h4></section></summary><div class="docblock"><p>Data file path of this manifest entry.</p>
+</div></details><details class="toggle method-toggle" open><summary><section id="method.record_count" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/entry.rs.html#102-104">source</a><h4 class="code-header">pub fn <a href="#method.record_count" class="fn">record_count</a>(&self) -> <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u64.html">u64</a></h4></section></summary><div class="docblock"><p>Data file record count of the [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.snapshot_id" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/entry.rs.html#129-131">source</a><h4 class="code-header">pub fn <a href="#method.snapshot_id" class="fn">snapshot_id</a>(&self) -> <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="primitive" href="https://doc.ru [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.sequence_number" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/entry.rs.html#135-137">source</a><h4 class="code-header">pub fn <a href="#method.sequence_number" class="fn">sequence_number</a>(&self) -> <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="primitive" href="ht [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.file_size_in_bytes" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/entry.rs.html#141-143">source</a><h4 class="code-header">pub fn <a href="#method.file_size_in_bytes" class="fn">file_size_in_bytes</a>(&self) -> <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u64.html">u64</a></h4></section></summary><div class="docblock"><p>File size in [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.data_file" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/entry.rs.html#147-149">source</a><h4 class="code-header">pub fn <a href="#method.data_file" class="fn">data_file</a>(&self) -> &<a class="struct" href="struct.DataFile.html" title="struct iceberg::spec::DataFile">DataFile</a></h4></section></summary><div class="docblock"><p>get a reference to the actual [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-ManifestEntry" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest/entry.rs.html#38">source</a><a href="#impl-Clone-for-ManifestEntry" class="anchor">§</a><h3 class="code-hea [...]
by <code>==</code>.</div></details><details class="toggle method-toggle" open><summary><section id="method.ne" class="method trait-impl"><span class="rightside"><span class="since" title="Stable since Rust version 1.0.0">1.0.0</span> · <a class="src" href="https://doc.rust-lang.org/nightly/src/core/cmp.rs.html#263">source</a></span><a href="#method.ne" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html#method.ne" class= [...]
-sufficient, and should not be overridden without very good reason.</div></details></div></details><section id="impl-Eq-for-ManifestEntry" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1104">source</a><a href="#impl-Eq-for-ManifestEntry" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/cmp/trait.Eq.html" title="trait core::cmp::Eq">Eq</a> for <a class="struct" href="struct.ManifestEntry.htm [...]
+sufficient, and should not be overridden without very good reason.</div></details></div></details><section id="impl-Eq-for-ManifestEntry" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest/entry.rs.html#38">source</a><a href="#impl-Eq-for-ManifestEntry" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/cmp/trait.Eq.html" title="trait core::cmp::Eq">Eq</a> for <a class="struct" href="struct.ManifestEntry [...]
T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#141">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="https:/ [...]
T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a href= [...]
diff --git a/api/iceberg/spec/struct.ManifestMetadata.html b/api/iceberg/spec/struct.ManifestMetadata.html
index 483746cb..f26fa50e 100644
--- a/api/iceberg/spec/struct.ManifestMetadata.html
+++ b/api/iceberg/spec/struct.ManifestMetadata.html
@@ -1,16 +1,28 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Meta data of a manifest that is stored in the key-value metadata of the Avro file"><title>ManifestMetadata in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-R [...]
-</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-ManifestMetadata" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#966">source</a><a href="#impl-ManifestMetadata" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.ManifestMetadata.html" t [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Meta data of a manifest that is stored in the key-value metadata of the Avro file"><title>ManifestMetadata in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-R [...]
+ pub schema: <a class="type" href="type.SchemaRef.html" title="type iceberg::spec::SchemaRef">SchemaRef</a>,
+ pub schema_id: <a class="type" href="type.SchemaId.html" title="type iceberg::spec::SchemaId">SchemaId</a>,
+ pub partition_spec: <a class="struct" href="struct.PartitionSpec.html" title="struct iceberg::spec::PartitionSpec">PartitionSpec</a>,
+ pub format_version: <a class="enum" href="enum.FormatVersion.html" title="enum iceberg::spec::FormatVersion">FormatVersion</a>,
+ pub content: <a class="enum" href="enum.ManifestContentType.html" title="enum iceberg::spec::ManifestContentType">ManifestContentType</a>,
+}</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Meta data of a manifest that is stored in the key-value metadata of the Avro file</p>
+</div></details><h2 id="fields" class="fields section-header">Fields<a href="#fields" class="anchor">§</a></h2><span id="structfield.schema" class="structfield section-header"><a href="#structfield.schema" class="anchor field">§</a><code>schema: <a class="type" href="type.SchemaRef.html" title="type iceberg::spec::SchemaRef">SchemaRef</a></code></span><div class="docblock"><p>The table schema at the time the manifest
+was written</p>
+</div><span id="structfield.schema_id" class="structfield section-header"><a href="#structfield.schema_id" class="anchor field">§</a><code>schema_id: <a class="type" href="type.SchemaId.html" title="type iceberg::spec::SchemaId">SchemaId</a></code></span><div class="docblock"><p>ID of the schema used to write the manifest as a string</p>
+</div><span id="structfield.partition_spec" class="structfield section-header"><a href="#structfield.partition_spec" class="anchor field">§</a><code>partition_spec: <a class="struct" href="struct.PartitionSpec.html" title="struct iceberg::spec::PartitionSpec">PartitionSpec</a></code></span><div class="docblock"><p>The partition spec used to write the manifest</p>
+</div><span id="structfield.format_version" class="structfield section-header"><a href="#structfield.format_version" class="anchor field">§</a><code>format_version: <a class="enum" href="enum.FormatVersion.html" title="enum iceberg::spec::FormatVersion">FormatVersion</a></code></span><div class="docblock"><p>Table format version number of the manifest as a string</p>
+</div><span id="structfield.content" class="structfield section-header"><a href="#structfield.content" class="anchor field">§</a><code>content: <a class="enum" href="enum.ManifestContentType.html" title="enum iceberg::spec::ManifestContentType">ManifestContentType</a></code></span><div class="docblock"><p>Type of content files tracked by the manifest: “data” or “deletes”</p>
+</div><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-ManifestMetadata" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest/metadata.rs.html#29">source</a><a href="#impl-ManifestMetadata" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.ManifestMetadata.html" tit [...]
On the builder, call <code>.schema(...)</code>, <code>.schema_id(...)</code>, <code>.partition_spec(...)</code>, <code>.format_version(...)</code>, <code>.content(...)</code> to set the values of the fields.
Finally, call <code>.build()</code> to create the instance of <code>ManifestMetadata</code>.</p>
-</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-ManifestMetadata-1" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#981-1096">source</a><a href="#impl-ManifestMetadata-1" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.ManifestMetadata.html" title="struct iceberg::spec::ManifestMetadata">ManifestMetadata</a></h3></section></summary><div class="impl-items"><detai [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.schema" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1073-1075">source</a><h4 class="code-header">pub fn <a href="#method.schema" class="fn">schema</a>(&self) -> &<a class="type" href="type.SchemaRef.html" title="type iceberg::spec::SchemaRef">SchemaRef</a></h4></section></summary><div class="docblock"><p>Get the schema of table at the time manifest [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.schema_id" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1078-1080">source</a><h4 class="code-header">pub fn <a href="#method.schema_id" class="fn">schema_id</a>(&self) -> <a class="type" href="type.SchemaId.html" title="type iceberg::spec::SchemaId">SchemaId</a></h4></section></summary><div class="docblock"><p>Get the ID of schema used to write the manifest</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.partition_spec" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1083-1085">source</a><h4 class="code-header">pub fn <a href="#method.partition_spec" class="fn">partition_spec</a>(&self) -> &<a class="struct" href="struct.PartitionSpec.html" title="struct iceberg::spec::PartitionSpec">PartitionSpec</a></h4></section></summary><div class="docblock"><p>Get [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.format_version" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1088-1090">source</a><h4 class="code-header">pub fn <a href="#method.format_version" class="fn">format_version</a>(&self) -> &<a class="enum" href="enum.FormatVersion.html" title="enum iceberg::spec::FormatVersion">FormatVersion</a></h4></section></summary><div class="docblock"><p>Get the t [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.content" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#1093-1095">source</a><h4 class="code-header">pub fn <a href="#method.content" class="fn">content</a>(&self) -> &<a class="enum" href="enum.ManifestContentType.html" title="enum iceberg::spec::ManifestContentType">ManifestContentType</a></h4></section></summary><div class="docblock"><p>Get the type [...]
-</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-ManifestMetadata" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#966">source</a><a href="#impl-Clone-for-ManifestMetadata" class="anchor">§</a><h3 class="code-he [...]
+</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-ManifestMetadata-1" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest/metadata.rs.html#44-159">source</a><a href="#impl-ManifestMetadata-1" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.ManifestMetadata.html" title="struct iceberg::spec::ManifestMetadata">ManifestMetadata</a></h3></section></summary><div class="impl-items" [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.schema" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/metadata.rs.html#136-138">source</a><h4 class="code-header">pub fn <a href="#method.schema" class="fn">schema</a>(&self) -> &<a class="type" href="type.SchemaRef.html" title="type iceberg::spec::SchemaRef">SchemaRef</a></h4></section></summary><div class="docblock"><p>Get the schema of table at the time ma [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.schema_id" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/metadata.rs.html#141-143">source</a><h4 class="code-header">pub fn <a href="#method.schema_id" class="fn">schema_id</a>(&self) -> <a class="type" href="type.SchemaId.html" title="type iceberg::spec::SchemaId">SchemaId</a></h4></section></summary><div class="docblock"><p>Get the ID of schema used to write th [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.partition_spec" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/metadata.rs.html#146-148">source</a><h4 class="code-header">pub fn <a href="#method.partition_spec" class="fn">partition_spec</a>(&self) -> &<a class="struct" href="struct.PartitionSpec.html" title="struct iceberg::spec::PartitionSpec">PartitionSpec</a></h4></section></summary><div class="docblock" [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.format_version" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/metadata.rs.html#151-153">source</a><h4 class="code-header">pub fn <a href="#method.format_version" class="fn">format_version</a>(&self) -> &<a class="enum" href="enum.FormatVersion.html" title="enum iceberg::spec::FormatVersion">FormatVersion</a></h4></section></summary><div class="docblock"><p>Ge [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.content" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/metadata.rs.html#156-158">source</a><h4 class="code-header">pub fn <a href="#method.content" class="fn">content</a>(&self) -> &<a class="enum" href="enum.ManifestContentType.html" title="enum iceberg::spec::ManifestContentType">ManifestContentType</a></h4></section></summary><div class="docblock"><p>Get t [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-ManifestMetadata" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest/metadata.rs.html#29">source</a><a href="#impl-Clone-for-ManifestMetadata" class="anchor">§</a><h3 class= [...]
by <code>==</code>.</div></details><details class="toggle method-toggle" open><summary><section id="method.ne" class="method trait-impl"><span class="rightside"><span class="since" title="Stable since Rust version 1.0.0">1.0.0</span> · <a class="src" href="https://doc.rust-lang.org/nightly/src/core/cmp.rs.html#263">source</a></span><a href="#method.ne" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html#method.ne" class= [...]
-sufficient, and should not be overridden without very good reason.</div></details></div></details><section id="impl-Eq-for-ManifestMetadata" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#966">source</a><a href="#impl-Eq-for-ManifestMetadata" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/cmp/trait.Eq.html" title="trait core::cmp::Eq">Eq</a> for <a class="struct" href="struct.ManifestMeta [...]
+sufficient, and should not be overridden without very good reason.</div></details></div></details><section id="impl-Eq-for-ManifestMetadata" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest/metadata.rs.html#29">source</a><a href="#impl-Eq-for-ManifestMetadata" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/cmp/trait.Eq.html" title="trait core::cmp::Eq">Eq</a> for <a class="struct" href="struct.Mani [...]
T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#141">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="https:/ [...]
T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a href= [...]
diff --git a/api/iceberg/spec/struct.ManifestWriter.html b/api/iceberg/spec/struct.ManifestWriter.html
index c4b08b6c..743e230e 100644
--- a/api/iceberg/spec/struct.ManifestWriter.html
+++ b/api/iceberg/spec/struct.ManifestWriter.html
@@ -1,12 +1,12 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="A manifest writer."><title>ManifestWriter in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff2,FiraSans-Medium-8f9a781e4970d388.wo [...]
-</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-ManifestWriter" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#271-567">source</a><a href="#impl-ManifestWriter" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.ManifestWriter.html" tit [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="A manifest writer."><title>ManifestWriter in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff2,FiraSans-Medium-8f9a781e4970d388.wo [...]
+</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-ManifestWriter" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest/writer.rs.html#125-417">source</a><a href="#impl-ManifestWriter" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.ManifestWriter.ht [...]
&mut self,
data_file: <a class="struct" href="struct.DataFile.html" title="struct iceberg::spec::DataFile">DataFile</a>,
sequence_number: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i64.html">i64</a>,
) -> <a class="type" href="../type.Result.html" title="type iceberg::Result">Result</a><<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.unit.html">()</a>></h4></section></summary><div class="docblock"><p>Add file as an added entry with a specific sequence number. The entry’s snapshot ID will be this manifest’s snapshot ID. The entry’s data sequence
number will be the provided data sequence number. The entry’s file sequence number will be
assigned at commit.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.add_delete_file" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#395-411">source</a><h4 class="code-header">pub fn <a href="#method.add_delete_file" class="fn">add_delete_file</a>(
+</div></details><details class="toggle method-toggle" open><summary><section id="method.add_delete_file" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/writer.rs.html#249-265">source</a><h4 class="code-header">pub fn <a href="#method.add_delete_file" class="fn">add_delete_file</a>(
&mut self,
data_file: <a class="struct" href="struct.DataFile.html" title="struct iceberg::spec::DataFile">DataFile</a>,
sequence_number: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i64.html">i64</a>,
@@ -14,7 +14,7 @@ assigned at commit.</p>
) -> <a class="type" href="../type.Result.html" title="type iceberg::Result">Result</a><<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.unit.html">()</a>></h4></section></summary><div class="docblock"><p>Add a file as delete manifest entry. The entry’s snapshot ID will be this manifest’s snapshot ID.
However, the original data and file sequence numbers of the file must be preserved when
the file is marked as deleted.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.add_existing_file" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#428-445">source</a><h4 class="code-header">pub fn <a href="#method.add_existing_file" class="fn">add_existing_file</a>(
+</div></details><details class="toggle method-toggle" open><summary><section id="method.add_existing_file" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/writer.rs.html#282-299">source</a><h4 class="code-header">pub fn <a href="#method.add_existing_file" class="fn">add_existing_file</a>(
&mut self,
data_file: <a class="struct" href="struct.DataFile.html" title="struct iceberg::spec::DataFile">DataFile</a>,
snapshot_id: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i64.html">i64</a>,
@@ -22,7 +22,7 @@ the file is marked as deleted.</p>
file_sequence_number: <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i64.html">i64</a>>,
) -> <a class="type" href="../type.Result.html" title="type iceberg::Result">Result</a><<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.unit.html">()</a>></h4></section></summary><div class="docblock"><p>Add an file as existing manifest entry. The original data and file sequence numbers, snapshot ID,
which were assigned at commit, must be preserved when adding an existing entry.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.write_manifest_file" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#483-566">source</a><h4 class="code-header">pub async fn <a href="#method.write_manifest_file" class="fn">write_manifest_file</a>(self) -> <a class="type" href="../type.Result.html" title="type iceberg::Result">Result</a><<a class="struct" href="struct.ManifestFile.html" title="struct iceber [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.write_manifest_file" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/writer.rs.html#337-416">source</a><h4 class="code-header">pub async fn <a href="#method.write_manifest_file" class="fn">write_manifest_file</a>(self) -> <a class="type" href="../type.Result.html" title="type iceberg::Result">Result</a><<a class="struct" href="struct.ManifestFile.html" title="struct [...]
</div></details></div></details></div><h2 id="synthetic-implementations" class="section-header">Auto Trait Implementations<a href="#synthetic-implementations" class="anchor">§</a></h2><div id="synthetic-implementations-list"><section id="impl-Freeze-for-ManifestWriter" class="impl"><a href="#impl-Freeze-for-ManifestWriter" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Freeze.html" title="trait core::marker::Fre [...]
T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#141">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="https:/ [...]
diff --git a/api/iceberg/spec/struct.ManifestWriterBuilder.html b/api/iceberg/spec/struct.ManifestWriterBuilder.html
index e322a32b..4a9f55c1 100644
--- a/api/iceberg/spec/struct.ManifestWriterBuilder.html
+++ b/api/iceberg/spec/struct.ManifestWriterBuilder.html
@@ -1,14 +1,14 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="The builder used to create a `ManifestWriter`."><title>ManifestWriterBuilder in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff2, [...]
-</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-ManifestWriterBuilder" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#132-185">source</a><a href="#impl-ManifestWriterBuilder" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.ManifestWr [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="The builder used to create a `ManifestWriter`."><title>ManifestWriterBuilder in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff2, [...]
+</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-ManifestWriterBuilder" class="impl"><a class="src rightside" href="../../src/iceberg/spec/manifest/writer.rs.html#48-101">source</a><a href="#impl-ManifestWriterBuilder" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.Mani [...]
output: <a class="struct" href="../io/struct.OutputFile.html" title="struct iceberg::io::OutputFile">OutputFile</a>,
snapshot_id: <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i64.html">i64</a>>,
key_metadata: <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a><<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>>,
schema: <a class="type" href="type.SchemaRef.html" title="type iceberg::spec::SchemaRef">SchemaRef</a>,
partition_spec: <a class="struct" href="struct.PartitionSpec.html" title="struct iceberg::spec::PartitionSpec">PartitionSpec</a>,
) -> Self</h4></section></summary><div class="docblock"><p>Create a new builder.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.build_v1" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#151-160">source</a><h4 class="code-header">pub fn <a href="#method.build_v1" class="fn">build_v1</a>(self) -> <a class="struct" href="struct.ManifestWriter.html" title="struct iceberg::spec::ManifestWriter">ManifestWriter</a></h4></section></summary><div class="docblock"><p>Build a <a href="struct.Manife [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.build_v2_data" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#163-172">source</a><h4 class="code-header">pub fn <a href="#method.build_v2_data" class="fn">build_v2_data</a>(self) -> <a class="struct" href="struct.ManifestWriter.html" title="struct iceberg::spec::ManifestWriter">ManifestWriter</a></h4></section></summary><div class="docblock"><p>Build a <a href [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.build_v2_deletes" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest.rs.html#175-184">source</a><h4 class="code-header">pub fn <a href="#method.build_v2_deletes" class="fn">build_v2_deletes</a>(self) -> <a class="struct" href="struct.ManifestWriter.html" title="struct iceberg::spec::ManifestWriter">ManifestWriter</a></h4></section></summary><div class="docblock"><p>Build [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.build_v1" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/writer.rs.html#67-76">source</a><h4 class="code-header">pub fn <a href="#method.build_v1" class="fn">build_v1</a>(self) -> <a class="struct" href="struct.ManifestWriter.html" title="struct iceberg::spec::ManifestWriter">ManifestWriter</a></h4></section></summary><div class="docblock"><p>Build a <a href="struct.M [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.build_v2_data" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/writer.rs.html#79-88">source</a><h4 class="code-header">pub fn <a href="#method.build_v2_data" class="fn">build_v2_data</a>(self) -> <a class="struct" href="struct.ManifestWriter.html" title="struct iceberg::spec::ManifestWriter">ManifestWriter</a></h4></section></summary><div class="docblock"><p>Build a <a [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.build_v2_deletes" class="method"><a class="src rightside" href="../../src/iceberg/spec/manifest/writer.rs.html#91-100">source</a><h4 class="code-header">pub fn <a href="#method.build_v2_deletes" class="fn">build_v2_deletes</a>(self) -> <a class="struct" href="struct.ManifestWriter.html" title="struct iceberg::spec::ManifestWriter">ManifestWriter</a></h4></section></summary><div class="docblock"><p> [...]
</div></details></div></details></div><h2 id="synthetic-implementations" class="section-header">Auto Trait Implementations<a href="#synthetic-implementations" class="anchor">§</a></h2><div id="synthetic-implementations-list"><section id="impl-Freeze-for-ManifestWriterBuilder" class="impl"><a href="#impl-Freeze-for-ManifestWriterBuilder" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Freeze.html" title="trait cor [...]
T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#141">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="https:/ [...]
diff --git a/api/iceberg/spec/type.ManifestEntryRef.html b/api/iceberg/spec/type.ManifestEntryRef.html
index 405ac30d..1b496393 100644
--- a/api/iceberg/spec/type.ManifestEntryRef.html
+++ b/api/iceberg/spec/type.ManifestEntryRef.html
@@ -1,2 +1,2 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Reference to `ManifestEntry`."><title>ManifestEntryRef in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff2,FiraSans-Medium-8f9a78 [...]
-</div></details><h2 id="aliased-type" class="section-header">Aliased Type<a href="#aliased-type" class="anchor">§</a></h2><pre class="rust item-decl"><code>struct ManifestEntryRef { <span class="comment">/* private fields */</span> }</code></pre><script src="../../type.impl/alloc/sync/struct.Arc.js" data-self-path="iceberg::spec::manifest::ManifestEntryRef" async></script></section></div></main></body></html>
\ No newline at end of file
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Reference to `ManifestEntry`."><title>ManifestEntryRef in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff2,FiraSans-Medium-8f9a78 [...]
+</div></details><h2 id="aliased-type" class="section-header">Aliased Type<a href="#aliased-type" class="anchor">§</a></h2><pre class="rust item-decl"><code>struct ManifestEntryRef { <span class="comment">/* private fields */</span> }</code></pre><script src="../../type.impl/alloc/sync/struct.Arc.js" data-self-path="iceberg::spec::manifest::entry::ManifestEntryRef" async></script></section></div></main></body></html>
\ No newline at end of file
diff --git a/api/search-index.js b/api/search-index.js
index 347b9a8d..7ef05d43 100644
--- a/api/search-index.js
+++ b/api/search-index.js
@@ -1,5 +1,5 @@
var searchIndex = new Map(JSON.parse('[\
-["iceberg",{"t":"PPPPPKPPPPPFGPPPFFPPPPPPPPPIPPPPPPPPFFFGGPPPFNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMMOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMMQNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNCNNNNNNNNNNNCNMMMOONNNOOONOMNNNNNNONOOMOCOONNNNONCOCMNNNNNNNNNNNNNCCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMMNNNNNNNNNNNNNCOOOOOOOOOOOOOOOOOOOOOOOOOOOOOFFFKSRRSNNNNNNNNHHHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMMNMNMHMNNNNNNNNNNHNNNNNNNNNNPPPPPPPPFKRGFIPPPPPPPPFPPPPPPPPPGGFPPFPIPP [...]
+["iceberg",{"t":"PPPPPKPPPPPFGPPPFFPPPPPPPPPIPPPPPPPPFFFGGPPPFNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMMOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMMQNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNCNNNNNNNNNNNCNMMMOONNNOOONOMNNNNNNONOOMOCOONNNNONCOCMNNNNNNNNNNNNNCCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMMNNNNNNNNNNNNNCOOOOOOOOOOOOOOOOOOOOOOOOOOOOOFFFKSRRSNNNNNNNNHHHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMMNMNMHMNNNNNNNNNNHNNNNNNNNNNPPPPPPPPFKRGFIPPPPPPPPFPPPPPPPPPGGFPPFPIPP [...]
["iceberg_catalog_glue",{"t":"SSSSSFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNQ","n":["AWS_ACCESS_KEY_ID","AWS_PROFILE_NAME","AWS_REGION_NAME","AWS_SECRET_ACCESS_KEY","AWS_SESSION_TOKEN","GlueCatalog","GlueCatalogConfig","borrow","borrow","borrow_mut","borrow_mut","builder","create_namespace","create_table","deref","deref","deref_mut","deref_mut","drop","drop","drop_namespace","drop_table","file_io","fmt","fmt","from","from","get_namespace","init","init","into","into","into_shared","i [...]
["iceberg_catalog_hms",{"t":"PPFFGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN","n":["Buffered","Framed","HmsCatalog","HmsCatalogConfig","HmsThriftTransport","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","builder","create_namespace","create_table","default","deref","deref","deref","deref_mut","deref_mut","deref_mut","drop","drop","drop","drop_namespace","drop_table","file_io","fmt","fmt","fmt","from","from","from","get_namespace","init","init","init","into [...]
["iceberg_catalog_memory",{"t":"FNNNNNNNNNNNNNNNNNNNNNNNNNNN","n":["MemoryCatalog","borrow","borrow_mut","create_namespace","create_table","deref","deref_mut","drop","drop_namespace","drop_table","fmt","from","get_namespace","init","into","list_namespaces","list_tables","load_table","namespace_exists","new","rename_table","table_exists","try_from","try_into","type_id","update_namespace","update_table","vzip"],"q":[[0,"iceberg_catalog_memory"],[28,"iceberg_catalog_memory::catalog"],[29,"i [...]
diff --git a/api/search.desc/iceberg/iceberg-desc-0-.js b/api/search.desc/iceberg/iceberg-desc-0-.js
index d7b88244..fbfc81f5 100644
--- a/api/search.desc/iceberg/iceberg-desc-0-.js
+++ b/api/search.desc/iceberg/iceberg-desc-0-.js
@@ -1 +1 @@
-searchState.loadedDescShard("iceberg", 0, "Apache Iceberg Official Native Rust Implementation\nAdd a new schema to the table\nAdd snapshot to table.\nAdd sort order to table.\nAdd a new partition spec to the table\nAssign a new UUID to the table\nThe catalog API for Iceberg Rust.\nThe table’s current schema id must match the requirement.\nIceberg data is invalid.\nThe table’s default sort order id must match the …\nThe table’s default spec id must match the requirement.\nContains the err [...]
\ No newline at end of file
+searchState.loadedDescShard("iceberg", 0, "Apache Iceberg Official Native Rust Implementation\nAdd a new schema to the table\nAdd snapshot to table.\nAdd sort order to table.\nAdd a new partition spec to the table\nAssign a new UUID to the table\nThe catalog API for Iceberg Rust.\nThe table’s current schema id must match the requirement.\nIceberg data is invalid.\nThe table’s default sort order id must match the …\nThe table’s default spec id must match the requirement.\nContains the err [...]
\ No newline at end of file
diff --git a/api/src-files.js b/api/src-files.js
index 8dfbf981..b9d320c6 100644
--- a/api/src-files.js
+++ b/api/src-files.js
@@ -1,5 +1,5 @@
var srcIndex = new Map(JSON.parse('[\
-["iceberg",["",[["arrow",[],["delete_file_manager.rs","mod.rs","reader.rs","record_batch_projector.rs","record_batch_transformer.rs","schema.rs","value.rs"]],["avro",[],["mod.rs","schema.rs"]],["catalog",[],["mod.rs"]],["expr",[["visitors",[],["bound_predicate_visitor.rs","expression_evaluator.rs","inclusive_metrics_evaluator.rs","inclusive_projection.rs","manifest_evaluator.rs","mod.rs","page_index_evaluator.rs","row_group_metrics_evaluator.rs","strict_metrics_evaluator.rs"]]],["accesso [...]
+["iceberg",["",[["arrow",[],["delete_file_manager.rs","mod.rs","reader.rs","record_batch_projector.rs","record_batch_transformer.rs","schema.rs","value.rs"]],["avro",[],["mod.rs","schema.rs"]],["catalog",[],["mod.rs"]],["expr",[["visitors",[],["bound_predicate_visitor.rs","expression_evaluator.rs","inclusive_metrics_evaluator.rs","inclusive_projection.rs","manifest_evaluator.rs","mod.rs","page_index_evaluator.rs","row_group_metrics_evaluator.rs","strict_metrics_evaluator.rs"]]],["accesso [...]
["iceberg_catalog_glue",["",[],["catalog.rs","error.rs","lib.rs","schema.rs","utils.rs"]]],\
["iceberg_catalog_hms",["",[],["catalog.rs","error.rs","lib.rs","schema.rs","utils.rs"]]],\
["iceberg_catalog_memory",["",[],["catalog.rs","lib.rs","namespace_state.rs"]]],\
diff --git a/api/src/iceberg/spec/manifest.rs.html b/api/src/iceberg/spec/manifest.rs.html
deleted file mode 100644
index f8428136..00000000
--- a/api/src/iceberg/spec/manifest.rs.html
+++ /dev/null
@@ -1,5909 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `crates/iceberg/src/spec/manifest.rs`."><title>manifest.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff2,FiraSans- [...]
-<a href="#2" id="2">2</a>
-<a href="#3" id="3">3</a>
-<a href="#4" id="4">4</a>
-<a href="#5" id="5">5</a>
-<a href="#6" id="6">6</a>
-<a href="#7" id="7">7</a>
-<a href="#8" id="8">8</a>
-<a href="#9" id="9">9</a>
-<a href="#10" id="10">10</a>
-<a href="#11" id="11">11</a>
-<a href="#12" id="12">12</a>
-<a href="#13" id="13">13</a>
-<a href="#14" id="14">14</a>
-<a href="#15" id="15">15</a>
-<a href="#16" id="16">16</a>
-<a href="#17" id="17">17</a>
-<a href="#18" id="18">18</a>
-<a href="#19" id="19">19</a>
-<a href="#20" id="20">20</a>
-<a href="#21" id="21">21</a>
-<a href="#22" id="22">22</a>
-<a href="#23" id="23">23</a>
-<a href="#24" id="24">24</a>
-<a href="#25" id="25">25</a>
-<a href="#26" id="26">26</a>
-<a href="#27" id="27">27</a>
-<a href="#28" id="28">28</a>
-<a href="#29" id="29">29</a>
-<a href="#30" id="30">30</a>
-<a href="#31" id="31">31</a>
-<a href="#32" id="32">32</a>
-<a href="#33" id="33">33</a>
-<a href="#34" id="34">34</a>
-<a href="#35" id="35">35</a>
-<a href="#36" id="36">36</a>
-<a href="#37" id="37">37</a>
-<a href="#38" id="38">38</a>
-<a href="#39" id="39">39</a>
-<a href="#40" id="40">40</a>
-<a href="#41" id="41">41</a>
-<a href="#42" id="42">42</a>
-<a href="#43" id="43">43</a>
-<a href="#44" id="44">44</a>
-<a href="#45" id="45">45</a>
-<a href="#46" id="46">46</a>
-<a href="#47" id="47">47</a>
-<a href="#48" id="48">48</a>
-<a href="#49" id="49">49</a>
-<a href="#50" id="50">50</a>
-<a href="#51" id="51">51</a>
-<a href="#52" id="52">52</a>
-<a href="#53" id="53">53</a>
-<a href="#54" id="54">54</a>
-<a href="#55" id="55">55</a>
-<a href="#56" id="56">56</a>
-<a href="#57" id="57">57</a>
-<a href="#58" id="58">58</a>
-<a href="#59" id="59">59</a>
-<a href="#60" id="60">60</a>
-<a href="#61" id="61">61</a>
-<a href="#62" id="62">62</a>
-<a href="#63" id="63">63</a>
-<a href="#64" id="64">64</a>
-<a href="#65" id="65">65</a>
-<a href="#66" id="66">66</a>
-<a href="#67" id="67">67</a>
-<a href="#68" id="68">68</a>
-<a href="#69" id="69">69</a>
-<a href="#70" id="70">70</a>
-<a href="#71" id="71">71</a>
-<a href="#72" id="72">72</a>
-<a href="#73" id="73">73</a>
-<a href="#74" id="74">74</a>
-<a href="#75" id="75">75</a>
-<a href="#76" id="76">76</a>
-<a href="#77" id="77">77</a>
-<a href="#78" id="78">78</a>
-<a href="#79" id="79">79</a>
-<a href="#80" id="80">80</a>
-<a href="#81" id="81">81</a>
-<a href="#82" id="82">82</a>
-<a href="#83" id="83">83</a>
-<a href="#84" id="84">84</a>
-<a href="#85" id="85">85</a>
-<a href="#86" id="86">86</a>
-<a href="#87" id="87">87</a>
-<a href="#88" id="88">88</a>
-<a href="#89" id="89">89</a>
-<a href="#90" id="90">90</a>
-<a href="#91" id="91">91</a>
-<a href="#92" id="92">92</a>
-<a href="#93" id="93">93</a>
-<a href="#94" id="94">94</a>
-<a href="#95" id="95">95</a>
-<a href="#96" id="96">96</a>
-<a href="#97" id="97">97</a>
-<a href="#98" id="98">98</a>
-<a href="#99" id="99">99</a>
-<a href="#100" id="100">100</a>
-<a href="#101" id="101">101</a>
-<a href="#102" id="102">102</a>
-<a href="#103" id="103">103</a>
-<a href="#104" id="104">104</a>
-<a href="#105" id="105">105</a>
-<a href="#106" id="106">106</a>
-<a href="#107" id="107">107</a>
-<a href="#108" id="108">108</a>
-<a href="#109" id="109">109</a>
-<a href="#110" id="110">110</a>
-<a href="#111" id="111">111</a>
-<a href="#112" id="112">112</a>
-<a href="#113" id="113">113</a>
-<a href="#114" id="114">114</a>
-<a href="#115" id="115">115</a>
-<a href="#116" id="116">116</a>
-<a href="#117" id="117">117</a>
-<a href="#118" id="118">118</a>
-<a href="#119" id="119">119</a>
-<a href="#120" id="120">120</a>
-<a href="#121" id="121">121</a>
-<a href="#122" id="122">122</a>
-<a href="#123" id="123">123</a>
-<a href="#124" id="124">124</a>
-<a href="#125" id="125">125</a>
-<a href="#126" id="126">126</a>
-<a href="#127" id="127">127</a>
-<a href="#128" id="128">128</a>
-<a href="#129" id="129">129</a>
-<a href="#130" id="130">130</a>
-<a href="#131" id="131">131</a>
-<a href="#132" id="132">132</a>
-<a href="#133" id="133">133</a>
-<a href="#134" id="134">134</a>
-<a href="#135" id="135">135</a>
-<a href="#136" id="136">136</a>
-<a href="#137" id="137">137</a>
-<a href="#138" id="138">138</a>
-<a href="#139" id="139">139</a>
-<a href="#140" id="140">140</a>
-<a href="#141" id="141">141</a>
-<a href="#142" id="142">142</a>
-<a href="#143" id="143">143</a>
-<a href="#144" id="144">144</a>
-<a href="#145" id="145">145</a>
-<a href="#146" id="146">146</a>
-<a href="#147" id="147">147</a>
-<a href="#148" id="148">148</a>
-<a href="#149" id="149">149</a>
-<a href="#150" id="150">150</a>
-<a href="#151" id="151">151</a>
-<a href="#152" id="152">152</a>
-<a href="#153" id="153">153</a>
-<a href="#154" id="154">154</a>
-<a href="#155" id="155">155</a>
-<a href="#156" id="156">156</a>
-<a href="#157" id="157">157</a>
-<a href="#158" id="158">158</a>
-<a href="#159" id="159">159</a>
-<a href="#160" id="160">160</a>
-<a href="#161" id="161">161</a>
-<a href="#162" id="162">162</a>
-<a href="#163" id="163">163</a>
-<a href="#164" id="164">164</a>
-<a href="#165" id="165">165</a>
-<a href="#166" id="166">166</a>
-<a href="#167" id="167">167</a>
-<a href="#168" id="168">168</a>
-<a href="#169" id="169">169</a>
-<a href="#170" id="170">170</a>
-<a href="#171" id="171">171</a>
-<a href="#172" id="172">172</a>
-<a href="#173" id="173">173</a>
-<a href="#174" id="174">174</a>
-<a href="#175" id="175">175</a>
-<a href="#176" id="176">176</a>
-<a href="#177" id="177">177</a>
-<a href="#178" id="178">178</a>
-<a href="#179" id="179">179</a>
-<a href="#180" id="180">180</a>
-<a href="#181" id="181">181</a>
-<a href="#182" id="182">182</a>
-<a href="#183" id="183">183</a>
-<a href="#184" id="184">184</a>
-<a href="#185" id="185">185</a>
-<a href="#186" id="186">186</a>
-<a href="#187" id="187">187</a>
-<a href="#188" id="188">188</a>
-<a href="#189" id="189">189</a>
-<a href="#190" id="190">190</a>
-<a href="#191" id="191">191</a>
-<a href="#192" id="192">192</a>
-<a href="#193" id="193">193</a>
-<a href="#194" id="194">194</a>
-<a href="#195" id="195">195</a>
-<a href="#196" id="196">196</a>
-<a href="#197" id="197">197</a>
-<a href="#198" id="198">198</a>
-<a href="#199" id="199">199</a>
-<a href="#200" id="200">200</a>
-<a href="#201" id="201">201</a>
-<a href="#202" id="202">202</a>
-<a href="#203" id="203">203</a>
-<a href="#204" id="204">204</a>
-<a href="#205" id="205">205</a>
-<a href="#206" id="206">206</a>
-<a href="#207" id="207">207</a>
-<a href="#208" id="208">208</a>
-<a href="#209" id="209">209</a>
-<a href="#210" id="210">210</a>
-<a href="#211" id="211">211</a>
-<a href="#212" id="212">212</a>
-<a href="#213" id="213">213</a>
-<a href="#214" id="214">214</a>
-<a href="#215" id="215">215</a>
-<a href="#216" id="216">216</a>
-<a href="#217" id="217">217</a>
-<a href="#218" id="218">218</a>
-<a href="#219" id="219">219</a>
-<a href="#220" id="220">220</a>
-<a href="#221" id="221">221</a>
-<a href="#222" id="222">222</a>
-<a href="#223" id="223">223</a>
-<a href="#224" id="224">224</a>
-<a href="#225" id="225">225</a>
-<a href="#226" id="226">226</a>
-<a href="#227" id="227">227</a>
-<a href="#228" id="228">228</a>
-<a href="#229" id="229">229</a>
-<a href="#230" id="230">230</a>
-<a href="#231" id="231">231</a>
-<a href="#232" id="232">232</a>
-<a href="#233" id="233">233</a>
-<a href="#234" id="234">234</a>
-<a href="#235" id="235">235</a>
-<a href="#236" id="236">236</a>
-<a href="#237" id="237">237</a>
-<a href="#238" id="238">238</a>
-<a href="#239" id="239">239</a>
-<a href="#240" id="240">240</a>
-<a href="#241" id="241">241</a>
-<a href="#242" id="242">242</a>
-<a href="#243" id="243">243</a>
-<a href="#244" id="244">244</a>
-<a href="#245" id="245">245</a>
-<a href="#246" id="246">246</a>
-<a href="#247" id="247">247</a>
-<a href="#248" id="248">248</a>
-<a href="#249" id="249">249</a>
-<a href="#250" id="250">250</a>
-<a href="#251" id="251">251</a>
-<a href="#252" id="252">252</a>
-<a href="#253" id="253">253</a>
-<a href="#254" id="254">254</a>
-<a href="#255" id="255">255</a>
-<a href="#256" id="256">256</a>
-<a href="#257" id="257">257</a>
-<a href="#258" id="258">258</a>
-<a href="#259" id="259">259</a>
-<a href="#260" id="260">260</a>
-<a href="#261" id="261">261</a>
-<a href="#262" id="262">262</a>
-<a href="#263" id="263">263</a>
-<a href="#264" id="264">264</a>
-<a href="#265" id="265">265</a>
-<a href="#266" id="266">266</a>
-<a href="#267" id="267">267</a>
-<a href="#268" id="268">268</a>
-<a href="#269" id="269">269</a>
-<a href="#270" id="270">270</a>
-<a href="#271" id="271">271</a>
-<a href="#272" id="272">272</a>
-<a href="#273" id="273">273</a>
-<a href="#274" id="274">274</a>
-<a href="#275" id="275">275</a>
-<a href="#276" id="276">276</a>
-<a href="#277" id="277">277</a>
-<a href="#278" id="278">278</a>
-<a href="#279" id="279">279</a>
-<a href="#280" id="280">280</a>
-<a href="#281" id="281">281</a>
-<a href="#282" id="282">282</a>
-<a href="#283" id="283">283</a>
-<a href="#284" id="284">284</a>
-<a href="#285" id="285">285</a>
-<a href="#286" id="286">286</a>
-<a href="#287" id="287">287</a>
-<a href="#288" id="288">288</a>
-<a href="#289" id="289">289</a>
-<a href="#290" id="290">290</a>
-<a href="#291" id="291">291</a>
-<a href="#292" id="292">292</a>
-<a href="#293" id="293">293</a>
-<a href="#294" id="294">294</a>
-<a href="#295" id="295">295</a>
-<a href="#296" id="296">296</a>
-<a href="#297" id="297">297</a>
-<a href="#298" id="298">298</a>
-<a href="#299" id="299">299</a>
-<a href="#300" id="300">300</a>
-<a href="#301" id="301">301</a>
-<a href="#302" id="302">302</a>
-<a href="#303" id="303">303</a>
-<a href="#304" id="304">304</a>
-<a href="#305" id="305">305</a>
-<a href="#306" id="306">306</a>
-<a href="#307" id="307">307</a>
-<a href="#308" id="308">308</a>
-<a href="#309" id="309">309</a>
-<a href="#310" id="310">310</a>
-<a href="#311" id="311">311</a>
-<a href="#312" id="312">312</a>
-<a href="#313" id="313">313</a>
-<a href="#314" id="314">314</a>
-<a href="#315" id="315">315</a>
-<a href="#316" id="316">316</a>
-<a href="#317" id="317">317</a>
-<a href="#318" id="318">318</a>
-<a href="#319" id="319">319</a>
-<a href="#320" id="320">320</a>
-<a href="#321" id="321">321</a>
-<a href="#322" id="322">322</a>
-<a href="#323" id="323">323</a>
-<a href="#324" id="324">324</a>
-<a href="#325" id="325">325</a>
-<a href="#326" id="326">326</a>
-<a href="#327" id="327">327</a>
-<a href="#328" id="328">328</a>
-<a href="#329" id="329">329</a>
-<a href="#330" id="330">330</a>
-<a href="#331" id="331">331</a>
-<a href="#332" id="332">332</a>
-<a href="#333" id="333">333</a>
-<a href="#334" id="334">334</a>
-<a href="#335" id="335">335</a>
-<a href="#336" id="336">336</a>
-<a href="#337" id="337">337</a>
-<a href="#338" id="338">338</a>
-<a href="#339" id="339">339</a>
-<a href="#340" id="340">340</a>
-<a href="#341" id="341">341</a>
-<a href="#342" id="342">342</a>
-<a href="#343" id="343">343</a>
-<a href="#344" id="344">344</a>
-<a href="#345" id="345">345</a>
-<a href="#346" id="346">346</a>
-<a href="#347" id="347">347</a>
-<a href="#348" id="348">348</a>
-<a href="#349" id="349">349</a>
-<a href="#350" id="350">350</a>
-<a href="#351" id="351">351</a>
-<a href="#352" id="352">352</a>
-<a href="#353" id="353">353</a>
-<a href="#354" id="354">354</a>
-<a href="#355" id="355">355</a>
-<a href="#356" id="356">356</a>
-<a href="#357" id="357">357</a>
-<a href="#358" id="358">358</a>
-<a href="#359" id="359">359</a>
-<a href="#360" id="360">360</a>
-<a href="#361" id="361">361</a>
-<a href="#362" id="362">362</a>
-<a href="#363" id="363">363</a>
-<a href="#364" id="364">364</a>
-<a href="#365" id="365">365</a>
-<a href="#366" id="366">366</a>
-<a href="#367" id="367">367</a>
-<a href="#368" id="368">368</a>
-<a href="#369" id="369">369</a>
-<a href="#370" id="370">370</a>
-<a href="#371" id="371">371</a>
-<a href="#372" id="372">372</a>
-<a href="#373" id="373">373</a>
-<a href="#374" id="374">374</a>
-<a href="#375" id="375">375</a>
-<a href="#376" id="376">376</a>
-<a href="#377" id="377">377</a>
-<a href="#378" id="378">378</a>
-<a href="#379" id="379">379</a>
-<a href="#380" id="380">380</a>
-<a href="#381" id="381">381</a>
-<a href="#382" id="382">382</a>
-<a href="#383" id="383">383</a>
-<a href="#384" id="384">384</a>
-<a href="#385" id="385">385</a>
-<a href="#386" id="386">386</a>
-<a href="#387" id="387">387</a>
-<a href="#388" id="388">388</a>
-<a href="#389" id="389">389</a>
-<a href="#390" id="390">390</a>
-<a href="#391" id="391">391</a>
-<a href="#392" id="392">392</a>
-<a href="#393" id="393">393</a>
-<a href="#394" id="394">394</a>
-<a href="#395" id="395">395</a>
-<a href="#396" id="396">396</a>
-<a href="#397" id="397">397</a>
-<a href="#398" id="398">398</a>
-<a href="#399" id="399">399</a>
-<a href="#400" id="400">400</a>
-<a href="#401" id="401">401</a>
-<a href="#402" id="402">402</a>
-<a href="#403" id="403">403</a>
-<a href="#404" id="404">404</a>
-<a href="#405" id="405">405</a>
-<a href="#406" id="406">406</a>
-<a href="#407" id="407">407</a>
-<a href="#408" id="408">408</a>
-<a href="#409" id="409">409</a>
-<a href="#410" id="410">410</a>
-<a href="#411" id="411">411</a>
-<a href="#412" id="412">412</a>
-<a href="#413" id="413">413</a>
-<a href="#414" id="414">414</a>
-<a href="#415" id="415">415</a>
-<a href="#416" id="416">416</a>
-<a href="#417" id="417">417</a>
-<a href="#418" id="418">418</a>
-<a href="#419" id="419">419</a>
-<a href="#420" id="420">420</a>
-<a href="#421" id="421">421</a>
-<a href="#422" id="422">422</a>
-<a href="#423" id="423">423</a>
-<a href="#424" id="424">424</a>
-<a href="#425" id="425">425</a>
-<a href="#426" id="426">426</a>
-<a href="#427" id="427">427</a>
-<a href="#428" id="428">428</a>
-<a href="#429" id="429">429</a>
-<a href="#430" id="430">430</a>
-<a href="#431" id="431">431</a>
-<a href="#432" id="432">432</a>
-<a href="#433" id="433">433</a>
-<a href="#434" id="434">434</a>
-<a href="#435" id="435">435</a>
-<a href="#436" id="436">436</a>
-<a href="#437" id="437">437</a>
-<a href="#438" id="438">438</a>
-<a href="#439" id="439">439</a>
-<a href="#440" id="440">440</a>
-<a href="#441" id="441">441</a>
-<a href="#442" id="442">442</a>
-<a href="#443" id="443">443</a>
-<a href="#444" id="444">444</a>
-<a href="#445" id="445">445</a>
-<a href="#446" id="446">446</a>
-<a href="#447" id="447">447</a>
-<a href="#448" id="448">448</a>
-<a href="#449" id="449">449</a>
-<a href="#450" id="450">450</a>
-<a href="#451" id="451">451</a>
-<a href="#452" id="452">452</a>
-<a href="#453" id="453">453</a>
-<a href="#454" id="454">454</a>
-<a href="#455" id="455">455</a>
-<a href="#456" id="456">456</a>
-<a href="#457" id="457">457</a>
-<a href="#458" id="458">458</a>
-<a href="#459" id="459">459</a>
-<a href="#460" id="460">460</a>
-<a href="#461" id="461">461</a>
-<a href="#462" id="462">462</a>
-<a href="#463" id="463">463</a>
-<a href="#464" id="464">464</a>
-<a href="#465" id="465">465</a>
-<a href="#466" id="466">466</a>
-<a href="#467" id="467">467</a>
-<a href="#468" id="468">468</a>
-<a href="#469" id="469">469</a>
-<a href="#470" id="470">470</a>
-<a href="#471" id="471">471</a>
-<a href="#472" id="472">472</a>
-<a href="#473" id="473">473</a>
-<a href="#474" id="474">474</a>
-<a href="#475" id="475">475</a>
-<a href="#476" id="476">476</a>
-<a href="#477" id="477">477</a>
-<a href="#478" id="478">478</a>
-<a href="#479" id="479">479</a>
-<a href="#480" id="480">480</a>
-<a href="#481" id="481">481</a>
-<a href="#482" id="482">482</a>
-<a href="#483" id="483">483</a>
-<a href="#484" id="484">484</a>
-<a href="#485" id="485">485</a>
-<a href="#486" id="486">486</a>
-<a href="#487" id="487">487</a>
-<a href="#488" id="488">488</a>
-<a href="#489" id="489">489</a>
-<a href="#490" id="490">490</a>
-<a href="#491" id="491">491</a>
-<a href="#492" id="492">492</a>
-<a href="#493" id="493">493</a>
-<a href="#494" id="494">494</a>
-<a href="#495" id="495">495</a>
-<a href="#496" id="496">496</a>
-<a href="#497" id="497">497</a>
-<a href="#498" id="498">498</a>
-<a href="#499" id="499">499</a>
-<a href="#500" id="500">500</a>
-<a href="#501" id="501">501</a>
-<a href="#502" id="502">502</a>
-<a href="#503" id="503">503</a>
-<a href="#504" id="504">504</a>
-<a href="#505" id="505">505</a>
-<a href="#506" id="506">506</a>
-<a href="#507" id="507">507</a>
-<a href="#508" id="508">508</a>
-<a href="#509" id="509">509</a>
-<a href="#510" id="510">510</a>
-<a href="#511" id="511">511</a>
-<a href="#512" id="512">512</a>
-<a href="#513" id="513">513</a>
-<a href="#514" id="514">514</a>
-<a href="#515" id="515">515</a>
-<a href="#516" id="516">516</a>
-<a href="#517" id="517">517</a>
-<a href="#518" id="518">518</a>
-<a href="#519" id="519">519</a>
-<a href="#520" id="520">520</a>
-<a href="#521" id="521">521</a>
-<a href="#522" id="522">522</a>
-<a href="#523" id="523">523</a>
-<a href="#524" id="524">524</a>
-<a href="#525" id="525">525</a>
-<a href="#526" id="526">526</a>
-<a href="#527" id="527">527</a>
-<a href="#528" id="528">528</a>
-<a href="#529" id="529">529</a>
-<a href="#530" id="530">530</a>
-<a href="#531" id="531">531</a>
-<a href="#532" id="532">532</a>
-<a href="#533" id="533">533</a>
-<a href="#534" id="534">534</a>
-<a href="#535" id="535">535</a>
-<a href="#536" id="536">536</a>
-<a href="#537" id="537">537</a>
-<a href="#538" id="538">538</a>
-<a href="#539" id="539">539</a>
-<a href="#540" id="540">540</a>
-<a href="#541" id="541">541</a>
-<a href="#542" id="542">542</a>
-<a href="#543" id="543">543</a>
-<a href="#544" id="544">544</a>
-<a href="#545" id="545">545</a>
-<a href="#546" id="546">546</a>
-<a href="#547" id="547">547</a>
-<a href="#548" id="548">548</a>
-<a href="#549" id="549">549</a>
-<a href="#550" id="550">550</a>
-<a href="#551" id="551">551</a>
-<a href="#552" id="552">552</a>
-<a href="#553" id="553">553</a>
-<a href="#554" id="554">554</a>
-<a href="#555" id="555">555</a>
-<a href="#556" id="556">556</a>
-<a href="#557" id="557">557</a>
-<a href="#558" id="558">558</a>
-<a href="#559" id="559">559</a>
-<a href="#560" id="560">560</a>
-<a href="#561" id="561">561</a>
-<a href="#562" id="562">562</a>
-<a href="#563" id="563">563</a>
-<a href="#564" id="564">564</a>
-<a href="#565" id="565">565</a>
-<a href="#566" id="566">566</a>
-<a href="#567" id="567">567</a>
-<a href="#568" id="568">568</a>
-<a href="#569" id="569">569</a>
-<a href="#570" id="570">570</a>
-<a href="#571" id="571">571</a>
-<a href="#572" id="572">572</a>
-<a href="#573" id="573">573</a>
-<a href="#574" id="574">574</a>
-<a href="#575" id="575">575</a>
-<a href="#576" id="576">576</a>
-<a href="#577" id="577">577</a>
-<a href="#578" id="578">578</a>
-<a href="#579" id="579">579</a>
-<a href="#580" id="580">580</a>
-<a href="#581" id="581">581</a>
-<a href="#582" id="582">582</a>
-<a href="#583" id="583">583</a>
-<a href="#584" id="584">584</a>
-<a href="#585" id="585">585</a>
-<a href="#586" id="586">586</a>
-<a href="#587" id="587">587</a>
-<a href="#588" id="588">588</a>
-<a href="#589" id="589">589</a>
-<a href="#590" id="590">590</a>
-<a href="#591" id="591">591</a>
-<a href="#592" id="592">592</a>
-<a href="#593" id="593">593</a>
-<a href="#594" id="594">594</a>
-<a href="#595" id="595">595</a>
-<a href="#596" id="596">596</a>
-<a href="#597" id="597">597</a>
-<a href="#598" id="598">598</a>
-<a href="#599" id="599">599</a>
-<a href="#600" id="600">600</a>
-<a href="#601" id="601">601</a>
-<a href="#602" id="602">602</a>
-<a href="#603" id="603">603</a>
-<a href="#604" id="604">604</a>
-<a href="#605" id="605">605</a>
-<a href="#606" id="606">606</a>
-<a href="#607" id="607">607</a>
-<a href="#608" id="608">608</a>
-<a href="#609" id="609">609</a>
-<a href="#610" id="610">610</a>
-<a href="#611" id="611">611</a>
-<a href="#612" id="612">612</a>
-<a href="#613" id="613">613</a>
-<a href="#614" id="614">614</a>
-<a href="#615" id="615">615</a>
-<a href="#616" id="616">616</a>
-<a href="#617" id="617">617</a>
-<a href="#618" id="618">618</a>
-<a href="#619" id="619">619</a>
-<a href="#620" id="620">620</a>
-<a href="#621" id="621">621</a>
-<a href="#622" id="622">622</a>
-<a href="#623" id="623">623</a>
-<a href="#624" id="624">624</a>
-<a href="#625" id="625">625</a>
-<a href="#626" id="626">626</a>
-<a href="#627" id="627">627</a>
-<a href="#628" id="628">628</a>
-<a href="#629" id="629">629</a>
-<a href="#630" id="630">630</a>
-<a href="#631" id="631">631</a>
-<a href="#632" id="632">632</a>
-<a href="#633" id="633">633</a>
-<a href="#634" id="634">634</a>
-<a href="#635" id="635">635</a>
-<a href="#636" id="636">636</a>
-<a href="#637" id="637">637</a>
-<a href="#638" id="638">638</a>
-<a href="#639" id="639">639</a>
-<a href="#640" id="640">640</a>
-<a href="#641" id="641">641</a>
-<a href="#642" id="642">642</a>
-<a href="#643" id="643">643</a>
-<a href="#644" id="644">644</a>
-<a href="#645" id="645">645</a>
-<a href="#646" id="646">646</a>
-<a href="#647" id="647">647</a>
-<a href="#648" id="648">648</a>
-<a href="#649" id="649">649</a>
-<a href="#650" id="650">650</a>
-<a href="#651" id="651">651</a>
-<a href="#652" id="652">652</a>
-<a href="#653" id="653">653</a>
-<a href="#654" id="654">654</a>
-<a href="#655" id="655">655</a>
-<a href="#656" id="656">656</a>
-<a href="#657" id="657">657</a>
-<a href="#658" id="658">658</a>
-<a href="#659" id="659">659</a>
-<a href="#660" id="660">660</a>
-<a href="#661" id="661">661</a>
-<a href="#662" id="662">662</a>
-<a href="#663" id="663">663</a>
-<a href="#664" id="664">664</a>
-<a href="#665" id="665">665</a>
-<a href="#666" id="666">666</a>
-<a href="#667" id="667">667</a>
-<a href="#668" id="668">668</a>
-<a href="#669" id="669">669</a>
-<a href="#670" id="670">670</a>
-<a href="#671" id="671">671</a>
-<a href="#672" id="672">672</a>
-<a href="#673" id="673">673</a>
-<a href="#674" id="674">674</a>
-<a href="#675" id="675">675</a>
-<a href="#676" id="676">676</a>
-<a href="#677" id="677">677</a>
-<a href="#678" id="678">678</a>
-<a href="#679" id="679">679</a>
-<a href="#680" id="680">680</a>
-<a href="#681" id="681">681</a>
-<a href="#682" id="682">682</a>
-<a href="#683" id="683">683</a>
-<a href="#684" id="684">684</a>
-<a href="#685" id="685">685</a>
-<a href="#686" id="686">686</a>
-<a href="#687" id="687">687</a>
-<a href="#688" id="688">688</a>
-<a href="#689" id="689">689</a>
-<a href="#690" id="690">690</a>
-<a href="#691" id="691">691</a>
-<a href="#692" id="692">692</a>
-<a href="#693" id="693">693</a>
-<a href="#694" id="694">694</a>
-<a href="#695" id="695">695</a>
-<a href="#696" id="696">696</a>
-<a href="#697" id="697">697</a>
-<a href="#698" id="698">698</a>
-<a href="#699" id="699">699</a>
-<a href="#700" id="700">700</a>
-<a href="#701" id="701">701</a>
-<a href="#702" id="702">702</a>
-<a href="#703" id="703">703</a>
-<a href="#704" id="704">704</a>
-<a href="#705" id="705">705</a>
-<a href="#706" id="706">706</a>
-<a href="#707" id="707">707</a>
-<a href="#708" id="708">708</a>
-<a href="#709" id="709">709</a>
-<a href="#710" id="710">710</a>
-<a href="#711" id="711">711</a>
-<a href="#712" id="712">712</a>
-<a href="#713" id="713">713</a>
-<a href="#714" id="714">714</a>
-<a href="#715" id="715">715</a>
-<a href="#716" id="716">716</a>
-<a href="#717" id="717">717</a>
-<a href="#718" id="718">718</a>
-<a href="#719" id="719">719</a>
-<a href="#720" id="720">720</a>
-<a href="#721" id="721">721</a>
-<a href="#722" id="722">722</a>
-<a href="#723" id="723">723</a>
-<a href="#724" id="724">724</a>
-<a href="#725" id="725">725</a>
-<a href="#726" id="726">726</a>
-<a href="#727" id="727">727</a>
-<a href="#728" id="728">728</a>
-<a href="#729" id="729">729</a>
-<a href="#730" id="730">730</a>
-<a href="#731" id="731">731</a>
-<a href="#732" id="732">732</a>
-<a href="#733" id="733">733</a>
-<a href="#734" id="734">734</a>
-<a href="#735" id="735">735</a>
-<a href="#736" id="736">736</a>
-<a href="#737" id="737">737</a>
-<a href="#738" id="738">738</a>
-<a href="#739" id="739">739</a>
-<a href="#740" id="740">740</a>
-<a href="#741" id="741">741</a>
-<a href="#742" id="742">742</a>
-<a href="#743" id="743">743</a>
-<a href="#744" id="744">744</a>
-<a href="#745" id="745">745</a>
-<a href="#746" id="746">746</a>
-<a href="#747" id="747">747</a>
-<a href="#748" id="748">748</a>
-<a href="#749" id="749">749</a>
-<a href="#750" id="750">750</a>
-<a href="#751" id="751">751</a>
-<a href="#752" id="752">752</a>
-<a href="#753" id="753">753</a>
-<a href="#754" id="754">754</a>
-<a href="#755" id="755">755</a>
-<a href="#756" id="756">756</a>
-<a href="#757" id="757">757</a>
-<a href="#758" id="758">758</a>
-<a href="#759" id="759">759</a>
-<a href="#760" id="760">760</a>
-<a href="#761" id="761">761</a>
-<a href="#762" id="762">762</a>
-<a href="#763" id="763">763</a>
-<a href="#764" id="764">764</a>
-<a href="#765" id="765">765</a>
-<a href="#766" id="766">766</a>
-<a href="#767" id="767">767</a>
-<a href="#768" id="768">768</a>
-<a href="#769" id="769">769</a>
-<a href="#770" id="770">770</a>
-<a href="#771" id="771">771</a>
-<a href="#772" id="772">772</a>
-<a href="#773" id="773">773</a>
-<a href="#774" id="774">774</a>
-<a href="#775" id="775">775</a>
-<a href="#776" id="776">776</a>
-<a href="#777" id="777">777</a>
-<a href="#778" id="778">778</a>
-<a href="#779" id="779">779</a>
-<a href="#780" id="780">780</a>
-<a href="#781" id="781">781</a>
-<a href="#782" id="782">782</a>
-<a href="#783" id="783">783</a>
-<a href="#784" id="784">784</a>
-<a href="#785" id="785">785</a>
-<a href="#786" id="786">786</a>
-<a href="#787" id="787">787</a>
-<a href="#788" id="788">788</a>
-<a href="#789" id="789">789</a>
-<a href="#790" id="790">790</a>
-<a href="#791" id="791">791</a>
-<a href="#792" id="792">792</a>
-<a href="#793" id="793">793</a>
-<a href="#794" id="794">794</a>
-<a href="#795" id="795">795</a>
-<a href="#796" id="796">796</a>
-<a href="#797" id="797">797</a>
-<a href="#798" id="798">798</a>
-<a href="#799" id="799">799</a>
-<a href="#800" id="800">800</a>
-<a href="#801" id="801">801</a>
-<a href="#802" id="802">802</a>
-<a href="#803" id="803">803</a>
-<a href="#804" id="804">804</a>
-<a href="#805" id="805">805</a>
-<a href="#806" id="806">806</a>
-<a href="#807" id="807">807</a>
-<a href="#808" id="808">808</a>
-<a href="#809" id="809">809</a>
-<a href="#810" id="810">810</a>
-<a href="#811" id="811">811</a>
-<a href="#812" id="812">812</a>
-<a href="#813" id="813">813</a>
-<a href="#814" id="814">814</a>
-<a href="#815" id="815">815</a>
-<a href="#816" id="816">816</a>
-<a href="#817" id="817">817</a>
-<a href="#818" id="818">818</a>
-<a href="#819" id="819">819</a>
-<a href="#820" id="820">820</a>
-<a href="#821" id="821">821</a>
-<a href="#822" id="822">822</a>
-<a href="#823" id="823">823</a>
-<a href="#824" id="824">824</a>
-<a href="#825" id="825">825</a>
-<a href="#826" id="826">826</a>
-<a href="#827" id="827">827</a>
-<a href="#828" id="828">828</a>
-<a href="#829" id="829">829</a>
-<a href="#830" id="830">830</a>
-<a href="#831" id="831">831</a>
-<a href="#832" id="832">832</a>
-<a href="#833" id="833">833</a>
-<a href="#834" id="834">834</a>
-<a href="#835" id="835">835</a>
-<a href="#836" id="836">836</a>
-<a href="#837" id="837">837</a>
-<a href="#838" id="838">838</a>
-<a href="#839" id="839">839</a>
-<a href="#840" id="840">840</a>
-<a href="#841" id="841">841</a>
-<a href="#842" id="842">842</a>
-<a href="#843" id="843">843</a>
-<a href="#844" id="844">844</a>
-<a href="#845" id="845">845</a>
-<a href="#846" id="846">846</a>
-<a href="#847" id="847">847</a>
-<a href="#848" id="848">848</a>
-<a href="#849" id="849">849</a>
-<a href="#850" id="850">850</a>
-<a href="#851" id="851">851</a>
-<a href="#852" id="852">852</a>
-<a href="#853" id="853">853</a>
-<a href="#854" id="854">854</a>
-<a href="#855" id="855">855</a>
-<a href="#856" id="856">856</a>
-<a href="#857" id="857">857</a>
-<a href="#858" id="858">858</a>
-<a href="#859" id="859">859</a>
-<a href="#860" id="860">860</a>
-<a href="#861" id="861">861</a>
-<a href="#862" id="862">862</a>
-<a href="#863" id="863">863</a>
-<a href="#864" id="864">864</a>
-<a href="#865" id="865">865</a>
-<a href="#866" id="866">866</a>
-<a href="#867" id="867">867</a>
-<a href="#868" id="868">868</a>
-<a href="#869" id="869">869</a>
-<a href="#870" id="870">870</a>
-<a href="#871" id="871">871</a>
-<a href="#872" id="872">872</a>
-<a href="#873" id="873">873</a>
-<a href="#874" id="874">874</a>
-<a href="#875" id="875">875</a>
-<a href="#876" id="876">876</a>
-<a href="#877" id="877">877</a>
-<a href="#878" id="878">878</a>
-<a href="#879" id="879">879</a>
-<a href="#880" id="880">880</a>
-<a href="#881" id="881">881</a>
-<a href="#882" id="882">882</a>
-<a href="#883" id="883">883</a>
-<a href="#884" id="884">884</a>
-<a href="#885" id="885">885</a>
-<a href="#886" id="886">886</a>
-<a href="#887" id="887">887</a>
-<a href="#888" id="888">888</a>
-<a href="#889" id="889">889</a>
-<a href="#890" id="890">890</a>
-<a href="#891" id="891">891</a>
-<a href="#892" id="892">892</a>
-<a href="#893" id="893">893</a>
-<a href="#894" id="894">894</a>
-<a href="#895" id="895">895</a>
-<a href="#896" id="896">896</a>
-<a href="#897" id="897">897</a>
-<a href="#898" id="898">898</a>
-<a href="#899" id="899">899</a>
-<a href="#900" id="900">900</a>
-<a href="#901" id="901">901</a>
-<a href="#902" id="902">902</a>
-<a href="#903" id="903">903</a>
-<a href="#904" id="904">904</a>
-<a href="#905" id="905">905</a>
-<a href="#906" id="906">906</a>
-<a href="#907" id="907">907</a>
-<a href="#908" id="908">908</a>
-<a href="#909" id="909">909</a>
-<a href="#910" id="910">910</a>
-<a href="#911" id="911">911</a>
-<a href="#912" id="912">912</a>
-<a href="#913" id="913">913</a>
-<a href="#914" id="914">914</a>
-<a href="#915" id="915">915</a>
-<a href="#916" id="916">916</a>
-<a href="#917" id="917">917</a>
-<a href="#918" id="918">918</a>
-<a href="#919" id="919">919</a>
-<a href="#920" id="920">920</a>
-<a href="#921" id="921">921</a>
-<a href="#922" id="922">922</a>
-<a href="#923" id="923">923</a>
-<a href="#924" id="924">924</a>
-<a href="#925" id="925">925</a>
-<a href="#926" id="926">926</a>
-<a href="#927" id="927">927</a>
-<a href="#928" id="928">928</a>
-<a href="#929" id="929">929</a>
-<a href="#930" id="930">930</a>
-<a href="#931" id="931">931</a>
-<a href="#932" id="932">932</a>
-<a href="#933" id="933">933</a>
-<a href="#934" id="934">934</a>
-<a href="#935" id="935">935</a>
-<a href="#936" id="936">936</a>
-<a href="#937" id="937">937</a>
-<a href="#938" id="938">938</a>
-<a href="#939" id="939">939</a>
-<a href="#940" id="940">940</a>
-<a href="#941" id="941">941</a>
-<a href="#942" id="942">942</a>
-<a href="#943" id="943">943</a>
-<a href="#944" id="944">944</a>
-<a href="#945" id="945">945</a>
-<a href="#946" id="946">946</a>
-<a href="#947" id="947">947</a>
-<a href="#948" id="948">948</a>
-<a href="#949" id="949">949</a>
-<a href="#950" id="950">950</a>
-<a href="#951" id="951">951</a>
-<a href="#952" id="952">952</a>
-<a href="#953" id="953">953</a>
-<a href="#954" id="954">954</a>
-<a href="#955" id="955">955</a>
-<a href="#956" id="956">956</a>
-<a href="#957" id="957">957</a>
-<a href="#958" id="958">958</a>
-<a href="#959" id="959">959</a>
-<a href="#960" id="960">960</a>
-<a href="#961" id="961">961</a>
-<a href="#962" id="962">962</a>
-<a href="#963" id="963">963</a>
-<a href="#964" id="964">964</a>
-<a href="#965" id="965">965</a>
-<a href="#966" id="966">966</a>
-<a href="#967" id="967">967</a>
-<a href="#968" id="968">968</a>
-<a href="#969" id="969">969</a>
-<a href="#970" id="970">970</a>
-<a href="#971" id="971">971</a>
-<a href="#972" id="972">972</a>
-<a href="#973" id="973">973</a>
-<a href="#974" id="974">974</a>
-<a href="#975" id="975">975</a>
-<a href="#976" id="976">976</a>
-<a href="#977" id="977">977</a>
-<a href="#978" id="978">978</a>
-<a href="#979" id="979">979</a>
-<a href="#980" id="980">980</a>
-<a href="#981" id="981">981</a>
-<a href="#982" id="982">982</a>
-<a href="#983" id="983">983</a>
-<a href="#984" id="984">984</a>
-<a href="#985" id="985">985</a>
-<a href="#986" id="986">986</a>
-<a href="#987" id="987">987</a>
-<a href="#988" id="988">988</a>
-<a href="#989" id="989">989</a>
-<a href="#990" id="990">990</a>
-<a href="#991" id="991">991</a>
-<a href="#992" id="992">992</a>
-<a href="#993" id="993">993</a>
-<a href="#994" id="994">994</a>
-<a href="#995" id="995">995</a>
-<a href="#996" id="996">996</a>
-<a href="#997" id="997">997</a>
-<a href="#998" id="998">998</a>
-<a href="#999" id="999">999</a>
-<a href="#1000" id="1000">1000</a>
-<a href="#1001" id="1001">1001</a>
-<a href="#1002" id="1002">1002</a>
-<a href="#1003" id="1003">1003</a>
-<a href="#1004" id="1004">1004</a>
-<a href="#1005" id="1005">1005</a>
-<a href="#1006" id="1006">1006</a>
-<a href="#1007" id="1007">1007</a>
-<a href="#1008" id="1008">1008</a>
-<a href="#1009" id="1009">1009</a>
-<a href="#1010" id="1010">1010</a>
-<a href="#1011" id="1011">1011</a>
-<a href="#1012" id="1012">1012</a>
-<a href="#1013" id="1013">1013</a>
-<a href="#1014" id="1014">1014</a>
-<a href="#1015" id="1015">1015</a>
-<a href="#1016" id="1016">1016</a>
-<a href="#1017" id="1017">1017</a>
-<a href="#1018" id="1018">1018</a>
-<a href="#1019" id="1019">1019</a>
-<a href="#1020" id="1020">1020</a>
-<a href="#1021" id="1021">1021</a>
-<a href="#1022" id="1022">1022</a>
-<a href="#1023" id="1023">1023</a>
-<a href="#1024" id="1024">1024</a>
-<a href="#1025" id="1025">1025</a>
-<a href="#1026" id="1026">1026</a>
-<a href="#1027" id="1027">1027</a>
-<a href="#1028" id="1028">1028</a>
-<a href="#1029" id="1029">1029</a>
-<a href="#1030" id="1030">1030</a>
-<a href="#1031" id="1031">1031</a>
-<a href="#1032" id="1032">1032</a>
-<a href="#1033" id="1033">1033</a>
-<a href="#1034" id="1034">1034</a>
-<a href="#1035" id="1035">1035</a>
-<a href="#1036" id="1036">1036</a>
-<a href="#1037" id="1037">1037</a>
-<a href="#1038" id="1038">1038</a>
-<a href="#1039" id="1039">1039</a>
-<a href="#1040" id="1040">1040</a>
-<a href="#1041" id="1041">1041</a>
-<a href="#1042" id="1042">1042</a>
-<a href="#1043" id="1043">1043</a>
-<a href="#1044" id="1044">1044</a>
-<a href="#1045" id="1045">1045</a>
-<a href="#1046" id="1046">1046</a>
-<a href="#1047" id="1047">1047</a>
-<a href="#1048" id="1048">1048</a>
-<a href="#1049" id="1049">1049</a>
-<a href="#1050" id="1050">1050</a>
-<a href="#1051" id="1051">1051</a>
-<a href="#1052" id="1052">1052</a>
-<a href="#1053" id="1053">1053</a>
-<a href="#1054" id="1054">1054</a>
-<a href="#1055" id="1055">1055</a>
-<a href="#1056" id="1056">1056</a>
-<a href="#1057" id="1057">1057</a>
-<a href="#1058" id="1058">1058</a>
-<a href="#1059" id="1059">1059</a>
-<a href="#1060" id="1060">1060</a>
-<a href="#1061" id="1061">1061</a>
-<a href="#1062" id="1062">1062</a>
-<a href="#1063" id="1063">1063</a>
-<a href="#1064" id="1064">1064</a>
-<a href="#1065" id="1065">1065</a>
-<a href="#1066" id="1066">1066</a>
-<a href="#1067" id="1067">1067</a>
-<a href="#1068" id="1068">1068</a>
-<a href="#1069" id="1069">1069</a>
-<a href="#1070" id="1070">1070</a>
-<a href="#1071" id="1071">1071</a>
-<a href="#1072" id="1072">1072</a>
-<a href="#1073" id="1073">1073</a>
-<a href="#1074" id="1074">1074</a>
-<a href="#1075" id="1075">1075</a>
-<a href="#1076" id="1076">1076</a>
-<a href="#1077" id="1077">1077</a>
-<a href="#1078" id="1078">1078</a>
-<a href="#1079" id="1079">1079</a>
-<a href="#1080" id="1080">1080</a>
-<a href="#1081" id="1081">1081</a>
-<a href="#1082" id="1082">1082</a>
-<a href="#1083" id="1083">1083</a>
-<a href="#1084" id="1084">1084</a>
-<a href="#1085" id="1085">1085</a>
-<a href="#1086" id="1086">1086</a>
-<a href="#1087" id="1087">1087</a>
-<a href="#1088" id="1088">1088</a>
-<a href="#1089" id="1089">1089</a>
-<a href="#1090" id="1090">1090</a>
-<a href="#1091" id="1091">1091</a>
-<a href="#1092" id="1092">1092</a>
-<a href="#1093" id="1093">1093</a>
-<a href="#1094" id="1094">1094</a>
-<a href="#1095" id="1095">1095</a>
-<a href="#1096" id="1096">1096</a>
-<a href="#1097" id="1097">1097</a>
-<a href="#1098" id="1098">1098</a>
-<a href="#1099" id="1099">1099</a>
-<a href="#1100" id="1100">1100</a>
-<a href="#1101" id="1101">1101</a>
-<a href="#1102" id="1102">1102</a>
-<a href="#1103" id="1103">1103</a>
-<a href="#1104" id="1104">1104</a>
-<a href="#1105" id="1105">1105</a>
-<a href="#1106" id="1106">1106</a>
-<a href="#1107" id="1107">1107</a>
-<a href="#1108" id="1108">1108</a>
-<a href="#1109" id="1109">1109</a>
-<a href="#1110" id="1110">1110</a>
-<a href="#1111" id="1111">1111</a>
-<a href="#1112" id="1112">1112</a>
-<a href="#1113" id="1113">1113</a>
-<a href="#1114" id="1114">1114</a>
-<a href="#1115" id="1115">1115</a>
-<a href="#1116" id="1116">1116</a>
-<a href="#1117" id="1117">1117</a>
-<a href="#1118" id="1118">1118</a>
-<a href="#1119" id="1119">1119</a>
-<a href="#1120" id="1120">1120</a>
-<a href="#1121" id="1121">1121</a>
-<a href="#1122" id="1122">1122</a>
-<a href="#1123" id="1123">1123</a>
-<a href="#1124" id="1124">1124</a>
-<a href="#1125" id="1125">1125</a>
-<a href="#1126" id="1126">1126</a>
-<a href="#1127" id="1127">1127</a>
-<a href="#1128" id="1128">1128</a>
-<a href="#1129" id="1129">1129</a>
-<a href="#1130" id="1130">1130</a>
-<a href="#1131" id="1131">1131</a>
-<a href="#1132" id="1132">1132</a>
-<a href="#1133" id="1133">1133</a>
-<a href="#1134" id="1134">1134</a>
-<a href="#1135" id="1135">1135</a>
-<a href="#1136" id="1136">1136</a>
-<a href="#1137" id="1137">1137</a>
-<a href="#1138" id="1138">1138</a>
-<a href="#1139" id="1139">1139</a>
-<a href="#1140" id="1140">1140</a>
-<a href="#1141" id="1141">1141</a>
-<a href="#1142" id="1142">1142</a>
-<a href="#1143" id="1143">1143</a>
-<a href="#1144" id="1144">1144</a>
-<a href="#1145" id="1145">1145</a>
-<a href="#1146" id="1146">1146</a>
-<a href="#1147" id="1147">1147</a>
-<a href="#1148" id="1148">1148</a>
-<a href="#1149" id="1149">1149</a>
-<a href="#1150" id="1150">1150</a>
-<a href="#1151" id="1151">1151</a>
-<a href="#1152" id="1152">1152</a>
-<a href="#1153" id="1153">1153</a>
-<a href="#1154" id="1154">1154</a>
-<a href="#1155" id="1155">1155</a>
-<a href="#1156" id="1156">1156</a>
-<a href="#1157" id="1157">1157</a>
-<a href="#1158" id="1158">1158</a>
-<a href="#1159" id="1159">1159</a>
-<a href="#1160" id="1160">1160</a>
-<a href="#1161" id="1161">1161</a>
-<a href="#1162" id="1162">1162</a>
-<a href="#1163" id="1163">1163</a>
-<a href="#1164" id="1164">1164</a>
-<a href="#1165" id="1165">1165</a>
-<a href="#1166" id="1166">1166</a>
-<a href="#1167" id="1167">1167</a>
-<a href="#1168" id="1168">1168</a>
-<a href="#1169" id="1169">1169</a>
-<a href="#1170" id="1170">1170</a>
-<a href="#1171" id="1171">1171</a>
-<a href="#1172" id="1172">1172</a>
-<a href="#1173" id="1173">1173</a>
-<a href="#1174" id="1174">1174</a>
-<a href="#1175" id="1175">1175</a>
-<a href="#1176" id="1176">1176</a>
-<a href="#1177" id="1177">1177</a>
-<a href="#1178" id="1178">1178</a>
-<a href="#1179" id="1179">1179</a>
-<a href="#1180" id="1180">1180</a>
-<a href="#1181" id="1181">1181</a>
-<a href="#1182" id="1182">1182</a>
-<a href="#1183" id="1183">1183</a>
-<a href="#1184" id="1184">1184</a>
-<a href="#1185" id="1185">1185</a>
-<a href="#1186" id="1186">1186</a>
-<a href="#1187" id="1187">1187</a>
-<a href="#1188" id="1188">1188</a>
-<a href="#1189" id="1189">1189</a>
-<a href="#1190" id="1190">1190</a>
-<a href="#1191" id="1191">1191</a>
-<a href="#1192" id="1192">1192</a>
-<a href="#1193" id="1193">1193</a>
-<a href="#1194" id="1194">1194</a>
-<a href="#1195" id="1195">1195</a>
-<a href="#1196" id="1196">1196</a>
-<a href="#1197" id="1197">1197</a>
-<a href="#1198" id="1198">1198</a>
-<a href="#1199" id="1199">1199</a>
-<a href="#1200" id="1200">1200</a>
-<a href="#1201" id="1201">1201</a>
-<a href="#1202" id="1202">1202</a>
-<a href="#1203" id="1203">1203</a>
-<a href="#1204" id="1204">1204</a>
-<a href="#1205" id="1205">1205</a>
-<a href="#1206" id="1206">1206</a>
-<a href="#1207" id="1207">1207</a>
-<a href="#1208" id="1208">1208</a>
-<a href="#1209" id="1209">1209</a>
-<a href="#1210" id="1210">1210</a>
-<a href="#1211" id="1211">1211</a>
-<a href="#1212" id="1212">1212</a>
-<a href="#1213" id="1213">1213</a>
-<a href="#1214" id="1214">1214</a>
-<a href="#1215" id="1215">1215</a>
-<a href="#1216" id="1216">1216</a>
-<a href="#1217" id="1217">1217</a>
-<a href="#1218" id="1218">1218</a>
-<a href="#1219" id="1219">1219</a>
-<a href="#1220" id="1220">1220</a>
-<a href="#1221" id="1221">1221</a>
-<a href="#1222" id="1222">1222</a>
-<a href="#1223" id="1223">1223</a>
-<a href="#1224" id="1224">1224</a>
-<a href="#1225" id="1225">1225</a>
-<a href="#1226" id="1226">1226</a>
-<a href="#1227" id="1227">1227</a>
-<a href="#1228" id="1228">1228</a>
-<a href="#1229" id="1229">1229</a>
-<a href="#1230" id="1230">1230</a>
-<a href="#1231" id="1231">1231</a>
-<a href="#1232" id="1232">1232</a>
-<a href="#1233" id="1233">1233</a>
-<a href="#1234" id="1234">1234</a>
-<a href="#1235" id="1235">1235</a>
-<a href="#1236" id="1236">1236</a>
-<a href="#1237" id="1237">1237</a>
-<a href="#1238" id="1238">1238</a>
-<a href="#1239" id="1239">1239</a>
-<a href="#1240" id="1240">1240</a>
-<a href="#1241" id="1241">1241</a>
-<a href="#1242" id="1242">1242</a>
-<a href="#1243" id="1243">1243</a>
-<a href="#1244" id="1244">1244</a>
-<a href="#1245" id="1245">1245</a>
-<a href="#1246" id="1246">1246</a>
-<a href="#1247" id="1247">1247</a>
-<a href="#1248" id="1248">1248</a>
-<a href="#1249" id="1249">1249</a>
-<a href="#1250" id="1250">1250</a>
-<a href="#1251" id="1251">1251</a>
-<a href="#1252" id="1252">1252</a>
-<a href="#1253" id="1253">1253</a>
-<a href="#1254" id="1254">1254</a>
-<a href="#1255" id="1255">1255</a>
-<a href="#1256" id="1256">1256</a>
-<a href="#1257" id="1257">1257</a>
-<a href="#1258" id="1258">1258</a>
-<a href="#1259" id="1259">1259</a>
-<a href="#1260" id="1260">1260</a>
-<a href="#1261" id="1261">1261</a>
-<a href="#1262" id="1262">1262</a>
-<a href="#1263" id="1263">1263</a>
-<a href="#1264" id="1264">1264</a>
-<a href="#1265" id="1265">1265</a>
-<a href="#1266" id="1266">1266</a>
-<a href="#1267" id="1267">1267</a>
-<a href="#1268" id="1268">1268</a>
-<a href="#1269" id="1269">1269</a>
-<a href="#1270" id="1270">1270</a>
-<a href="#1271" id="1271">1271</a>
-<a href="#1272" id="1272">1272</a>
-<a href="#1273" id="1273">1273</a>
-<a href="#1274" id="1274">1274</a>
-<a href="#1275" id="1275">1275</a>
-<a href="#1276" id="1276">1276</a>
-<a href="#1277" id="1277">1277</a>
-<a href="#1278" id="1278">1278</a>
-<a href="#1279" id="1279">1279</a>
-<a href="#1280" id="1280">1280</a>
-<a href="#1281" id="1281">1281</a>
-<a href="#1282" id="1282">1282</a>
-<a href="#1283" id="1283">1283</a>
-<a href="#1284" id="1284">1284</a>
-<a href="#1285" id="1285">1285</a>
-<a href="#1286" id="1286">1286</a>
-<a href="#1287" id="1287">1287</a>
-<a href="#1288" id="1288">1288</a>
-<a href="#1289" id="1289">1289</a>
-<a href="#1290" id="1290">1290</a>
-<a href="#1291" id="1291">1291</a>
-<a href="#1292" id="1292">1292</a>
-<a href="#1293" id="1293">1293</a>
-<a href="#1294" id="1294">1294</a>
-<a href="#1295" id="1295">1295</a>
-<a href="#1296" id="1296">1296</a>
-<a href="#1297" id="1297">1297</a>
-<a href="#1298" id="1298">1298</a>
-<a href="#1299" id="1299">1299</a>
-<a href="#1300" id="1300">1300</a>
-<a href="#1301" id="1301">1301</a>
-<a href="#1302" id="1302">1302</a>
-<a href="#1303" id="1303">1303</a>
-<a href="#1304" id="1304">1304</a>
-<a href="#1305" id="1305">1305</a>
-<a href="#1306" id="1306">1306</a>
-<a href="#1307" id="1307">1307</a>
-<a href="#1308" id="1308">1308</a>
-<a href="#1309" id="1309">1309</a>
-<a href="#1310" id="1310">1310</a>
-<a href="#1311" id="1311">1311</a>
-<a href="#1312" id="1312">1312</a>
-<a href="#1313" id="1313">1313</a>
-<a href="#1314" id="1314">1314</a>
-<a href="#1315" id="1315">1315</a>
-<a href="#1316" id="1316">1316</a>
-<a href="#1317" id="1317">1317</a>
-<a href="#1318" id="1318">1318</a>
-<a href="#1319" id="1319">1319</a>
-<a href="#1320" id="1320">1320</a>
-<a href="#1321" id="1321">1321</a>
-<a href="#1322" id="1322">1322</a>
-<a href="#1323" id="1323">1323</a>
-<a href="#1324" id="1324">1324</a>
-<a href="#1325" id="1325">1325</a>
-<a href="#1326" id="1326">1326</a>
-<a href="#1327" id="1327">1327</a>
-<a href="#1328" id="1328">1328</a>
-<a href="#1329" id="1329">1329</a>
-<a href="#1330" id="1330">1330</a>
-<a href="#1331" id="1331">1331</a>
-<a href="#1332" id="1332">1332</a>
-<a href="#1333" id="1333">1333</a>
-<a href="#1334" id="1334">1334</a>
-<a href="#1335" id="1335">1335</a>
-<a href="#1336" id="1336">1336</a>
-<a href="#1337" id="1337">1337</a>
-<a href="#1338" id="1338">1338</a>
-<a href="#1339" id="1339">1339</a>
-<a href="#1340" id="1340">1340</a>
-<a href="#1341" id="1341">1341</a>
-<a href="#1342" id="1342">1342</a>
-<a href="#1343" id="1343">1343</a>
-<a href="#1344" id="1344">1344</a>
-<a href="#1345" id="1345">1345</a>
-<a href="#1346" id="1346">1346</a>
-<a href="#1347" id="1347">1347</a>
-<a href="#1348" id="1348">1348</a>
-<a href="#1349" id="1349">1349</a>
-<a href="#1350" id="1350">1350</a>
-<a href="#1351" id="1351">1351</a>
-<a href="#1352" id="1352">1352</a>
-<a href="#1353" id="1353">1353</a>
-<a href="#1354" id="1354">1354</a>
-<a href="#1355" id="1355">1355</a>
-<a href="#1356" id="1356">1356</a>
-<a href="#1357" id="1357">1357</a>
-<a href="#1358" id="1358">1358</a>
-<a href="#1359" id="1359">1359</a>
-<a href="#1360" id="1360">1360</a>
-<a href="#1361" id="1361">1361</a>
-<a href="#1362" id="1362">1362</a>
-<a href="#1363" id="1363">1363</a>
-<a href="#1364" id="1364">1364</a>
-<a href="#1365" id="1365">1365</a>
-<a href="#1366" id="1366">1366</a>
-<a href="#1367" id="1367">1367</a>
-<a href="#1368" id="1368">1368</a>
-<a href="#1369" id="1369">1369</a>
-<a href="#1370" id="1370">1370</a>
-<a href="#1371" id="1371">1371</a>
-<a href="#1372" id="1372">1372</a>
-<a href="#1373" id="1373">1373</a>
-<a href="#1374" id="1374">1374</a>
-<a href="#1375" id="1375">1375</a>
-<a href="#1376" id="1376">1376</a>
-<a href="#1377" id="1377">1377</a>
-<a href="#1378" id="1378">1378</a>
-<a href="#1379" id="1379">1379</a>
-<a href="#1380" id="1380">1380</a>
-<a href="#1381" id="1381">1381</a>
-<a href="#1382" id="1382">1382</a>
-<a href="#1383" id="1383">1383</a>
-<a href="#1384" id="1384">1384</a>
-<a href="#1385" id="1385">1385</a>
-<a href="#1386" id="1386">1386</a>
-<a href="#1387" id="1387">1387</a>
-<a href="#1388" id="1388">1388</a>
-<a href="#1389" id="1389">1389</a>
-<a href="#1390" id="1390">1390</a>
-<a href="#1391" id="1391">1391</a>
-<a href="#1392" id="1392">1392</a>
-<a href="#1393" id="1393">1393</a>
-<a href="#1394" id="1394">1394</a>
-<a href="#1395" id="1395">1395</a>
-<a href="#1396" id="1396">1396</a>
-<a href="#1397" id="1397">1397</a>
-<a href="#1398" id="1398">1398</a>
-<a href="#1399" id="1399">1399</a>
-<a href="#1400" id="1400">1400</a>
-<a href="#1401" id="1401">1401</a>
-<a href="#1402" id="1402">1402</a>
-<a href="#1403" id="1403">1403</a>
-<a href="#1404" id="1404">1404</a>
-<a href="#1405" id="1405">1405</a>
-<a href="#1406" id="1406">1406</a>
-<a href="#1407" id="1407">1407</a>
-<a href="#1408" id="1408">1408</a>
-<a href="#1409" id="1409">1409</a>
-<a href="#1410" id="1410">1410</a>
-<a href="#1411" id="1411">1411</a>
-<a href="#1412" id="1412">1412</a>
-<a href="#1413" id="1413">1413</a>
-<a href="#1414" id="1414">1414</a>
-<a href="#1415" id="1415">1415</a>
-<a href="#1416" id="1416">1416</a>
-<a href="#1417" id="1417">1417</a>
-<a href="#1418" id="1418">1418</a>
-<a href="#1419" id="1419">1419</a>
-<a href="#1420" id="1420">1420</a>
-<a href="#1421" id="1421">1421</a>
-<a href="#1422" id="1422">1422</a>
-<a href="#1423" id="1423">1423</a>
-<a href="#1424" id="1424">1424</a>
-<a href="#1425" id="1425">1425</a>
-<a href="#1426" id="1426">1426</a>
-<a href="#1427" id="1427">1427</a>
-<a href="#1428" id="1428">1428</a>
-<a href="#1429" id="1429">1429</a>
-<a href="#1430" id="1430">1430</a>
-<a href="#1431" id="1431">1431</a>
-<a href="#1432" id="1432">1432</a>
-<a href="#1433" id="1433">1433</a>
-<a href="#1434" id="1434">1434</a>
-<a href="#1435" id="1435">1435</a>
-<a href="#1436" id="1436">1436</a>
-<a href="#1437" id="1437">1437</a>
-<a href="#1438" id="1438">1438</a>
-<a href="#1439" id="1439">1439</a>
-<a href="#1440" id="1440">1440</a>
-<a href="#1441" id="1441">1441</a>
-<a href="#1442" id="1442">1442</a>
-<a href="#1443" id="1443">1443</a>
-<a href="#1444" id="1444">1444</a>
-<a href="#1445" id="1445">1445</a>
-<a href="#1446" id="1446">1446</a>
-<a href="#1447" id="1447">1447</a>
-<a href="#1448" id="1448">1448</a>
-<a href="#1449" id="1449">1449</a>
-<a href="#1450" id="1450">1450</a>
-<a href="#1451" id="1451">1451</a>
-<a href="#1452" id="1452">1452</a>
-<a href="#1453" id="1453">1453</a>
-<a href="#1454" id="1454">1454</a>
-<a href="#1455" id="1455">1455</a>
-<a href="#1456" id="1456">1456</a>
-<a href="#1457" id="1457">1457</a>
-<a href="#1458" id="1458">1458</a>
-<a href="#1459" id="1459">1459</a>
-<a href="#1460" id="1460">1460</a>
-<a href="#1461" id="1461">1461</a>
-<a href="#1462" id="1462">1462</a>
-<a href="#1463" id="1463">1463</a>
-<a href="#1464" id="1464">1464</a>
-<a href="#1465" id="1465">1465</a>
-<a href="#1466" id="1466">1466</a>
-<a href="#1467" id="1467">1467</a>
-<a href="#1468" id="1468">1468</a>
-<a href="#1469" id="1469">1469</a>
-<a href="#1470" id="1470">1470</a>
-<a href="#1471" id="1471">1471</a>
-<a href="#1472" id="1472">1472</a>
-<a href="#1473" id="1473">1473</a>
-<a href="#1474" id="1474">1474</a>
-<a href="#1475" id="1475">1475</a>
-<a href="#1476" id="1476">1476</a>
-<a href="#1477" id="1477">1477</a>
-<a href="#1478" id="1478">1478</a>
-<a href="#1479" id="1479">1479</a>
-<a href="#1480" id="1480">1480</a>
-<a href="#1481" id="1481">1481</a>
-<a href="#1482" id="1482">1482</a>
-<a href="#1483" id="1483">1483</a>
-<a href="#1484" id="1484">1484</a>
-<a href="#1485" id="1485">1485</a>
-<a href="#1486" id="1486">1486</a>
-<a href="#1487" id="1487">1487</a>
-<a href="#1488" id="1488">1488</a>
-<a href="#1489" id="1489">1489</a>
-<a href="#1490" id="1490">1490</a>
-<a href="#1491" id="1491">1491</a>
-<a href="#1492" id="1492">1492</a>
-<a href="#1493" id="1493">1493</a>
-<a href="#1494" id="1494">1494</a>
-<a href="#1495" id="1495">1495</a>
-<a href="#1496" id="1496">1496</a>
-<a href="#1497" id="1497">1497</a>
-<a href="#1498" id="1498">1498</a>
-<a href="#1499" id="1499">1499</a>
-<a href="#1500" id="1500">1500</a>
-<a href="#1501" id="1501">1501</a>
-<a href="#1502" id="1502">1502</a>
-<a href="#1503" id="1503">1503</a>
-<a href="#1504" id="1504">1504</a>
-<a href="#1505" id="1505">1505</a>
-<a href="#1506" id="1506">1506</a>
-<a href="#1507" id="1507">1507</a>
-<a href="#1508" id="1508">1508</a>
-<a href="#1509" id="1509">1509</a>
-<a href="#1510" id="1510">1510</a>
-<a href="#1511" id="1511">1511</a>
-<a href="#1512" id="1512">1512</a>
-<a href="#1513" id="1513">1513</a>
-<a href="#1514" id="1514">1514</a>
-<a href="#1515" id="1515">1515</a>
-<a href="#1516" id="1516">1516</a>
-<a href="#1517" id="1517">1517</a>
-<a href="#1518" id="1518">1518</a>
-<a href="#1519" id="1519">1519</a>
-<a href="#1520" id="1520">1520</a>
-<a href="#1521" id="1521">1521</a>
-<a href="#1522" id="1522">1522</a>
-<a href="#1523" id="1523">1523</a>
-<a href="#1524" id="1524">1524</a>
-<a href="#1525" id="1525">1525</a>
-<a href="#1526" id="1526">1526</a>
-<a href="#1527" id="1527">1527</a>
-<a href="#1528" id="1528">1528</a>
-<a href="#1529" id="1529">1529</a>
-<a href="#1530" id="1530">1530</a>
-<a href="#1531" id="1531">1531</a>
-<a href="#1532" id="1532">1532</a>
-<a href="#1533" id="1533">1533</a>
-<a href="#1534" id="1534">1534</a>
-<a href="#1535" id="1535">1535</a>
-<a href="#1536" id="1536">1536</a>
-<a href="#1537" id="1537">1537</a>
-<a href="#1538" id="1538">1538</a>
-<a href="#1539" id="1539">1539</a>
-<a href="#1540" id="1540">1540</a>
-<a href="#1541" id="1541">1541</a>
-<a href="#1542" id="1542">1542</a>
-<a href="#1543" id="1543">1543</a>
-<a href="#1544" id="1544">1544</a>
-<a href="#1545" id="1545">1545</a>
-<a href="#1546" id="1546">1546</a>
-<a href="#1547" id="1547">1547</a>
-<a href="#1548" id="1548">1548</a>
-<a href="#1549" id="1549">1549</a>
-<a href="#1550" id="1550">1550</a>
-<a href="#1551" id="1551">1551</a>
-<a href="#1552" id="1552">1552</a>
-<a href="#1553" id="1553">1553</a>
-<a href="#1554" id="1554">1554</a>
-<a href="#1555" id="1555">1555</a>
-<a href="#1556" id="1556">1556</a>
-<a href="#1557" id="1557">1557</a>
-<a href="#1558" id="1558">1558</a>
-<a href="#1559" id="1559">1559</a>
-<a href="#1560" id="1560">1560</a>
-<a href="#1561" id="1561">1561</a>
-<a href="#1562" id="1562">1562</a>
-<a href="#1563" id="1563">1563</a>
-<a href="#1564" id="1564">1564</a>
-<a href="#1565" id="1565">1565</a>
-<a href="#1566" id="1566">1566</a>
-<a href="#1567" id="1567">1567</a>
-<a href="#1568" id="1568">1568</a>
-<a href="#1569" id="1569">1569</a>
-<a href="#1570" id="1570">1570</a>
-<a href="#1571" id="1571">1571</a>
-<a href="#1572" id="1572">1572</a>
-<a href="#1573" id="1573">1573</a>
-<a href="#1574" id="1574">1574</a>
-<a href="#1575" id="1575">1575</a>
-<a href="#1576" id="1576">1576</a>
-<a href="#1577" id="1577">1577</a>
-<a href="#1578" id="1578">1578</a>
-<a href="#1579" id="1579">1579</a>
-<a href="#1580" id="1580">1580</a>
-<a href="#1581" id="1581">1581</a>
-<a href="#1582" id="1582">1582</a>
-<a href="#1583" id="1583">1583</a>
-<a href="#1584" id="1584">1584</a>
-<a href="#1585" id="1585">1585</a>
-<a href="#1586" id="1586">1586</a>
-<a href="#1587" id="1587">1587</a>
-<a href="#1588" id="1588">1588</a>
-<a href="#1589" id="1589">1589</a>
-<a href="#1590" id="1590">1590</a>
-<a href="#1591" id="1591">1591</a>
-<a href="#1592" id="1592">1592</a>
-<a href="#1593" id="1593">1593</a>
-<a href="#1594" id="1594">1594</a>
-<a href="#1595" id="1595">1595</a>
-<a href="#1596" id="1596">1596</a>
-<a href="#1597" id="1597">1597</a>
-<a href="#1598" id="1598">1598</a>
-<a href="#1599" id="1599">1599</a>
-<a href="#1600" id="1600">1600</a>
-<a href="#1601" id="1601">1601</a>
-<a href="#1602" id="1602">1602</a>
-<a href="#1603" id="1603">1603</a>
-<a href="#1604" id="1604">1604</a>
-<a href="#1605" id="1605">1605</a>
-<a href="#1606" id="1606">1606</a>
-<a href="#1607" id="1607">1607</a>
-<a href="#1608" id="1608">1608</a>
-<a href="#1609" id="1609">1609</a>
-<a href="#1610" id="1610">1610</a>
-<a href="#1611" id="1611">1611</a>
-<a href="#1612" id="1612">1612</a>
-<a href="#1613" id="1613">1613</a>
-<a href="#1614" id="1614">1614</a>
-<a href="#1615" id="1615">1615</a>
-<a href="#1616" id="1616">1616</a>
-<a href="#1617" id="1617">1617</a>
-<a href="#1618" id="1618">1618</a>
-<a href="#1619" id="1619">1619</a>
-<a href="#1620" id="1620">1620</a>
-<a href="#1621" id="1621">1621</a>
-<a href="#1622" id="1622">1622</a>
-<a href="#1623" id="1623">1623</a>
-<a href="#1624" id="1624">1624</a>
-<a href="#1625" id="1625">1625</a>
-<a href="#1626" id="1626">1626</a>
-<a href="#1627" id="1627">1627</a>
-<a href="#1628" id="1628">1628</a>
-<a href="#1629" id="1629">1629</a>
-<a href="#1630" id="1630">1630</a>
-<a href="#1631" id="1631">1631</a>
-<a href="#1632" id="1632">1632</a>
-<a href="#1633" id="1633">1633</a>
-<a href="#1634" id="1634">1634</a>
-<a href="#1635" id="1635">1635</a>
-<a href="#1636" id="1636">1636</a>
-<a href="#1637" id="1637">1637</a>
-<a href="#1638" id="1638">1638</a>
-<a href="#1639" id="1639">1639</a>
-<a href="#1640" id="1640">1640</a>
-<a href="#1641" id="1641">1641</a>
-<a href="#1642" id="1642">1642</a>
-<a href="#1643" id="1643">1643</a>
-<a href="#1644" id="1644">1644</a>
-<a href="#1645" id="1645">1645</a>
-<a href="#1646" id="1646">1646</a>
-<a href="#1647" id="1647">1647</a>
-<a href="#1648" id="1648">1648</a>
-<a href="#1649" id="1649">1649</a>
-<a href="#1650" id="1650">1650</a>
-<a href="#1651" id="1651">1651</a>
-<a href="#1652" id="1652">1652</a>
-<a href="#1653" id="1653">1653</a>
-<a href="#1654" id="1654">1654</a>
-<a href="#1655" id="1655">1655</a>
-<a href="#1656" id="1656">1656</a>
-<a href="#1657" id="1657">1657</a>
-<a href="#1658" id="1658">1658</a>
-<a href="#1659" id="1659">1659</a>
-<a href="#1660" id="1660">1660</a>
-<a href="#1661" id="1661">1661</a>
-<a href="#1662" id="1662">1662</a>
-<a href="#1663" id="1663">1663</a>
-<a href="#1664" id="1664">1664</a>
-<a href="#1665" id="1665">1665</a>
-<a href="#1666" id="1666">1666</a>
-<a href="#1667" id="1667">1667</a>
-<a href="#1668" id="1668">1668</a>
-<a href="#1669" id="1669">1669</a>
-<a href="#1670" id="1670">1670</a>
-<a href="#1671" id="1671">1671</a>
-<a href="#1672" id="1672">1672</a>
-<a href="#1673" id="1673">1673</a>
-<a href="#1674" id="1674">1674</a>
-<a href="#1675" id="1675">1675</a>
-<a href="#1676" id="1676">1676</a>
-<a href="#1677" id="1677">1677</a>
-<a href="#1678" id="1678">1678</a>
-<a href="#1679" id="1679">1679</a>
-<a href="#1680" id="1680">1680</a>
-<a href="#1681" id="1681">1681</a>
-<a href="#1682" id="1682">1682</a>
-<a href="#1683" id="1683">1683</a>
-<a href="#1684" id="1684">1684</a>
-<a href="#1685" id="1685">1685</a>
-<a href="#1686" id="1686">1686</a>
-<a href="#1687" id="1687">1687</a>
-<a href="#1688" id="1688">1688</a>
-<a href="#1689" id="1689">1689</a>
-<a href="#1690" id="1690">1690</a>
-<a href="#1691" id="1691">1691</a>
-<a href="#1692" id="1692">1692</a>
-<a href="#1693" id="1693">1693</a>
-<a href="#1694" id="1694">1694</a>
-<a href="#1695" id="1695">1695</a>
-<a href="#1696" id="1696">1696</a>
-<a href="#1697" id="1697">1697</a>
-<a href="#1698" id="1698">1698</a>
-<a href="#1699" id="1699">1699</a>
-<a href="#1700" id="1700">1700</a>
-<a href="#1701" id="1701">1701</a>
-<a href="#1702" id="1702">1702</a>
-<a href="#1703" id="1703">1703</a>
-<a href="#1704" id="1704">1704</a>
-<a href="#1705" id="1705">1705</a>
-<a href="#1706" id="1706">1706</a>
-<a href="#1707" id="1707">1707</a>
-<a href="#1708" id="1708">1708</a>
-<a href="#1709" id="1709">1709</a>
-<a href="#1710" id="1710">1710</a>
-<a href="#1711" id="1711">1711</a>
-<a href="#1712" id="1712">1712</a>
-<a href="#1713" id="1713">1713</a>
-<a href="#1714" id="1714">1714</a>
-<a href="#1715" id="1715">1715</a>
-<a href="#1716" id="1716">1716</a>
-<a href="#1717" id="1717">1717</a>
-<a href="#1718" id="1718">1718</a>
-<a href="#1719" id="1719">1719</a>
-<a href="#1720" id="1720">1720</a>
-<a href="#1721" id="1721">1721</a>
-<a href="#1722" id="1722">1722</a>
-<a href="#1723" id="1723">1723</a>
-<a href="#1724" id="1724">1724</a>
-<a href="#1725" id="1725">1725</a>
-<a href="#1726" id="1726">1726</a>
-<a href="#1727" id="1727">1727</a>
-<a href="#1728" id="1728">1728</a>
-<a href="#1729" id="1729">1729</a>
-<a href="#1730" id="1730">1730</a>
-<a href="#1731" id="1731">1731</a>
-<a href="#1732" id="1732">1732</a>
-<a href="#1733" id="1733">1733</a>
-<a href="#1734" id="1734">1734</a>
-<a href="#1735" id="1735">1735</a>
-<a href="#1736" id="1736">1736</a>
-<a href="#1737" id="1737">1737</a>
-<a href="#1738" id="1738">1738</a>
-<a href="#1739" id="1739">1739</a>
-<a href="#1740" id="1740">1740</a>
-<a href="#1741" id="1741">1741</a>
-<a href="#1742" id="1742">1742</a>
-<a href="#1743" id="1743">1743</a>
-<a href="#1744" id="1744">1744</a>
-<a href="#1745" id="1745">1745</a>
-<a href="#1746" id="1746">1746</a>
-<a href="#1747" id="1747">1747</a>
-<a href="#1748" id="1748">1748</a>
-<a href="#1749" id="1749">1749</a>
-<a href="#1750" id="1750">1750</a>
-<a href="#1751" id="1751">1751</a>
-<a href="#1752" id="1752">1752</a>
-<a href="#1753" id="1753">1753</a>
-<a href="#1754" id="1754">1754</a>
-<a href="#1755" id="1755">1755</a>
-<a href="#1756" id="1756">1756</a>
-<a href="#1757" id="1757">1757</a>
-<a href="#1758" id="1758">1758</a>
-<a href="#1759" id="1759">1759</a>
-<a href="#1760" id="1760">1760</a>
-<a href="#1761" id="1761">1761</a>
-<a href="#1762" id="1762">1762</a>
-<a href="#1763" id="1763">1763</a>
-<a href="#1764" id="1764">1764</a>
-<a href="#1765" id="1765">1765</a>
-<a href="#1766" id="1766">1766</a>
-<a href="#1767" id="1767">1767</a>
-<a href="#1768" id="1768">1768</a>
-<a href="#1769" id="1769">1769</a>
-<a href="#1770" id="1770">1770</a>
-<a href="#1771" id="1771">1771</a>
-<a href="#1772" id="1772">1772</a>
-<a href="#1773" id="1773">1773</a>
-<a href="#1774" id="1774">1774</a>
-<a href="#1775" id="1775">1775</a>
-<a href="#1776" id="1776">1776</a>
-<a href="#1777" id="1777">1777</a>
-<a href="#1778" id="1778">1778</a>
-<a href="#1779" id="1779">1779</a>
-<a href="#1780" id="1780">1780</a>
-<a href="#1781" id="1781">1781</a>
-<a href="#1782" id="1782">1782</a>
-<a href="#1783" id="1783">1783</a>
-<a href="#1784" id="1784">1784</a>
-<a href="#1785" id="1785">1785</a>
-<a href="#1786" id="1786">1786</a>
-<a href="#1787" id="1787">1787</a>
-<a href="#1788" id="1788">1788</a>
-<a href="#1789" id="1789">1789</a>
-<a href="#1790" id="1790">1790</a>
-<a href="#1791" id="1791">1791</a>
-<a href="#1792" id="1792">1792</a>
-<a href="#1793" id="1793">1793</a>
-<a href="#1794" id="1794">1794</a>
-<a href="#1795" id="1795">1795</a>
-<a href="#1796" id="1796">1796</a>
-<a href="#1797" id="1797">1797</a>
-<a href="#1798" id="1798">1798</a>
-<a href="#1799" id="1799">1799</a>
-<a href="#1800" id="1800">1800</a>
-<a href="#1801" id="1801">1801</a>
-<a href="#1802" id="1802">1802</a>
-<a href="#1803" id="1803">1803</a>
-<a href="#1804" id="1804">1804</a>
-<a href="#1805" id="1805">1805</a>
-<a href="#1806" id="1806">1806</a>
-<a href="#1807" id="1807">1807</a>
-<a href="#1808" id="1808">1808</a>
-<a href="#1809" id="1809">1809</a>
-<a href="#1810" id="1810">1810</a>
-<a href="#1811" id="1811">1811</a>
-<a href="#1812" id="1812">1812</a>
-<a href="#1813" id="1813">1813</a>
-<a href="#1814" id="1814">1814</a>
-<a href="#1815" id="1815">1815</a>
-<a href="#1816" id="1816">1816</a>
-<a href="#1817" id="1817">1817</a>
-<a href="#1818" id="1818">1818</a>
-<a href="#1819" id="1819">1819</a>
-<a href="#1820" id="1820">1820</a>
-<a href="#1821" id="1821">1821</a>
-<a href="#1822" id="1822">1822</a>
-<a href="#1823" id="1823">1823</a>
-<a href="#1824" id="1824">1824</a>
-<a href="#1825" id="1825">1825</a>
-<a href="#1826" id="1826">1826</a>
-<a href="#1827" id="1827">1827</a>
-<a href="#1828" id="1828">1828</a>
-<a href="#1829" id="1829">1829</a>
-<a href="#1830" id="1830">1830</a>
-<a href="#1831" id="1831">1831</a>
-<a href="#1832" id="1832">1832</a>
-<a href="#1833" id="1833">1833</a>
-<a href="#1834" id="1834">1834</a>
-<a href="#1835" id="1835">1835</a>
-<a href="#1836" id="1836">1836</a>
-<a href="#1837" id="1837">1837</a>
-<a href="#1838" id="1838">1838</a>
-<a href="#1839" id="1839">1839</a>
-<a href="#1840" id="1840">1840</a>
-<a href="#1841" id="1841">1841</a>
-<a href="#1842" id="1842">1842</a>
-<a href="#1843" id="1843">1843</a>
-<a href="#1844" id="1844">1844</a>
-<a href="#1845" id="1845">1845</a>
-<a href="#1846" id="1846">1846</a>
-<a href="#1847" id="1847">1847</a>
-<a href="#1848" id="1848">1848</a>
-<a href="#1849" id="1849">1849</a>
-<a href="#1850" id="1850">1850</a>
-<a href="#1851" id="1851">1851</a>
-<a href="#1852" id="1852">1852</a>
-<a href="#1853" id="1853">1853</a>
-<a href="#1854" id="1854">1854</a>
-<a href="#1855" id="1855">1855</a>
-<a href="#1856" id="1856">1856</a>
-<a href="#1857" id="1857">1857</a>
-<a href="#1858" id="1858">1858</a>
-<a href="#1859" id="1859">1859</a>
-<a href="#1860" id="1860">1860</a>
-<a href="#1861" id="1861">1861</a>
-<a href="#1862" id="1862">1862</a>
-<a href="#1863" id="1863">1863</a>
-<a href="#1864" id="1864">1864</a>
-<a href="#1865" id="1865">1865</a>
-<a href="#1866" id="1866">1866</a>
-<a href="#1867" id="1867">1867</a>
-<a href="#1868" id="1868">1868</a>
-<a href="#1869" id="1869">1869</a>
-<a href="#1870" id="1870">1870</a>
-<a href="#1871" id="1871">1871</a>
-<a href="#1872" id="1872">1872</a>
-<a href="#1873" id="1873">1873</a>
-<a href="#1874" id="1874">1874</a>
-<a href="#1875" id="1875">1875</a>
-<a href="#1876" id="1876">1876</a>
-<a href="#1877" id="1877">1877</a>
-<a href="#1878" id="1878">1878</a>
-<a href="#1879" id="1879">1879</a>
-<a href="#1880" id="1880">1880</a>
-<a href="#1881" id="1881">1881</a>
-<a href="#1882" id="1882">1882</a>
-<a href="#1883" id="1883">1883</a>
-<a href="#1884" id="1884">1884</a>
-<a href="#1885" id="1885">1885</a>
-<a href="#1886" id="1886">1886</a>
-<a href="#1887" id="1887">1887</a>
-<a href="#1888" id="1888">1888</a>
-<a href="#1889" id="1889">1889</a>
-<a href="#1890" id="1890">1890</a>
-<a href="#1891" id="1891">1891</a>
-<a href="#1892" id="1892">1892</a>
-<a href="#1893" id="1893">1893</a>
-<a href="#1894" id="1894">1894</a>
-<a href="#1895" id="1895">1895</a>
-<a href="#1896" id="1896">1896</a>
-<a href="#1897" id="1897">1897</a>
-<a href="#1898" id="1898">1898</a>
-<a href="#1899" id="1899">1899</a>
-<a href="#1900" id="1900">1900</a>
-<a href="#1901" id="1901">1901</a>
-<a href="#1902" id="1902">1902</a>
-<a href="#1903" id="1903">1903</a>
-<a href="#1904" id="1904">1904</a>
-<a href="#1905" id="1905">1905</a>
-<a href="#1906" id="1906">1906</a>
-<a href="#1907" id="1907">1907</a>
-<a href="#1908" id="1908">1908</a>
-<a href="#1909" id="1909">1909</a>
-<a href="#1910" id="1910">1910</a>
-<a href="#1911" id="1911">1911</a>
-<a href="#1912" id="1912">1912</a>
-<a href="#1913" id="1913">1913</a>
-<a href="#1914" id="1914">1914</a>
-<a href="#1915" id="1915">1915</a>
-<a href="#1916" id="1916">1916</a>
-<a href="#1917" id="1917">1917</a>
-<a href="#1918" id="1918">1918</a>
-<a href="#1919" id="1919">1919</a>
-<a href="#1920" id="1920">1920</a>
-<a href="#1921" id="1921">1921</a>
-<a href="#1922" id="1922">1922</a>
-<a href="#1923" id="1923">1923</a>
-<a href="#1924" id="1924">1924</a>
-<a href="#1925" id="1925">1925</a>
-<a href="#1926" id="1926">1926</a>
-<a href="#1927" id="1927">1927</a>
-<a href="#1928" id="1928">1928</a>
-<a href="#1929" id="1929">1929</a>
-<a href="#1930" id="1930">1930</a>
-<a href="#1931" id="1931">1931</a>
-<a href="#1932" id="1932">1932</a>
-<a href="#1933" id="1933">1933</a>
-<a href="#1934" id="1934">1934</a>
-<a href="#1935" id="1935">1935</a>
-<a href="#1936" id="1936">1936</a>
-<a href="#1937" id="1937">1937</a>
-<a href="#1938" id="1938">1938</a>
-<a href="#1939" id="1939">1939</a>
-<a href="#1940" id="1940">1940</a>
-<a href="#1941" id="1941">1941</a>
-<a href="#1942" id="1942">1942</a>
-<a href="#1943" id="1943">1943</a>
-<a href="#1944" id="1944">1944</a>
-<a href="#1945" id="1945">1945</a>
-<a href="#1946" id="1946">1946</a>
-<a href="#1947" id="1947">1947</a>
-<a href="#1948" id="1948">1948</a>
-<a href="#1949" id="1949">1949</a>
-<a href="#1950" id="1950">1950</a>
-<a href="#1951" id="1951">1951</a>
-<a href="#1952" id="1952">1952</a>
-<a href="#1953" id="1953">1953</a>
-<a href="#1954" id="1954">1954</a>
-<a href="#1955" id="1955">1955</a>
-<a href="#1956" id="1956">1956</a>
-<a href="#1957" id="1957">1957</a>
-<a href="#1958" id="1958">1958</a>
-<a href="#1959" id="1959">1959</a>
-<a href="#1960" id="1960">1960</a>
-<a href="#1961" id="1961">1961</a>
-<a href="#1962" id="1962">1962</a>
-<a href="#1963" id="1963">1963</a>
-<a href="#1964" id="1964">1964</a>
-<a href="#1965" id="1965">1965</a>
-<a href="#1966" id="1966">1966</a>
-<a href="#1967" id="1967">1967</a>
-<a href="#1968" id="1968">1968</a>
-<a href="#1969" id="1969">1969</a>
-<a href="#1970" id="1970">1970</a>
-<a href="#1971" id="1971">1971</a>
-<a href="#1972" id="1972">1972</a>
-<a href="#1973" id="1973">1973</a>
-<a href="#1974" id="1974">1974</a>
-<a href="#1975" id="1975">1975</a>
-<a href="#1976" id="1976">1976</a>
-<a href="#1977" id="1977">1977</a>
-<a href="#1978" id="1978">1978</a>
-<a href="#1979" id="1979">1979</a>
-<a href="#1980" id="1980">1980</a>
-<a href="#1981" id="1981">1981</a>
-<a href="#1982" id="1982">1982</a>
-<a href="#1983" id="1983">1983</a>
-<a href="#1984" id="1984">1984</a>
-<a href="#1985" id="1985">1985</a>
-<a href="#1986" id="1986">1986</a>
-<a href="#1987" id="1987">1987</a>
-<a href="#1988" id="1988">1988</a>
-<a href="#1989" id="1989">1989</a>
-<a href="#1990" id="1990">1990</a>
-<a href="#1991" id="1991">1991</a>
-<a href="#1992" id="1992">1992</a>
-<a href="#1993" id="1993">1993</a>
-<a href="#1994" id="1994">1994</a>
-<a href="#1995" id="1995">1995</a>
-<a href="#1996" id="1996">1996</a>
-<a href="#1997" id="1997">1997</a>
-<a href="#1998" id="1998">1998</a>
-<a href="#1999" id="1999">1999</a>
-<a href="#2000" id="2000">2000</a>
-<a href="#2001" id="2001">2001</a>
-<a href="#2002" id="2002">2002</a>
-<a href="#2003" id="2003">2003</a>
-<a href="#2004" id="2004">2004</a>
-<a href="#2005" id="2005">2005</a>
-<a href="#2006" id="2006">2006</a>
-<a href="#2007" id="2007">2007</a>
-<a href="#2008" id="2008">2008</a>
-<a href="#2009" id="2009">2009</a>
-<a href="#2010" id="2010">2010</a>
-<a href="#2011" id="2011">2011</a>
-<a href="#2012" id="2012">2012</a>
-<a href="#2013" id="2013">2013</a>
-<a href="#2014" id="2014">2014</a>
-<a href="#2015" id="2015">2015</a>
-<a href="#2016" id="2016">2016</a>
-<a href="#2017" id="2017">2017</a>
-<a href="#2018" id="2018">2018</a>
-<a href="#2019" id="2019">2019</a>
-<a href="#2020" id="2020">2020</a>
-<a href="#2021" id="2021">2021</a>
-<a href="#2022" id="2022">2022</a>
-<a href="#2023" id="2023">2023</a>
-<a href="#2024" id="2024">2024</a>
-<a href="#2025" id="2025">2025</a>
-<a href="#2026" id="2026">2026</a>
-<a href="#2027" id="2027">2027</a>
-<a href="#2028" id="2028">2028</a>
-<a href="#2029" id="2029">2029</a>
-<a href="#2030" id="2030">2030</a>
-<a href="#2031" id="2031">2031</a>
-<a href="#2032" id="2032">2032</a>
-<a href="#2033" id="2033">2033</a>
-<a href="#2034" id="2034">2034</a>
-<a href="#2035" id="2035">2035</a>
-<a href="#2036" id="2036">2036</a>
-<a href="#2037" id="2037">2037</a>
-<a href="#2038" id="2038">2038</a>
-<a href="#2039" id="2039">2039</a>
-<a href="#2040" id="2040">2040</a>
-<a href="#2041" id="2041">2041</a>
-<a href="#2042" id="2042">2042</a>
-<a href="#2043" id="2043">2043</a>
-<a href="#2044" id="2044">2044</a>
-<a href="#2045" id="2045">2045</a>
-<a href="#2046" id="2046">2046</a>
-<a href="#2047" id="2047">2047</a>
-<a href="#2048" id="2048">2048</a>
-<a href="#2049" id="2049">2049</a>
-<a href="#2050" id="2050">2050</a>
-<a href="#2051" id="2051">2051</a>
-<a href="#2052" id="2052">2052</a>
-<a href="#2053" id="2053">2053</a>
-<a href="#2054" id="2054">2054</a>
-<a href="#2055" id="2055">2055</a>
-<a href="#2056" id="2056">2056</a>
-<a href="#2057" id="2057">2057</a>
-<a href="#2058" id="2058">2058</a>
-<a href="#2059" id="2059">2059</a>
-<a href="#2060" id="2060">2060</a>
-<a href="#2061" id="2061">2061</a>
-<a href="#2062" id="2062">2062</a>
-<a href="#2063" id="2063">2063</a>
-<a href="#2064" id="2064">2064</a>
-<a href="#2065" id="2065">2065</a>
-<a href="#2066" id="2066">2066</a>
-<a href="#2067" id="2067">2067</a>
-<a href="#2068" id="2068">2068</a>
-<a href="#2069" id="2069">2069</a>
-<a href="#2070" id="2070">2070</a>
-<a href="#2071" id="2071">2071</a>
-<a href="#2072" id="2072">2072</a>
-<a href="#2073" id="2073">2073</a>
-<a href="#2074" id="2074">2074</a>
-<a href="#2075" id="2075">2075</a>
-<a href="#2076" id="2076">2076</a>
-<a href="#2077" id="2077">2077</a>
-<a href="#2078" id="2078">2078</a>
-<a href="#2079" id="2079">2079</a>
-<a href="#2080" id="2080">2080</a>
-<a href="#2081" id="2081">2081</a>
-<a href="#2082" id="2082">2082</a>
-<a href="#2083" id="2083">2083</a>
-<a href="#2084" id="2084">2084</a>
-<a href="#2085" id="2085">2085</a>
-<a href="#2086" id="2086">2086</a>
-<a href="#2087" id="2087">2087</a>
-<a href="#2088" id="2088">2088</a>
-<a href="#2089" id="2089">2089</a>
-<a href="#2090" id="2090">2090</a>
-<a href="#2091" id="2091">2091</a>
-<a href="#2092" id="2092">2092</a>
-<a href="#2093" id="2093">2093</a>
-<a href="#2094" id="2094">2094</a>
-<a href="#2095" id="2095">2095</a>
-<a href="#2096" id="2096">2096</a>
-<a href="#2097" id="2097">2097</a>
-<a href="#2098" id="2098">2098</a>
-<a href="#2099" id="2099">2099</a>
-<a href="#2100" id="2100">2100</a>
-<a href="#2101" id="2101">2101</a>
-<a href="#2102" id="2102">2102</a>
-<a href="#2103" id="2103">2103</a>
-<a href="#2104" id="2104">2104</a>
-<a href="#2105" id="2105">2105</a>
-<a href="#2106" id="2106">2106</a>
-<a href="#2107" id="2107">2107</a>
-<a href="#2108" id="2108">2108</a>
-<a href="#2109" id="2109">2109</a>
-<a href="#2110" id="2110">2110</a>
-<a href="#2111" id="2111">2111</a>
-<a href="#2112" id="2112">2112</a>
-<a href="#2113" id="2113">2113</a>
-<a href="#2114" id="2114">2114</a>
-<a href="#2115" id="2115">2115</a>
-<a href="#2116" id="2116">2116</a>
-<a href="#2117" id="2117">2117</a>
-<a href="#2118" id="2118">2118</a>
-<a href="#2119" id="2119">2119</a>
-<a href="#2120" id="2120">2120</a>
-<a href="#2121" id="2121">2121</a>
-<a href="#2122" id="2122">2122</a>
-<a href="#2123" id="2123">2123</a>
-<a href="#2124" id="2124">2124</a>
-<a href="#2125" id="2125">2125</a>
-<a href="#2126" id="2126">2126</a>
-<a href="#2127" id="2127">2127</a>
-<a href="#2128" id="2128">2128</a>
-<a href="#2129" id="2129">2129</a>
-<a href="#2130" id="2130">2130</a>
-<a href="#2131" id="2131">2131</a>
-<a href="#2132" id="2132">2132</a>
-<a href="#2133" id="2133">2133</a>
-<a href="#2134" id="2134">2134</a>
-<a href="#2135" id="2135">2135</a>
-<a href="#2136" id="2136">2136</a>
-<a href="#2137" id="2137">2137</a>
-<a href="#2138" id="2138">2138</a>
-<a href="#2139" id="2139">2139</a>
-<a href="#2140" id="2140">2140</a>
-<a href="#2141" id="2141">2141</a>
-<a href="#2142" id="2142">2142</a>
-<a href="#2143" id="2143">2143</a>
-<a href="#2144" id="2144">2144</a>
-<a href="#2145" id="2145">2145</a>
-<a href="#2146" id="2146">2146</a>
-<a href="#2147" id="2147">2147</a>
-<a href="#2148" id="2148">2148</a>
-<a href="#2149" id="2149">2149</a>
-<a href="#2150" id="2150">2150</a>
-<a href="#2151" id="2151">2151</a>
-<a href="#2152" id="2152">2152</a>
-<a href="#2153" id="2153">2153</a>
-<a href="#2154" id="2154">2154</a>
-<a href="#2155" id="2155">2155</a>
-<a href="#2156" id="2156">2156</a>
-<a href="#2157" id="2157">2157</a>
-<a href="#2158" id="2158">2158</a>
-<a href="#2159" id="2159">2159</a>
-<a href="#2160" id="2160">2160</a>
-<a href="#2161" id="2161">2161</a>
-<a href="#2162" id="2162">2162</a>
-<a href="#2163" id="2163">2163</a>
-<a href="#2164" id="2164">2164</a>
-<a href="#2165" id="2165">2165</a>
-<a href="#2166" id="2166">2166</a>
-<a href="#2167" id="2167">2167</a>
-<a href="#2168" id="2168">2168</a>
-<a href="#2169" id="2169">2169</a>
-<a href="#2170" id="2170">2170</a>
-<a href="#2171" id="2171">2171</a>
-<a href="#2172" id="2172">2172</a>
-<a href="#2173" id="2173">2173</a>
-<a href="#2174" id="2174">2174</a>
-<a href="#2175" id="2175">2175</a>
-<a href="#2176" id="2176">2176</a>
-<a href="#2177" id="2177">2177</a>
-<a href="#2178" id="2178">2178</a>
-<a href="#2179" id="2179">2179</a>
-<a href="#2180" id="2180">2180</a>
-<a href="#2181" id="2181">2181</a>
-<a href="#2182" id="2182">2182</a>
-<a href="#2183" id="2183">2183</a>
-<a href="#2184" id="2184">2184</a>
-<a href="#2185" id="2185">2185</a>
-<a href="#2186" id="2186">2186</a>
-<a href="#2187" id="2187">2187</a>
-<a href="#2188" id="2188">2188</a>
-<a href="#2189" id="2189">2189</a>
-<a href="#2190" id="2190">2190</a>
-<a href="#2191" id="2191">2191</a>
-<a href="#2192" id="2192">2192</a>
-<a href="#2193" id="2193">2193</a>
-<a href="#2194" id="2194">2194</a>
-<a href="#2195" id="2195">2195</a>
-<a href="#2196" id="2196">2196</a>
-<a href="#2197" id="2197">2197</a>
-<a href="#2198" id="2198">2198</a>
-<a href="#2199" id="2199">2199</a>
-<a href="#2200" id="2200">2200</a>
-<a href="#2201" id="2201">2201</a>
-<a href="#2202" id="2202">2202</a>
-<a href="#2203" id="2203">2203</a>
-<a href="#2204" id="2204">2204</a>
-<a href="#2205" id="2205">2205</a>
-<a href="#2206" id="2206">2206</a>
-<a href="#2207" id="2207">2207</a>
-<a href="#2208" id="2208">2208</a>
-<a href="#2209" id="2209">2209</a>
-<a href="#2210" id="2210">2210</a>
-<a href="#2211" id="2211">2211</a>
-<a href="#2212" id="2212">2212</a>
-<a href="#2213" id="2213">2213</a>
-<a href="#2214" id="2214">2214</a>
-<a href="#2215" id="2215">2215</a>
-<a href="#2216" id="2216">2216</a>
-<a href="#2217" id="2217">2217</a>
-<a href="#2218" id="2218">2218</a>
-<a href="#2219" id="2219">2219</a>
-<a href="#2220" id="2220">2220</a>
-<a href="#2221" id="2221">2221</a>
-<a href="#2222" id="2222">2222</a>
-<a href="#2223" id="2223">2223</a>
-<a href="#2224" id="2224">2224</a>
-<a href="#2225" id="2225">2225</a>
-<a href="#2226" id="2226">2226</a>
-<a href="#2227" id="2227">2227</a>
-<a href="#2228" id="2228">2228</a>
-<a href="#2229" id="2229">2229</a>
-<a href="#2230" id="2230">2230</a>
-<a href="#2231" id="2231">2231</a>
-<a href="#2232" id="2232">2232</a>
-<a href="#2233" id="2233">2233</a>
-<a href="#2234" id="2234">2234</a>
-<a href="#2235" id="2235">2235</a>
-<a href="#2236" id="2236">2236</a>
-<a href="#2237" id="2237">2237</a>
-<a href="#2238" id="2238">2238</a>
-<a href="#2239" id="2239">2239</a>
-<a href="#2240" id="2240">2240</a>
-<a href="#2241" id="2241">2241</a>
-<a href="#2242" id="2242">2242</a>
-<a href="#2243" id="2243">2243</a>
-<a href="#2244" id="2244">2244</a>
-<a href="#2245" id="2245">2245</a>
-<a href="#2246" id="2246">2246</a>
-<a href="#2247" id="2247">2247</a>
-<a href="#2248" id="2248">2248</a>
-<a href="#2249" id="2249">2249</a>
-<a href="#2250" id="2250">2250</a>
-<a href="#2251" id="2251">2251</a>
-<a href="#2252" id="2252">2252</a>
-<a href="#2253" id="2253">2253</a>
-<a href="#2254" id="2254">2254</a>
-<a href="#2255" id="2255">2255</a>
-<a href="#2256" id="2256">2256</a>
-<a href="#2257" id="2257">2257</a>
-<a href="#2258" id="2258">2258</a>
-<a href="#2259" id="2259">2259</a>
-<a href="#2260" id="2260">2260</a>
-<a href="#2261" id="2261">2261</a>
-<a href="#2262" id="2262">2262</a>
-<a href="#2263" id="2263">2263</a>
-<a href="#2264" id="2264">2264</a>
-<a href="#2265" id="2265">2265</a>
-<a href="#2266" id="2266">2266</a>
-<a href="#2267" id="2267">2267</a>
-<a href="#2268" id="2268">2268</a>
-<a href="#2269" id="2269">2269</a>
-<a href="#2270" id="2270">2270</a>
-<a href="#2271" id="2271">2271</a>
-<a href="#2272" id="2272">2272</a>
-<a href="#2273" id="2273">2273</a>
-<a href="#2274" id="2274">2274</a>
-<a href="#2275" id="2275">2275</a>
-<a href="#2276" id="2276">2276</a>
-<a href="#2277" id="2277">2277</a>
-<a href="#2278" id="2278">2278</a>
-<a href="#2279" id="2279">2279</a>
-<a href="#2280" id="2280">2280</a>
-<a href="#2281" id="2281">2281</a>
-<a href="#2282" id="2282">2282</a>
-<a href="#2283" id="2283">2283</a>
-<a href="#2284" id="2284">2284</a>
-<a href="#2285" id="2285">2285</a>
-<a href="#2286" id="2286">2286</a>
-<a href="#2287" id="2287">2287</a>
-<a href="#2288" id="2288">2288</a>
-<a href="#2289" id="2289">2289</a>
-<a href="#2290" id="2290">2290</a>
-<a href="#2291" id="2291">2291</a>
-<a href="#2292" id="2292">2292</a>
-<a href="#2293" id="2293">2293</a>
-<a href="#2294" id="2294">2294</a>
-<a href="#2295" id="2295">2295</a>
-<a href="#2296" id="2296">2296</a>
-<a href="#2297" id="2297">2297</a>
-<a href="#2298" id="2298">2298</a>
-<a href="#2299" id="2299">2299</a>
-<a href="#2300" id="2300">2300</a>
-<a href="#2301" id="2301">2301</a>
-<a href="#2302" id="2302">2302</a>
-<a href="#2303" id="2303">2303</a>
-<a href="#2304" id="2304">2304</a>
-<a href="#2305" id="2305">2305</a>
-<a href="#2306" id="2306">2306</a>
-<a href="#2307" id="2307">2307</a>
-<a href="#2308" id="2308">2308</a>
-<a href="#2309" id="2309">2309</a>
-<a href="#2310" id="2310">2310</a>
-<a href="#2311" id="2311">2311</a>
-<a href="#2312" id="2312">2312</a>
-<a href="#2313" id="2313">2313</a>
-<a href="#2314" id="2314">2314</a>
-<a href="#2315" id="2315">2315</a>
-<a href="#2316" id="2316">2316</a>
-<a href="#2317" id="2317">2317</a>
-<a href="#2318" id="2318">2318</a>
-<a href="#2319" id="2319">2319</a>
-<a href="#2320" id="2320">2320</a>
-<a href="#2321" id="2321">2321</a>
-<a href="#2322" id="2322">2322</a>
-<a href="#2323" id="2323">2323</a>
-<a href="#2324" id="2324">2324</a>
-<a href="#2325" id="2325">2325</a>
-<a href="#2326" id="2326">2326</a>
-<a href="#2327" id="2327">2327</a>
-<a href="#2328" id="2328">2328</a>
-<a href="#2329" id="2329">2329</a>
-<a href="#2330" id="2330">2330</a>
-<a href="#2331" id="2331">2331</a>
-<a href="#2332" id="2332">2332</a>
-<a href="#2333" id="2333">2333</a>
-<a href="#2334" id="2334">2334</a>
-<a href="#2335" id="2335">2335</a>
-<a href="#2336" id="2336">2336</a>
-<a href="#2337" id="2337">2337</a>
-<a href="#2338" id="2338">2338</a>
-<a href="#2339" id="2339">2339</a>
-<a href="#2340" id="2340">2340</a>
-<a href="#2341" id="2341">2341</a>
-<a href="#2342" id="2342">2342</a>
-<a href="#2343" id="2343">2343</a>
-<a href="#2344" id="2344">2344</a>
-<a href="#2345" id="2345">2345</a>
-<a href="#2346" id="2346">2346</a>
-<a href="#2347" id="2347">2347</a>
-<a href="#2348" id="2348">2348</a>
-<a href="#2349" id="2349">2349</a>
-<a href="#2350" id="2350">2350</a>
-<a href="#2351" id="2351">2351</a>
-<a href="#2352" id="2352">2352</a>
-<a href="#2353" id="2353">2353</a>
-<a href="#2354" id="2354">2354</a>
-<a href="#2355" id="2355">2355</a>
-<a href="#2356" id="2356">2356</a>
-<a href="#2357" id="2357">2357</a>
-<a href="#2358" id="2358">2358</a>
-<a href="#2359" id="2359">2359</a>
-<a href="#2360" id="2360">2360</a>
-<a href="#2361" id="2361">2361</a>
-<a href="#2362" id="2362">2362</a>
-<a href="#2363" id="2363">2363</a>
-<a href="#2364" id="2364">2364</a>
-<a href="#2365" id="2365">2365</a>
-<a href="#2366" id="2366">2366</a>
-<a href="#2367" id="2367">2367</a>
-<a href="#2368" id="2368">2368</a>
-<a href="#2369" id="2369">2369</a>
-<a href="#2370" id="2370">2370</a>
-<a href="#2371" id="2371">2371</a>
-<a href="#2372" id="2372">2372</a>
-<a href="#2373" id="2373">2373</a>
-<a href="#2374" id="2374">2374</a>
-<a href="#2375" id="2375">2375</a>
-<a href="#2376" id="2376">2376</a>
-<a href="#2377" id="2377">2377</a>
-<a href="#2378" id="2378">2378</a>
-<a href="#2379" id="2379">2379</a>
-<a href="#2380" id="2380">2380</a>
-<a href="#2381" id="2381">2381</a>
-<a href="#2382" id="2382">2382</a>
-<a href="#2383" id="2383">2383</a>
-<a href="#2384" id="2384">2384</a>
-<a href="#2385" id="2385">2385</a>
-<a href="#2386" id="2386">2386</a>
-<a href="#2387" id="2387">2387</a>
-<a href="#2388" id="2388">2388</a>
-<a href="#2389" id="2389">2389</a>
-<a href="#2390" id="2390">2390</a>
-<a href="#2391" id="2391">2391</a>
-<a href="#2392" id="2392">2392</a>
-<a href="#2393" id="2393">2393</a>
-<a href="#2394" id="2394">2394</a>
-<a href="#2395" id="2395">2395</a>
-<a href="#2396" id="2396">2396</a>
-<a href="#2397" id="2397">2397</a>
-<a href="#2398" id="2398">2398</a>
-<a href="#2399" id="2399">2399</a>
-<a href="#2400" id="2400">2400</a>
-<a href="#2401" id="2401">2401</a>
-<a href="#2402" id="2402">2402</a>
-<a href="#2403" id="2403">2403</a>
-<a href="#2404" id="2404">2404</a>
-<a href="#2405" id="2405">2405</a>
-<a href="#2406" id="2406">2406</a>
-<a href="#2407" id="2407">2407</a>
-<a href="#2408" id="2408">2408</a>
-<a href="#2409" id="2409">2409</a>
-<a href="#2410" id="2410">2410</a>
-<a href="#2411" id="2411">2411</a>
-<a href="#2412" id="2412">2412</a>
-<a href="#2413" id="2413">2413</a>
-<a href="#2414" id="2414">2414</a>
-<a href="#2415" id="2415">2415</a>
-<a href="#2416" id="2416">2416</a>
-<a href="#2417" id="2417">2417</a>
-<a href="#2418" id="2418">2418</a>
-<a href="#2419" id="2419">2419</a>
-<a href="#2420" id="2420">2420</a>
-<a href="#2421" id="2421">2421</a>
-<a href="#2422" id="2422">2422</a>
-<a href="#2423" id="2423">2423</a>
-<a href="#2424" id="2424">2424</a>
-<a href="#2425" id="2425">2425</a>
-<a href="#2426" id="2426">2426</a>
-<a href="#2427" id="2427">2427</a>
-<a href="#2428" id="2428">2428</a>
-<a href="#2429" id="2429">2429</a>
-<a href="#2430" id="2430">2430</a>
-<a href="#2431" id="2431">2431</a>
-<a href="#2432" id="2432">2432</a>
-<a href="#2433" id="2433">2433</a>
-<a href="#2434" id="2434">2434</a>
-<a href="#2435" id="2435">2435</a>
-<a href="#2436" id="2436">2436</a>
-<a href="#2437" id="2437">2437</a>
-<a href="#2438" id="2438">2438</a>
-<a href="#2439" id="2439">2439</a>
-<a href="#2440" id="2440">2440</a>
-<a href="#2441" id="2441">2441</a>
-<a href="#2442" id="2442">2442</a>
-<a href="#2443" id="2443">2443</a>
-<a href="#2444" id="2444">2444</a>
-<a href="#2445" id="2445">2445</a>
-<a href="#2446" id="2446">2446</a>
-<a href="#2447" id="2447">2447</a>
-<a href="#2448" id="2448">2448</a>
-<a href="#2449" id="2449">2449</a>
-<a href="#2450" id="2450">2450</a>
-<a href="#2451" id="2451">2451</a>
-<a href="#2452" id="2452">2452</a>
-<a href="#2453" id="2453">2453</a>
-<a href="#2454" id="2454">2454</a>
-<a href="#2455" id="2455">2455</a>
-<a href="#2456" id="2456">2456</a>
-<a href="#2457" id="2457">2457</a>
-<a href="#2458" id="2458">2458</a>
-<a href="#2459" id="2459">2459</a>
-<a href="#2460" id="2460">2460</a>
-<a href="#2461" id="2461">2461</a>
-<a href="#2462" id="2462">2462</a>
-<a href="#2463" id="2463">2463</a>
-<a href="#2464" id="2464">2464</a>
-<a href="#2465" id="2465">2465</a>
-<a href="#2466" id="2466">2466</a>
-<a href="#2467" id="2467">2467</a>
-<a href="#2468" id="2468">2468</a>
-<a href="#2469" id="2469">2469</a>
-<a href="#2470" id="2470">2470</a>
-<a href="#2471" id="2471">2471</a>
-<a href="#2472" id="2472">2472</a>
-<a href="#2473" id="2473">2473</a>
-<a href="#2474" id="2474">2474</a>
-<a href="#2475" id="2475">2475</a>
-<a href="#2476" id="2476">2476</a>
-<a href="#2477" id="2477">2477</a>
-<a href="#2478" id="2478">2478</a>
-<a href="#2479" id="2479">2479</a>
-<a href="#2480" id="2480">2480</a>
-<a href="#2481" id="2481">2481</a>
-<a href="#2482" id="2482">2482</a>
-<a href="#2483" id="2483">2483</a>
-<a href="#2484" id="2484">2484</a>
-<a href="#2485" id="2485">2485</a>
-<a href="#2486" id="2486">2486</a>
-<a href="#2487" id="2487">2487</a>
-<a href="#2488" id="2488">2488</a>
-<a href="#2489" id="2489">2489</a>
-<a href="#2490" id="2490">2490</a>
-<a href="#2491" id="2491">2491</a>
-<a href="#2492" id="2492">2492</a>
-<a href="#2493" id="2493">2493</a>
-<a href="#2494" id="2494">2494</a>
-<a href="#2495" id="2495">2495</a>
-<a href="#2496" id="2496">2496</a>
-<a href="#2497" id="2497">2497</a>
-<a href="#2498" id="2498">2498</a>
-<a href="#2499" id="2499">2499</a>
-<a href="#2500" id="2500">2500</a>
-<a href="#2501" id="2501">2501</a>
-<a href="#2502" id="2502">2502</a>
-<a href="#2503" id="2503">2503</a>
-<a href="#2504" id="2504">2504</a>
-<a href="#2505" id="2505">2505</a>
-<a href="#2506" id="2506">2506</a>
-<a href="#2507" id="2507">2507</a>
-<a href="#2508" id="2508">2508</a>
-<a href="#2509" id="2509">2509</a>
-<a href="#2510" id="2510">2510</a>
-<a href="#2511" id="2511">2511</a>
-<a href="#2512" id="2512">2512</a>
-<a href="#2513" id="2513">2513</a>
-<a href="#2514" id="2514">2514</a>
-<a href="#2515" id="2515">2515</a>
-<a href="#2516" id="2516">2516</a>
-<a href="#2517" id="2517">2517</a>
-<a href="#2518" id="2518">2518</a>
-<a href="#2519" id="2519">2519</a>
-<a href="#2520" id="2520">2520</a>
-<a href="#2521" id="2521">2521</a>
-<a href="#2522" id="2522">2522</a>
-<a href="#2523" id="2523">2523</a>
-<a href="#2524" id="2524">2524</a>
-<a href="#2525" id="2525">2525</a>
-<a href="#2526" id="2526">2526</a>
-<a href="#2527" id="2527">2527</a>
-<a href="#2528" id="2528">2528</a>
-<a href="#2529" id="2529">2529</a>
-<a href="#2530" id="2530">2530</a>
-<a href="#2531" id="2531">2531</a>
-<a href="#2532" id="2532">2532</a>
-<a href="#2533" id="2533">2533</a>
-<a href="#2534" id="2534">2534</a>
-<a href="#2535" id="2535">2535</a>
-<a href="#2536" id="2536">2536</a>
-<a href="#2537" id="2537">2537</a>
-<a href="#2538" id="2538">2538</a>
-<a href="#2539" id="2539">2539</a>
-<a href="#2540" id="2540">2540</a>
-<a href="#2541" id="2541">2541</a>
-<a href="#2542" id="2542">2542</a>
-<a href="#2543" id="2543">2543</a>
-<a href="#2544" id="2544">2544</a>
-<a href="#2545" id="2545">2545</a>
-<a href="#2546" id="2546">2546</a>
-<a href="#2547" id="2547">2547</a>
-<a href="#2548" id="2548">2548</a>
-<a href="#2549" id="2549">2549</a>
-<a href="#2550" id="2550">2550</a>
-<a href="#2551" id="2551">2551</a>
-<a href="#2552" id="2552">2552</a>
-<a href="#2553" id="2553">2553</a>
-<a href="#2554" id="2554">2554</a>
-<a href="#2555" id="2555">2555</a>
-<a href="#2556" id="2556">2556</a>
-<a href="#2557" id="2557">2557</a>
-<a href="#2558" id="2558">2558</a>
-<a href="#2559" id="2559">2559</a>
-<a href="#2560" id="2560">2560</a>
-<a href="#2561" id="2561">2561</a>
-<a href="#2562" id="2562">2562</a>
-<a href="#2563" id="2563">2563</a>
-<a href="#2564" id="2564">2564</a>
-<a href="#2565" id="2565">2565</a>
-<a href="#2566" id="2566">2566</a>
-<a href="#2567" id="2567">2567</a>
-<a href="#2568" id="2568">2568</a>
-<a href="#2569" id="2569">2569</a>
-<a href="#2570" id="2570">2570</a>
-<a href="#2571" id="2571">2571</a>
-<a href="#2572" id="2572">2572</a>
-<a href="#2573" id="2573">2573</a>
-<a href="#2574" id="2574">2574</a>
-<a href="#2575" id="2575">2575</a>
-<a href="#2576" id="2576">2576</a>
-<a href="#2577" id="2577">2577</a>
-<a href="#2578" id="2578">2578</a>
-<a href="#2579" id="2579">2579</a>
-<a href="#2580" id="2580">2580</a>
-<a href="#2581" id="2581">2581</a>
-<a href="#2582" id="2582">2582</a>
-<a href="#2583" id="2583">2583</a>
-<a href="#2584" id="2584">2584</a>
-<a href="#2585" id="2585">2585</a>
-<a href="#2586" id="2586">2586</a>
-<a href="#2587" id="2587">2587</a>
-<a href="#2588" id="2588">2588</a>
-<a href="#2589" id="2589">2589</a>
-<a href="#2590" id="2590">2590</a>
-<a href="#2591" id="2591">2591</a>
-<a href="#2592" id="2592">2592</a>
-<a href="#2593" id="2593">2593</a>
-<a href="#2594" id="2594">2594</a>
-<a href="#2595" id="2595">2595</a>
-<a href="#2596" id="2596">2596</a>
-<a href="#2597" id="2597">2597</a>
-<a href="#2598" id="2598">2598</a>
-<a href="#2599" id="2599">2599</a>
-<a href="#2600" id="2600">2600</a>
-<a href="#2601" id="2601">2601</a>
-<a href="#2602" id="2602">2602</a>
-<a href="#2603" id="2603">2603</a>
-<a href="#2604" id="2604">2604</a>
-<a href="#2605" id="2605">2605</a>
-<a href="#2606" id="2606">2606</a>
-<a href="#2607" id="2607">2607</a>
-<a href="#2608" id="2608">2608</a>
-<a href="#2609" id="2609">2609</a>
-<a href="#2610" id="2610">2610</a>
-<a href="#2611" id="2611">2611</a>
-<a href="#2612" id="2612">2612</a>
-<a href="#2613" id="2613">2613</a>
-<a href="#2614" id="2614">2614</a>
-<a href="#2615" id="2615">2615</a>
-<a href="#2616" id="2616">2616</a>
-<a href="#2617" id="2617">2617</a>
-<a href="#2618" id="2618">2618</a>
-<a href="#2619" id="2619">2619</a>
-<a href="#2620" id="2620">2620</a>
-<a href="#2621" id="2621">2621</a>
-<a href="#2622" id="2622">2622</a>
-<a href="#2623" id="2623">2623</a>
-<a href="#2624" id="2624">2624</a>
-<a href="#2625" id="2625">2625</a>
-<a href="#2626" id="2626">2626</a>
-<a href="#2627" id="2627">2627</a>
-<a href="#2628" id="2628">2628</a>
-<a href="#2629" id="2629">2629</a>
-<a href="#2630" id="2630">2630</a>
-<a href="#2631" id="2631">2631</a>
-<a href="#2632" id="2632">2632</a>
-<a href="#2633" id="2633">2633</a>
-<a href="#2634" id="2634">2634</a>
-<a href="#2635" id="2635">2635</a>
-<a href="#2636" id="2636">2636</a>
-<a href="#2637" id="2637">2637</a>
-<a href="#2638" id="2638">2638</a>
-<a href="#2639" id="2639">2639</a>
-<a href="#2640" id="2640">2640</a>
-<a href="#2641" id="2641">2641</a>
-<a href="#2642" id="2642">2642</a>
-<a href="#2643" id="2643">2643</a>
-<a href="#2644" id="2644">2644</a>
-<a href="#2645" id="2645">2645</a>
-<a href="#2646" id="2646">2646</a>
-<a href="#2647" id="2647">2647</a>
-<a href="#2648" id="2648">2648</a>
-<a href="#2649" id="2649">2649</a>
-<a href="#2650" id="2650">2650</a>
-<a href="#2651" id="2651">2651</a>
-<a href="#2652" id="2652">2652</a>
-<a href="#2653" id="2653">2653</a>
-<a href="#2654" id="2654">2654</a>
-<a href="#2655" id="2655">2655</a>
-<a href="#2656" id="2656">2656</a>
-<a href="#2657" id="2657">2657</a>
-<a href="#2658" id="2658">2658</a>
-<a href="#2659" id="2659">2659</a>
-<a href="#2660" id="2660">2660</a>
-<a href="#2661" id="2661">2661</a>
-<a href="#2662" id="2662">2662</a>
-<a href="#2663" id="2663">2663</a>
-<a href="#2664" id="2664">2664</a>
-<a href="#2665" id="2665">2665</a>
-<a href="#2666" id="2666">2666</a>
-<a href="#2667" id="2667">2667</a>
-<a href="#2668" id="2668">2668</a>
-<a href="#2669" id="2669">2669</a>
-<a href="#2670" id="2670">2670</a>
-<a href="#2671" id="2671">2671</a>
-<a href="#2672" id="2672">2672</a>
-<a href="#2673" id="2673">2673</a>
-<a href="#2674" id="2674">2674</a>
-<a href="#2675" id="2675">2675</a>
-<a href="#2676" id="2676">2676</a>
-<a href="#2677" id="2677">2677</a>
-<a href="#2678" id="2678">2678</a>
-<a href="#2679" id="2679">2679</a>
-<a href="#2680" id="2680">2680</a>
-<a href="#2681" id="2681">2681</a>
-<a href="#2682" id="2682">2682</a>
-<a href="#2683" id="2683">2683</a>
-<a href="#2684" id="2684">2684</a>
-<a href="#2685" id="2685">2685</a>
-<a href="#2686" id="2686">2686</a>
-<a href="#2687" id="2687">2687</a>
-<a href="#2688" id="2688">2688</a>
-<a href="#2689" id="2689">2689</a>
-<a href="#2690" id="2690">2690</a>
-<a href="#2691" id="2691">2691</a>
-<a href="#2692" id="2692">2692</a>
-<a href="#2693" id="2693">2693</a>
-<a href="#2694" id="2694">2694</a>
-<a href="#2695" id="2695">2695</a>
-<a href="#2696" id="2696">2696</a>
-<a href="#2697" id="2697">2697</a>
-<a href="#2698" id="2698">2698</a>
-<a href="#2699" id="2699">2699</a>
-<a href="#2700" id="2700">2700</a>
-<a href="#2701" id="2701">2701</a>
-<a href="#2702" id="2702">2702</a>
-<a href="#2703" id="2703">2703</a>
-<a href="#2704" id="2704">2704</a>
-<a href="#2705" id="2705">2705</a>
-<a href="#2706" id="2706">2706</a>
-<a href="#2707" id="2707">2707</a>
-<a href="#2708" id="2708">2708</a>
-<a href="#2709" id="2709">2709</a>
-<a href="#2710" id="2710">2710</a>
-<a href="#2711" id="2711">2711</a>
-<a href="#2712" id="2712">2712</a>
-<a href="#2713" id="2713">2713</a>
-<a href="#2714" id="2714">2714</a>
-<a href="#2715" id="2715">2715</a>
-<a href="#2716" id="2716">2716</a>
-<a href="#2717" id="2717">2717</a>
-<a href="#2718" id="2718">2718</a>
-<a href="#2719" id="2719">2719</a>
-<a href="#2720" id="2720">2720</a>
-<a href="#2721" id="2721">2721</a>
-<a href="#2722" id="2722">2722</a>
-<a href="#2723" id="2723">2723</a>
-<a href="#2724" id="2724">2724</a>
-<a href="#2725" id="2725">2725</a>
-<a href="#2726" id="2726">2726</a>
-<a href="#2727" id="2727">2727</a>
-<a href="#2728" id="2728">2728</a>
-<a href="#2729" id="2729">2729</a>
-<a href="#2730" id="2730">2730</a>
-<a href="#2731" id="2731">2731</a>
-<a href="#2732" id="2732">2732</a>
-<a href="#2733" id="2733">2733</a>
-<a href="#2734" id="2734">2734</a>
-<a href="#2735" id="2735">2735</a>
-<a href="#2736" id="2736">2736</a>
-<a href="#2737" id="2737">2737</a>
-<a href="#2738" id="2738">2738</a>
-<a href="#2739" id="2739">2739</a>
-<a href="#2740" id="2740">2740</a>
-<a href="#2741" id="2741">2741</a>
-<a href="#2742" id="2742">2742</a>
-<a href="#2743" id="2743">2743</a>
-<a href="#2744" id="2744">2744</a>
-<a href="#2745" id="2745">2745</a>
-<a href="#2746" id="2746">2746</a>
-<a href="#2747" id="2747">2747</a>
-<a href="#2748" id="2748">2748</a>
-<a href="#2749" id="2749">2749</a>
-<a href="#2750" id="2750">2750</a>
-<a href="#2751" id="2751">2751</a>
-<a href="#2752" id="2752">2752</a>
-<a href="#2753" id="2753">2753</a>
-<a href="#2754" id="2754">2754</a>
-<a href="#2755" id="2755">2755</a>
-<a href="#2756" id="2756">2756</a>
-<a href="#2757" id="2757">2757</a>
-<a href="#2758" id="2758">2758</a>
-<a href="#2759" id="2759">2759</a>
-<a href="#2760" id="2760">2760</a>
-<a href="#2761" id="2761">2761</a>
-<a href="#2762" id="2762">2762</a>
-<a href="#2763" id="2763">2763</a>
-<a href="#2764" id="2764">2764</a>
-<a href="#2765" id="2765">2765</a>
-<a href="#2766" id="2766">2766</a>
-<a href="#2767" id="2767">2767</a>
-<a href="#2768" id="2768">2768</a>
-<a href="#2769" id="2769">2769</a>
-<a href="#2770" id="2770">2770</a>
-<a href="#2771" id="2771">2771</a>
-<a href="#2772" id="2772">2772</a>
-<a href="#2773" id="2773">2773</a>
-<a href="#2774" id="2774">2774</a>
-<a href="#2775" id="2775">2775</a>
-<a href="#2776" id="2776">2776</a>
-<a href="#2777" id="2777">2777</a>
-<a href="#2778" id="2778">2778</a>
-<a href="#2779" id="2779">2779</a>
-<a href="#2780" id="2780">2780</a>
-<a href="#2781" id="2781">2781</a>
-<a href="#2782" id="2782">2782</a>
-<a href="#2783" id="2783">2783</a>
-<a href="#2784" id="2784">2784</a>
-<a href="#2785" id="2785">2785</a>
-<a href="#2786" id="2786">2786</a>
-<a href="#2787" id="2787">2787</a>
-<a href="#2788" id="2788">2788</a>
-<a href="#2789" id="2789">2789</a>
-<a href="#2790" id="2790">2790</a>
-<a href="#2791" id="2791">2791</a>
-<a href="#2792" id="2792">2792</a>
-<a href="#2793" id="2793">2793</a>
-<a href="#2794" id="2794">2794</a>
-<a href="#2795" id="2795">2795</a>
-<a href="#2796" id="2796">2796</a>
-<a href="#2797" id="2797">2797</a>
-<a href="#2798" id="2798">2798</a>
-<a href="#2799" id="2799">2799</a>
-<a href="#2800" id="2800">2800</a>
-<a href="#2801" id="2801">2801</a>
-<a href="#2802" id="2802">2802</a>
-<a href="#2803" id="2803">2803</a>
-<a href="#2804" id="2804">2804</a>
-<a href="#2805" id="2805">2805</a>
-<a href="#2806" id="2806">2806</a>
-<a href="#2807" id="2807">2807</a>
-<a href="#2808" id="2808">2808</a>
-<a href="#2809" id="2809">2809</a>
-<a href="#2810" id="2810">2810</a>
-<a href="#2811" id="2811">2811</a>
-<a href="#2812" id="2812">2812</a>
-<a href="#2813" id="2813">2813</a>
-<a href="#2814" id="2814">2814</a>
-<a href="#2815" id="2815">2815</a>
-<a href="#2816" id="2816">2816</a>
-<a href="#2817" id="2817">2817</a>
-<a href="#2818" id="2818">2818</a>
-<a href="#2819" id="2819">2819</a>
-<a href="#2820" id="2820">2820</a>
-<a href="#2821" id="2821">2821</a>
-<a href="#2822" id="2822">2822</a>
-<a href="#2823" id="2823">2823</a>
-<a href="#2824" id="2824">2824</a>
-<a href="#2825" id="2825">2825</a>
-<a href="#2826" id="2826">2826</a>
-<a href="#2827" id="2827">2827</a>
-<a href="#2828" id="2828">2828</a>
-<a href="#2829" id="2829">2829</a>
-<a href="#2830" id="2830">2830</a>
-<a href="#2831" id="2831">2831</a>
-<a href="#2832" id="2832">2832</a>
-<a href="#2833" id="2833">2833</a>
-<a href="#2834" id="2834">2834</a>
-<a href="#2835" id="2835">2835</a>
-<a href="#2836" id="2836">2836</a>
-<a href="#2837" id="2837">2837</a>
-<a href="#2838" id="2838">2838</a>
-<a href="#2839" id="2839">2839</a>
-<a href="#2840" id="2840">2840</a>
-<a href="#2841" id="2841">2841</a>
-<a href="#2842" id="2842">2842</a>
-<a href="#2843" id="2843">2843</a>
-<a href="#2844" id="2844">2844</a>
-<a href="#2845" id="2845">2845</a>
-<a href="#2846" id="2846">2846</a>
-<a href="#2847" id="2847">2847</a>
-<a href="#2848" id="2848">2848</a>
-<a href="#2849" id="2849">2849</a>
-<a href="#2850" id="2850">2850</a>
-<a href="#2851" id="2851">2851</a>
-<a href="#2852" id="2852">2852</a>
-<a href="#2853" id="2853">2853</a>
-<a href="#2854" id="2854">2854</a>
-<a href="#2855" id="2855">2855</a>
-<a href="#2856" id="2856">2856</a>
-<a href="#2857" id="2857">2857</a>
-<a href="#2858" id="2858">2858</a>
-<a href="#2859" id="2859">2859</a>
-<a href="#2860" id="2860">2860</a>
-<a href="#2861" id="2861">2861</a>
-<a href="#2862" id="2862">2862</a>
-<a href="#2863" id="2863">2863</a>
-<a href="#2864" id="2864">2864</a>
-<a href="#2865" id="2865">2865</a>
-<a href="#2866" id="2866">2866</a>
-<a href="#2867" id="2867">2867</a>
-<a href="#2868" id="2868">2868</a>
-<a href="#2869" id="2869">2869</a>
-<a href="#2870" id="2870">2870</a>
-<a href="#2871" id="2871">2871</a>
-<a href="#2872" id="2872">2872</a>
-<a href="#2873" id="2873">2873</a>
-<a href="#2874" id="2874">2874</a>
-<a href="#2875" id="2875">2875</a>
-<a href="#2876" id="2876">2876</a>
-<a href="#2877" id="2877">2877</a>
-<a href="#2878" id="2878">2878</a>
-<a href="#2879" id="2879">2879</a>
-<a href="#2880" id="2880">2880</a>
-<a href="#2881" id="2881">2881</a>
-<a href="#2882" id="2882">2882</a>
-<a href="#2883" id="2883">2883</a>
-<a href="#2884" id="2884">2884</a>
-<a href="#2885" id="2885">2885</a>
-<a href="#2886" id="2886">2886</a>
-<a href="#2887" id="2887">2887</a>
-<a href="#2888" id="2888">2888</a>
-<a href="#2889" id="2889">2889</a>
-<a href="#2890" id="2890">2890</a>
-<a href="#2891" id="2891">2891</a>
-<a href="#2892" id="2892">2892</a>
-<a href="#2893" id="2893">2893</a>
-<a href="#2894" id="2894">2894</a>
-<a href="#2895" id="2895">2895</a>
-<a href="#2896" id="2896">2896</a>
-<a href="#2897" id="2897">2897</a>
-<a href="#2898" id="2898">2898</a>
-<a href="#2899" id="2899">2899</a>
-<a href="#2900" id="2900">2900</a>
-<a href="#2901" id="2901">2901</a>
-<a href="#2902" id="2902">2902</a>
-<a href="#2903" id="2903">2903</a>
-<a href="#2904" id="2904">2904</a>
-<a href="#2905" id="2905">2905</a>
-<a href="#2906" id="2906">2906</a>
-<a href="#2907" id="2907">2907</a>
-<a href="#2908" id="2908">2908</a>
-<a href="#2909" id="2909">2909</a>
-<a href="#2910" id="2910">2910</a>
-<a href="#2911" id="2911">2911</a>
-<a href="#2912" id="2912">2912</a>
-<a href="#2913" id="2913">2913</a>
-<a href="#2914" id="2914">2914</a>
-<a href="#2915" id="2915">2915</a>
-<a href="#2916" id="2916">2916</a>
-<a href="#2917" id="2917">2917</a>
-<a href="#2918" id="2918">2918</a>
-<a href="#2919" id="2919">2919</a>
-<a href="#2920" id="2920">2920</a>
-<a href="#2921" id="2921">2921</a>
-<a href="#2922" id="2922">2922</a>
-<a href="#2923" id="2923">2923</a>
-<a href="#2924" id="2924">2924</a>
-<a href="#2925" id="2925">2925</a>
-<a href="#2926" id="2926">2926</a>
-<a href="#2927" id="2927">2927</a>
-<a href="#2928" id="2928">2928</a>
-<a href="#2929" id="2929">2929</a>
-<a href="#2930" id="2930">2930</a>
-<a href="#2931" id="2931">2931</a>
-<a href="#2932" id="2932">2932</a>
-<a href="#2933" id="2933">2933</a>
-<a href="#2934" id="2934">2934</a>
-<a href="#2935" id="2935">2935</a>
-<a href="#2936" id="2936">2936</a>
-<a href="#2937" id="2937">2937</a>
-<a href="#2938" id="2938">2938</a>
-<a href="#2939" id="2939">2939</a>
-<a href="#2940" id="2940">2940</a>
-<a href="#2941" id="2941">2941</a>
-<a href="#2942" id="2942">2942</a>
-<a href="#2943" id="2943">2943</a>
-<a href="#2944" id="2944">2944</a>
-<a href="#2945" id="2945">2945</a>
-<a href="#2946" id="2946">2946</a>
-<a href="#2947" id="2947">2947</a>
-<a href="#2948" id="2948">2948</a>
-<a href="#2949" id="2949">2949</a>
-<a href="#2950" id="2950">2950</a>
-<a href="#2951" id="2951">2951</a>
-<a href="#2952" id="2952">2952</a>
-<a href="#2953" id="2953">2953</a>
-<a href="#2954" id="2954">2954</a>
-</pre></div><pre class="rust"><code><span class="comment">// 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.
-
-</span><span class="doccomment">//! Manifest for Iceberg.
-</span><span class="kw">use </span>std::cmp::min;
-<span class="kw">use </span>std::collections::HashMap;
-<span class="kw">use </span>std::io::{Read, Write};
-<span class="kw">use </span>std::str::FromStr;
-<span class="kw">use </span>std::sync::Arc;
-
-<span class="kw">use </span>apache_avro::{from_value, to_value, Reader <span class="kw">as </span>AvroReader, Writer <span class="kw">as </span>AvroWriter};
-<span class="kw">use </span>bytes::Bytes;
-<span class="kw">use </span>itertools::Itertools;
-<span class="kw">use </span>serde_derive::{Deserialize, Serialize};
-<span class="kw">use </span>serde_json::to_vec;
-<span class="kw">use </span>serde_with::{DeserializeFromStr, SerializeDisplay};
-<span class="kw">use </span>typed_builder::TypedBuilder;
-
-<span class="kw">use </span><span class="self">self</span>::_const_schema::{manifest_schema_v1, manifest_schema_v2};
-<span class="kw">use super</span>::{
- Datum, FieldSummary, FormatVersion, ManifestContentType, ManifestFile, PartitionSpec,
- PrimitiveLiteral, PrimitiveType, Schema, SchemaId, SchemaRef, Struct, StructType,
- INITIAL_SEQUENCE_NUMBER, UNASSIGNED_SEQUENCE_NUMBER, UNASSIGNED_SNAPSHOT_ID,
-};
-<span class="kw">use </span><span class="kw">crate</span>::error::Result;
-<span class="kw">use </span><span class="kw">crate</span>::io::OutputFile;
-<span class="kw">use </span><span class="kw">crate</span>::spec::PartitionField;
-<span class="kw">use crate</span>::{Error, ErrorKind};
-
-<span class="doccomment">/// A manifest contains metadata and a list of entries.
-</span><span class="attr">#[derive(Debug, PartialEq, Eq, Clone)]
-</span><span class="kw">pub struct </span>Manifest {
- metadata: ManifestMetadata,
- entries: Vec<ManifestEntryRef>,
-}
-
-<span class="kw">impl </span>Manifest {
- <span class="doccomment">/// Parse manifest metadata and entries from bytes of avro file.
- </span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>try_from_avro_bytes(bs: <span class="kw-2">&</span>[u8]) -> <span class="prelude-ty">Result</span><(ManifestMetadata, Vec<ManifestEntry>)> {
- <span class="kw">let </span>reader = AvroReader::new(bs)<span class="question-mark">?</span>;
-
- <span class="comment">// Parse manifest metadata
- </span><span class="kw">let </span>meta = reader.user_metadata();
- <span class="kw">let </span>metadata = ManifestMetadata::parse(meta)<span class="question-mark">?</span>;
-
- <span class="comment">// Parse manifest entries
- </span><span class="kw">let </span>partition_type = metadata.partition_spec.partition_type(<span class="kw-2">&</span>metadata.schema)<span class="question-mark">?</span>;
-
- <span class="kw">let </span>entries = <span class="kw">match </span>metadata.format_version {
- FormatVersion::V1 => {
- <span class="kw">let </span>schema = manifest_schema_v1(<span class="kw-2">&</span>partition_type)<span class="question-mark">?</span>;
- <span class="kw">let </span>reader = AvroReader::with_schema(<span class="kw-2">&</span>schema, bs)<span class="question-mark">?</span>;
- reader
- .into_iter()
- .map(|value| {
- from_value::<_serde::ManifestEntryV1>(<span class="kw-2">&</span>value<span class="question-mark">?</span>)<span class="question-mark">?</span>.try_into(
- metadata.partition_spec.spec_id(),
- <span class="kw-2">&</span>partition_type,
- <span class="kw-2">&</span>metadata.schema,
- )
- })
- .collect::<<span class="prelude-ty">Result</span><Vec<<span class="kw">_</span>>>>()<span class="question-mark">?
- </span>}
- FormatVersion::V2 => {
- <span class="kw">let </span>schema = manifest_schema_v2(<span class="kw-2">&</span>partition_type)<span class="question-mark">?</span>;
- <span class="kw">let </span>reader = AvroReader::with_schema(<span class="kw-2">&</span>schema, bs)<span class="question-mark">?</span>;
- reader
- .into_iter()
- .map(|value| {
- from_value::<_serde::ManifestEntryV2>(<span class="kw-2">&</span>value<span class="question-mark">?</span>)<span class="question-mark">?</span>.try_into(
- metadata.partition_spec.spec_id(),
- <span class="kw-2">&</span>partition_type,
- <span class="kw-2">&</span>metadata.schema,
- )
- })
- .collect::<<span class="prelude-ty">Result</span><Vec<<span class="kw">_</span>>>>()<span class="question-mark">?
- </span>}
- };
-
- <span class="prelude-val">Ok</span>((metadata, entries))
- }
-
- <span class="doccomment">/// Parse manifest from bytes of avro file.
- </span><span class="kw">pub fn </span>parse_avro(bs: <span class="kw-2">&</span>[u8]) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
- <span class="kw">let </span>(metadata, entries) = <span class="self">Self</span>::try_from_avro_bytes(bs)<span class="question-mark">?</span>;
- <span class="prelude-val">Ok</span>(<span class="self">Self</span>::new(metadata, entries))
- }
-
- <span class="doccomment">/// Entries slice.
- </span><span class="kw">pub fn </span>entries(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>[ManifestEntryRef] {
- <span class="kw-2">&</span><span class="self">self</span>.entries
- }
-
- <span class="doccomment">/// Consume this Manifest, returning its constituent parts
- </span><span class="kw">pub fn </span>into_parts(<span class="self">self</span>) -> (Vec<ManifestEntryRef>, ManifestMetadata) {
- <span class="kw">let </span><span class="self">Self </span>{ entries, metadata } = <span class="self">self</span>;
- (entries, metadata)
- }
-
- <span class="doccomment">/// Constructor from [`ManifestMetadata`] and [`ManifestEntry`]s.
- </span><span class="kw">pub fn </span>new(metadata: ManifestMetadata, entries: Vec<ManifestEntry>) -> <span class="self">Self </span>{
- <span class="self">Self </span>{
- metadata,
- entries: entries.into_iter().map(Arc::new).collect(),
- }
- }
-}
-
-<span class="doccomment">/// The builder used to create a [`ManifestWriter`].
-</span><span class="kw">pub struct </span>ManifestWriterBuilder {
- output: OutputFile,
- snapshot_id: <span class="prelude-ty">Option</span><i64>,
- key_metadata: Vec<u8>,
- schema: SchemaRef,
- partition_spec: PartitionSpec,
-}
-
-<span class="kw">impl </span>ManifestWriterBuilder {
- <span class="doccomment">/// Create a new builder.
- </span><span class="kw">pub fn </span>new(
- output: OutputFile,
- snapshot_id: <span class="prelude-ty">Option</span><i64>,
- key_metadata: Vec<u8>,
- schema: SchemaRef,
- partition_spec: PartitionSpec,
- ) -> <span class="self">Self </span>{
- <span class="self">Self </span>{
- output,
- snapshot_id,
- key_metadata,
- schema,
- partition_spec,
- }
- }
-
- <span class="doccomment">/// Build a [`ManifestWriter`] for format version 1.
- </span><span class="kw">pub fn </span>build_v1(<span class="self">self</span>) -> ManifestWriter {
- <span class="kw">let </span>metadata = ManifestMetadata::builder()
- .schema_id(<span class="self">self</span>.schema.schema_id())
- .schema(<span class="self">self</span>.schema)
- .partition_spec(<span class="self">self</span>.partition_spec)
- .format_version(FormatVersion::V1)
- .content(ManifestContentType::Data)
- .build();
- ManifestWriter::new(<span class="self">self</span>.output, <span class="self">self</span>.snapshot_id, <span class="self">self</span>.key_metadata, metadata)
- }
-
- <span class="doccomment">/// Build a [`ManifestWriter`] for format version 2, data content.
- </span><span class="kw">pub fn </span>build_v2_data(<span class="self">self</span>) -> ManifestWriter {
- <span class="kw">let </span>metadata = ManifestMetadata::builder()
- .schema_id(<span class="self">self</span>.schema.schema_id())
- .schema(<span class="self">self</span>.schema)
- .partition_spec(<span class="self">self</span>.partition_spec)
- .format_version(FormatVersion::V2)
- .content(ManifestContentType::Data)
- .build();
- ManifestWriter::new(<span class="self">self</span>.output, <span class="self">self</span>.snapshot_id, <span class="self">self</span>.key_metadata, metadata)
- }
-
- <span class="doccomment">/// Build a [`ManifestWriter`] for format version 2, deletes content.
- </span><span class="kw">pub fn </span>build_v2_deletes(<span class="self">self</span>) -> ManifestWriter {
- <span class="kw">let </span>metadata = ManifestMetadata::builder()
- .schema_id(<span class="self">self</span>.schema.schema_id())
- .schema(<span class="self">self</span>.schema)
- .partition_spec(<span class="self">self</span>.partition_spec)
- .format_version(FormatVersion::V2)
- .content(ManifestContentType::Deletes)
- .build();
- ManifestWriter::new(<span class="self">self</span>.output, <span class="self">self</span>.snapshot_id, <span class="self">self</span>.key_metadata, metadata)
- }
-}
-
-<span class="doccomment">/// A manifest writer.
-</span><span class="kw">pub struct </span>ManifestWriter {
- output: OutputFile,
-
- snapshot_id: <span class="prelude-ty">Option</span><i64>,
-
- added_files: u32,
- added_rows: u64,
- existing_files: u32,
- existing_rows: u64,
- deleted_files: u32,
- deleted_rows: u64,
-
- min_seq_num: <span class="prelude-ty">Option</span><i64>,
-
- key_metadata: Vec<u8>,
-
- manifest_entries: Vec<ManifestEntry>,
-
- metadata: ManifestMetadata,
-}
-
-<span class="kw">struct </span>PartitionFieldStats {
- partition_type: PrimitiveType,
- summary: FieldSummary,
-}
-
-<span class="kw">impl </span>PartitionFieldStats {
- <span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>new(partition_type: PrimitiveType) -> <span class="self">Self </span>{
- <span class="self">Self </span>{
- partition_type,
- summary: FieldSummary::default(),
- }
- }
-
- <span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>update(<span class="kw-2">&mut </span><span class="self">self</span>, value: <span class="prelude-ty">Option</span><PrimitiveLiteral>) -> <span class="prelude-ty">Result</span><()> {
- <span class="kw">let </span><span class="prelude-val">Some</span>(value) = value <span class="kw">else </span>{
- <span class="self">self</span>.summary.contains_null = <span class="bool-val">true</span>;
- <span class="kw">return </span><span class="prelude-val">Ok</span>(());
- };
- <span class="kw">if </span>!<span class="self">self</span>.partition_type.compatible(<span class="kw-2">&</span>value) {
- <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
- ErrorKind::DataInvalid,
- <span class="string">"value is not compatitable with type"</span>,
- ));
- }
- <span class="kw">let </span>value = Datum::new(<span class="self">self</span>.partition_type.clone(), value);
-
- <span class="kw">if </span>value.is_nan() {
- <span class="self">self</span>.summary.contains_nan = <span class="prelude-val">Some</span>(<span class="bool-val">true</span>);
- <span class="kw">return </span><span class="prelude-val">Ok</span>(());
- }
-
- <span class="self">self</span>.summary.lower_bound = <span class="prelude-val">Some</span>(<span class="self">self</span>.summary.lower_bound.take().map_or(
- value.clone(),
- |original| {
- <span class="kw">if </span>value < original {
- value.clone()
- } <span class="kw">else </span>{
- original
- }
- },
- ));
- <span class="self">self</span>.summary.upper_bound = <span class="prelude-val">Some</span>(<span class="self">self</span>.summary.upper_bound.take().map_or(
- value.clone(),
- |original| {
- <span class="kw">if </span>value > original {
- value
- } <span class="kw">else </span>{
- original
- }
- },
- ));
-
- <span class="prelude-val">Ok</span>(())
- }
-
- <span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>finish(<span class="kw-2">mut </span><span class="self">self</span>) -> FieldSummary {
- <span class="comment">// Always set contains_nan
- </span><span class="self">self</span>.summary.contains_nan = <span class="self">self</span>.summary.contains_nan.or(<span class="prelude-val">Some</span>(<span class="bool-val">false</span>));
- <span class="self">self</span>.summary
- }
-}
-
-<span class="kw">impl </span>ManifestWriter {
- <span class="doccomment">/// Create a new manifest writer.
- </span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>new(
- output: OutputFile,
- snapshot_id: <span class="prelude-ty">Option</span><i64>,
- key_metadata: Vec<u8>,
- metadata: ManifestMetadata,
- ) -> <span class="self">Self </span>{
- <span class="self">Self </span>{
- output,
- snapshot_id,
- added_files: <span class="number">0</span>,
- added_rows: <span class="number">0</span>,
- existing_files: <span class="number">0</span>,
- existing_rows: <span class="number">0</span>,
- deleted_files: <span class="number">0</span>,
- deleted_rows: <span class="number">0</span>,
- min_seq_num: <span class="prelude-val">None</span>,
- key_metadata,
- manifest_entries: Vec::new(),
- metadata,
- }
- }
-
- <span class="kw">fn </span>construct_partition_summaries(
- <span class="kw-2">&mut </span><span class="self">self</span>,
- partition_type: <span class="kw-2">&</span>StructType,
- ) -> <span class="prelude-ty">Result</span><Vec<FieldSummary>> {
- <span class="kw">let </span><span class="kw-2">mut </span>field_stats: Vec<<span class="kw">_</span>> = partition_type
- .fields()
- .iter()
- .map(|f| PartitionFieldStats::new(f.field_type.as_primitive_type().unwrap().clone()))
- .collect();
- <span class="kw">for </span>partition <span class="kw">in </span><span class="self">self</span>.manifest_entries.iter().map(|e| <span class="kw-2">&</span>e.data_file.partition) {
- <span class="kw">for </span>(literal, stat) <span class="kw">in </span>partition.iter().zip_eq(field_stats.iter_mut()) {
- <span class="kw">let </span>primitive_literal = literal.map(|v| v.as_primitive_literal().unwrap());
- stat.update(primitive_literal)<span class="question-mark">?</span>;
- }
- }
- <span class="prelude-val">Ok</span>(field_stats.into_iter().map(|stat| stat.finish()).collect())
- }
-
- <span class="kw">fn </span>check_data_file(<span class="kw-2">&</span><span class="self">self</span>, data_file: <span class="kw-2">&</span>DataFile) -> <span class="prelude-ty">Result</span><()> {
- <span class="kw">match </span><span class="self">self</span>.metadata.content {
- ManifestContentType::Data => {
- <span class="kw">if </span>data_file.content != DataContentType::Data {
- <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
- ErrorKind::DataInvalid,
- <span class="macro">format!</span>(
- <span class="string">"Content type of entry {:?} should have DataContentType::Data"</span>,
- data_file.content
- ),
- ));
- }
- }
- ManifestContentType::Deletes => {
- <span class="kw">if </span>data_file.content != DataContentType::EqualityDeletes
- && data_file.content != DataContentType::PositionDeletes
- {
- <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
- ErrorKind::DataInvalid,
- <span class="macro">format!</span>(<span class="string">"Content type of entry {:?} should have DataContentType::EqualityDeletes or DataContentType::PositionDeletes"</span>, data_file.content),
- ));
- }
- }
- }
- <span class="prelude-val">Ok</span>(())
- }
-
- <span class="doccomment">/// Add a new manifest entry. This method will update following status of the entry:
- /// - Update the entry status to `Added`
- /// - Set the snapshot id to the current snapshot id
- /// - Set the sequence number to `None` if it is invalid(smaller than 0)
- /// - Set the file sequence number to `None`
- </span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>add_entry(<span class="kw-2">&mut </span><span class="self">self</span>, <span class="kw-2">mut </span>entry: ManifestEntry) -> <span class="prelude-ty">Result</span><()> {
- <span class="self">self</span>.check_data_file(<span class="kw-2">&</span>entry.data_file)<span class="question-mark">?</span>;
- <span class="kw">if </span>entry.sequence_number().is_some_and(|n| n >= <span class="number">0</span>) {
- entry.status = ManifestStatus::Added;
- entry.snapshot_id = <span class="self">self</span>.snapshot_id;
- entry.file_sequence_number = <span class="prelude-val">None</span>;
- } <span class="kw">else </span>{
- entry.status = ManifestStatus::Added;
- entry.snapshot_id = <span class="self">self</span>.snapshot_id;
- entry.sequence_number = <span class="prelude-val">None</span>;
- entry.file_sequence_number = <span class="prelude-val">None</span>;
- };
- <span class="self">self</span>.add_entry_inner(entry)<span class="question-mark">?</span>;
- <span class="prelude-val">Ok</span>(())
- }
-
- <span class="doccomment">/// Add file as an added entry with a specific sequence number. The entry's snapshot ID will be this manifest's snapshot ID. The entry's data sequence
- /// number will be the provided data sequence number. The entry's file sequence number will be
- /// assigned at commit.
- </span><span class="kw">pub fn </span>add_file(<span class="kw-2">&mut </span><span class="self">self</span>, data_file: DataFile, sequence_number: i64) -> <span class="prelude-ty">Result</span><()> {
- <span class="self">self</span>.check_data_file(<span class="kw-2">&</span>data_file)<span class="question-mark">?</span>;
- <span class="kw">let </span>entry = ManifestEntry {
- status: ManifestStatus::Added,
- snapshot_id: <span class="self">self</span>.snapshot_id,
- sequence_number: (sequence_number >= <span class="number">0</span>).then_some(sequence_number),
- file_sequence_number: <span class="prelude-val">None</span>,
- data_file,
- };
- <span class="self">self</span>.add_entry_inner(entry)<span class="question-mark">?</span>;
- <span class="prelude-val">Ok</span>(())
- }
-
- <span class="doccomment">/// Add a delete manifest entry. This method will update following status of the entry:
- /// - Update the entry status to `Deleted`
- /// - Set the snapshot id to the current snapshot id
- ///
- /// # TODO
- /// Remove this allow later
- </span><span class="attr">#[allow(dead_code)]
- </span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>add_delete_entry(<span class="kw-2">&mut </span><span class="self">self</span>, <span class="kw-2">mut </span>entry: ManifestEntry) -> <span class="prelude-ty">Result</span><()> {
- <span class="self">self</span>.check_data_file(<span class="kw-2">&</span>entry.data_file)<span class="question-mark">?</span>;
- entry.status = ManifestStatus::Deleted;
- entry.snapshot_id = <span class="self">self</span>.snapshot_id;
- <span class="self">self</span>.add_entry_inner(entry)<span class="question-mark">?</span>;
- <span class="prelude-val">Ok</span>(())
- }
-
- <span class="doccomment">/// Add a file as delete manifest entry. The entry's snapshot ID will be this manifest's snapshot ID.
- /// However, the original data and file sequence numbers of the file must be preserved when
- /// the file is marked as deleted.
- </span><span class="kw">pub fn </span>add_delete_file(
- <span class="kw-2">&mut </span><span class="self">self</span>,
- data_file: DataFile,
- sequence_number: i64,
- file_sequence_number: <span class="prelude-ty">Option</span><i64>,
- ) -> <span class="prelude-ty">Result</span><()> {
- <span class="self">self</span>.check_data_file(<span class="kw-2">&</span>data_file)<span class="question-mark">?</span>;
- <span class="kw">let </span>entry = ManifestEntry {
- status: ManifestStatus::Deleted,
- snapshot_id: <span class="self">self</span>.snapshot_id,
- sequence_number: <span class="prelude-val">Some</span>(sequence_number),
- file_sequence_number,
- data_file,
- };
- <span class="self">self</span>.add_entry_inner(entry)<span class="question-mark">?</span>;
- <span class="prelude-val">Ok</span>(())
- }
-
- <span class="doccomment">/// Add an existing manifest entry. This method will update following status of the entry:
- /// - Update the entry status to `Existing`
- ///
- /// # TODO
- /// Remove this allow later
- </span><span class="attr">#[allow(dead_code)]
- </span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>add_existing_entry(<span class="kw-2">&mut </span><span class="self">self</span>, <span class="kw-2">mut </span>entry: ManifestEntry) -> <span class="prelude-ty">Result</span><()> {
- <span class="self">self</span>.check_data_file(<span class="kw-2">&</span>entry.data_file)<span class="question-mark">?</span>;
- entry.status = ManifestStatus::Existing;
- <span class="self">self</span>.add_entry_inner(entry)<span class="question-mark">?</span>;
- <span class="prelude-val">Ok</span>(())
- }
-
- <span class="doccomment">/// Add an file as existing manifest entry. The original data and file sequence numbers, snapshot ID,
- /// which were assigned at commit, must be preserved when adding an existing entry.
- </span><span class="kw">pub fn </span>add_existing_file(
- <span class="kw-2">&mut </span><span class="self">self</span>,
- data_file: DataFile,
- snapshot_id: i64,
- sequence_number: i64,
- file_sequence_number: <span class="prelude-ty">Option</span><i64>,
- ) -> <span class="prelude-ty">Result</span><()> {
- <span class="self">self</span>.check_data_file(<span class="kw-2">&</span>data_file)<span class="question-mark">?</span>;
- <span class="kw">let </span>entry = ManifestEntry {
- status: ManifestStatus::Existing,
- snapshot_id: <span class="prelude-val">Some</span>(snapshot_id),
- sequence_number: <span class="prelude-val">Some</span>(sequence_number),
- file_sequence_number,
- data_file,
- };
- <span class="self">self</span>.add_entry_inner(entry)<span class="question-mark">?</span>;
- <span class="prelude-val">Ok</span>(())
- }
-
- <span class="kw">fn </span>add_entry_inner(<span class="kw-2">&mut </span><span class="self">self</span>, entry: ManifestEntry) -> <span class="prelude-ty">Result</span><()> {
- <span class="comment">// Check if the entry has sequence number
- </span><span class="kw">if </span>(entry.status == ManifestStatus::Deleted || entry.status == ManifestStatus::Existing)
- && (entry.sequence_number.is_none() || entry.file_sequence_number.is_none())
- {
- <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
- ErrorKind::DataInvalid,
- <span class="string">"Manifest entry with status Existing or Deleted should have sequence number"</span>,
- ));
- }
-
- <span class="comment">// Update the statistics
- </span><span class="kw">match </span>entry.status {
- ManifestStatus::Added => {
- <span class="self">self</span>.added_files += <span class="number">1</span>;
- <span class="self">self</span>.added_rows += entry.data_file.record_count;
- }
- ManifestStatus::Deleted => {
- <span class="self">self</span>.deleted_files += <span class="number">1</span>;
- <span class="self">self</span>.deleted_rows += entry.data_file.record_count;
- }
- ManifestStatus::Existing => {
- <span class="self">self</span>.existing_files += <span class="number">1</span>;
- <span class="self">self</span>.existing_rows += entry.data_file.record_count;
- }
- }
- <span class="kw">if </span>entry.is_alive() {
- <span class="kw">if let </span><span class="prelude-val">Some</span>(seq_num) = entry.sequence_number {
- <span class="self">self</span>.min_seq_num = <span class="prelude-val">Some</span>(<span class="self">self</span>.min_seq_num.map_or(seq_num, |v| min(v, seq_num)));
- }
- }
- <span class="self">self</span>.manifest_entries.push(entry);
- <span class="prelude-val">Ok</span>(())
- }
-
- <span class="doccomment">/// Write manifest file and return it.
- </span><span class="kw">pub async fn </span>write_manifest_file(<span class="kw-2">mut </span><span class="self">self</span>) -> <span class="prelude-ty">Result</span><ManifestFile> {
- <span class="comment">// Create the avro writer
- </span><span class="kw">let </span>partition_type = <span class="self">self
- </span>.metadata
- .partition_spec
- .partition_type(<span class="kw-2">&</span><span class="self">self</span>.metadata.schema)<span class="question-mark">?</span>;
- <span class="kw">let </span>table_schema = <span class="kw-2">&</span><span class="self">self</span>.metadata.schema;
- <span class="kw">let </span>avro_schema = <span class="kw">match </span><span class="self">self</span>.metadata.format_version {
- FormatVersion::V1 => manifest_schema_v1(<span class="kw-2">&</span>partition_type)<span class="question-mark">?</span>,
- FormatVersion::V2 => manifest_schema_v2(<span class="kw-2">&</span>partition_type)<span class="question-mark">?</span>,
- };
- <span class="kw">let </span><span class="kw-2">mut </span>avro_writer = AvroWriter::new(<span class="kw-2">&</span>avro_schema, Vec::new());
- avro_writer.add_user_metadata(
- <span class="string">"schema"</span>.to_string(),
- to_vec(table_schema).map_err(|err| {
- Error::new(ErrorKind::DataInvalid, <span class="string">"Fail to serialize table schema"</span>)
- .with_source(err)
- })<span class="question-mark">?</span>,
- )<span class="question-mark">?</span>;
- avro_writer.add_user_metadata(
- <span class="string">"schema-id"</span>.to_string(),
- table_schema.schema_id().to_string(),
- )<span class="question-mark">?</span>;
- avro_writer.add_user_metadata(
- <span class="string">"partition-spec"</span>.to_string(),
- to_vec(<span class="kw-2">&</span><span class="self">self</span>.metadata.partition_spec.fields()).map_err(|err| {
- Error::new(ErrorKind::DataInvalid, <span class="string">"Fail to serialize partition spec"</span>)
- .with_source(err)
- })<span class="question-mark">?</span>,
- )<span class="question-mark">?</span>;
- avro_writer.add_user_metadata(
- <span class="string">"partition-spec-id"</span>.to_string(),
- <span class="self">self</span>.metadata.partition_spec.spec_id().to_string(),
- )<span class="question-mark">?</span>;
- avro_writer.add_user_metadata(
- <span class="string">"format-version"</span>.to_string(),
- (<span class="self">self</span>.metadata.format_version <span class="kw">as </span>u8).to_string(),
- )<span class="question-mark">?</span>;
- <span class="kw">if </span><span class="self">self</span>.metadata.format_version == FormatVersion::V2 {
- avro_writer
- .add_user_metadata(<span class="string">"content"</span>.to_string(), <span class="self">self</span>.metadata.content.to_string())<span class="question-mark">?</span>;
- }
-
- <span class="kw">let </span>partition_summary = <span class="self">self</span>.construct_partition_summaries(<span class="kw-2">&</span>partition_type)<span class="question-mark">?</span>;
- <span class="comment">// Write manifest entries
- </span><span class="kw">for </span>entry <span class="kw">in </span>std::mem::take(<span class="kw-2">&mut </span><span class="self">self</span>.manifest_entries) {
- <span class="kw">let </span>value = <span class="kw">match </span><span class="self">self</span>.metadata.format_version {
- FormatVersion::V1 => {
- to_value(_serde::ManifestEntryV1::try_from(entry, <span class="kw-2">&</span>partition_type)<span class="question-mark">?</span>)<span class="question-mark">?
- </span>.resolve(<span class="kw-2">&</span>avro_schema)<span class="question-mark">?
- </span>}
- FormatVersion::V2 => {
- to_value(_serde::ManifestEntryV2::try_from(entry, <span class="kw-2">&</span>partition_type)<span class="question-mark">?</span>)<span class="question-mark">?
- </span>.resolve(<span class="kw-2">&</span>avro_schema)<span class="question-mark">?
- </span>}
- };
-
- avro_writer.append(value)<span class="question-mark">?</span>;
- }
-
- <span class="kw">let </span>content = avro_writer.into_inner()<span class="question-mark">?</span>;
- <span class="kw">let </span>length = content.len();
- <span class="self">self</span>.output.write(Bytes::from(content)).<span class="kw">await</span><span class="question-mark">?</span>;
-
- <span class="prelude-val">Ok</span>(ManifestFile {
- manifest_path: <span class="self">self</span>.output.location().to_string(),
- manifest_length: length <span class="kw">as </span>i64,
- partition_spec_id: <span class="self">self</span>.metadata.partition_spec.spec_id(),
- content: <span class="self">self</span>.metadata.content,
- <span class="comment">// sequence_number and min_sequence_number with UNASSIGNED_SEQUENCE_NUMBER will be replace with
- // real sequence number in `ManifestListWriter`.
- </span>sequence_number: UNASSIGNED_SEQUENCE_NUMBER,
- min_sequence_number: <span class="self">self</span>.min_seq_num.unwrap_or(UNASSIGNED_SEQUENCE_NUMBER),
- added_snapshot_id: <span class="self">self</span>.snapshot_id.unwrap_or(UNASSIGNED_SNAPSHOT_ID),
- added_files_count: <span class="prelude-val">Some</span>(<span class="self">self</span>.added_files),
- existing_files_count: <span class="prelude-val">Some</span>(<span class="self">self</span>.existing_files),
- deleted_files_count: <span class="prelude-val">Some</span>(<span class="self">self</span>.deleted_files),
- added_rows_count: <span class="prelude-val">Some</span>(<span class="self">self</span>.added_rows),
- existing_rows_count: <span class="prelude-val">Some</span>(<span class="self">self</span>.existing_rows),
- deleted_rows_count: <span class="prelude-val">Some</span>(<span class="self">self</span>.deleted_rows),
- partitions: partition_summary,
- key_metadata: <span class="self">self</span>.key_metadata,
- })
- }
-}
-
-<span class="doccomment">/// This is a helper module that defines the schema field of the manifest list entry.
-</span><span class="kw">mod </span>_const_schema {
- <span class="kw">use </span>std::sync::Arc;
-
- <span class="kw">use </span>apache_avro::Schema <span class="kw">as </span>AvroSchema;
- <span class="kw">use </span>once_cell::sync::Lazy;
-
- <span class="kw">use </span><span class="kw">crate</span>::avro::schema_to_avro_schema;
- <span class="kw">use </span><span class="kw">crate</span>::spec::{
- ListType, MapType, NestedField, NestedFieldRef, PrimitiveType, Schema, StructType, Type,
- };
- <span class="kw">use </span><span class="kw">crate</span>::Error;
-
- <span class="kw">static </span>STATUS: Lazy<NestedFieldRef> = {
- Lazy::new(|| {
- Arc::new(NestedField::required(
- <span class="number">0</span>,
- <span class="string">"status"</span>,
- Type::Primitive(PrimitiveType::Int),
- ))
- })
- };
-
- <span class="kw">static </span>SNAPSHOT_ID_V1: Lazy<NestedFieldRef> = {
- Lazy::new(|| {
- Arc::new(NestedField::required(
- <span class="number">1</span>,
- <span class="string">"snapshot_id"</span>,
- Type::Primitive(PrimitiveType::Long),
- ))
- })
- };
-
- <span class="kw">static </span>SNAPSHOT_ID_V2: Lazy<NestedFieldRef> = {
- Lazy::new(|| {
- Arc::new(NestedField::optional(
- <span class="number">1</span>,
- <span class="string">"snapshot_id"</span>,
- Type::Primitive(PrimitiveType::Long),
- ))
- })
- };
-
- <span class="kw">static </span>SEQUENCE_NUMBER: Lazy<NestedFieldRef> = {
- Lazy::new(|| {
- Arc::new(NestedField::optional(
- <span class="number">3</span>,
- <span class="string">"sequence_number"</span>,
- Type::Primitive(PrimitiveType::Long),
- ))
- })
- };
-
- <span class="kw">static </span>FILE_SEQUENCE_NUMBER: Lazy<NestedFieldRef> = {
- Lazy::new(|| {
- Arc::new(NestedField::optional(
- <span class="number">4</span>,
- <span class="string">"file_sequence_number"</span>,
- Type::Primitive(PrimitiveType::Long),
- ))
- })
- };
-
- <span class="kw">static </span>CONTENT: Lazy<NestedFieldRef> = {
- Lazy::new(|| {
- Arc::new(NestedField::required(
- <span class="number">134</span>,
- <span class="string">"content"</span>,
- Type::Primitive(PrimitiveType::Int),
- ))
- })
- };
-
- <span class="kw">static </span>FILE_PATH: Lazy<NestedFieldRef> = {
- Lazy::new(|| {
- Arc::new(NestedField::required(
- <span class="number">100</span>,
- <span class="string">"file_path"</span>,
- Type::Primitive(PrimitiveType::String),
- ))
- })
- };
-
- <span class="kw">static </span>FILE_FORMAT: Lazy<NestedFieldRef> = {
- Lazy::new(|| {
- Arc::new(NestedField::required(
- <span class="number">101</span>,
- <span class="string">"file_format"</span>,
- Type::Primitive(PrimitiveType::String),
- ))
- })
- };
-
- <span class="kw">static </span>RECORD_COUNT: Lazy<NestedFieldRef> = {
- Lazy::new(|| {
- Arc::new(NestedField::required(
- <span class="number">103</span>,
- <span class="string">"record_count"</span>,
- Type::Primitive(PrimitiveType::Long),
- ))
- })
- };
-
- <span class="kw">static </span>FILE_SIZE_IN_BYTES: Lazy<NestedFieldRef> = {
- Lazy::new(|| {
- Arc::new(NestedField::required(
- <span class="number">104</span>,
- <span class="string">"file_size_in_bytes"</span>,
- Type::Primitive(PrimitiveType::Long),
- ))
- })
- };
-
- <span class="comment">// Deprecated. Always write a default in v1. Do not write in v2.
- </span><span class="kw">static </span>BLOCK_SIZE_IN_BYTES: Lazy<NestedFieldRef> = {
- Lazy::new(|| {
- Arc::new(NestedField::required(
- <span class="number">105</span>,
- <span class="string">"block_size_in_bytes"</span>,
- Type::Primitive(PrimitiveType::Long),
- ))
- })
- };
-
- <span class="kw">static </span>COLUMN_SIZES: Lazy<NestedFieldRef> = {
- Lazy::new(|| {
- Arc::new(NestedField::optional(
- <span class="number">108</span>,
- <span class="string">"column_sizes"</span>,
- Type::Map(MapType {
- key_field: Arc::new(NestedField::required(
- <span class="number">117</span>,
- <span class="string">"key"</span>,
- Type::Primitive(PrimitiveType::Int),
- )),
- value_field: Arc::new(NestedField::required(
- <span class="number">118</span>,
- <span class="string">"value"</span>,
- Type::Primitive(PrimitiveType::Long),
- )),
- }),
- ))
- })
- };
-
- <span class="kw">static </span>VALUE_COUNTS: Lazy<NestedFieldRef> = {
- Lazy::new(|| {
- Arc::new(NestedField::optional(
- <span class="number">109</span>,
- <span class="string">"value_counts"</span>,
- Type::Map(MapType {
- key_field: Arc::new(NestedField::required(
- <span class="number">119</span>,
- <span class="string">"key"</span>,
- Type::Primitive(PrimitiveType::Int),
- )),
- value_field: Arc::new(NestedField::required(
- <span class="number">120</span>,
- <span class="string">"value"</span>,
- Type::Primitive(PrimitiveType::Long),
- )),
- }),
- ))
- })
- };
-
- <span class="kw">static </span>NULL_VALUE_COUNTS: Lazy<NestedFieldRef> = {
- Lazy::new(|| {
- Arc::new(NestedField::optional(
- <span class="number">110</span>,
- <span class="string">"null_value_counts"</span>,
- Type::Map(MapType {
- key_field: Arc::new(NestedField::required(
- <span class="number">121</span>,
- <span class="string">"key"</span>,
- Type::Primitive(PrimitiveType::Int),
- )),
- value_field: Arc::new(NestedField::required(
- <span class="number">122</span>,
- <span class="string">"value"</span>,
- Type::Primitive(PrimitiveType::Long),
- )),
- }),
- ))
- })
- };
-
- <span class="kw">static </span>NAN_VALUE_COUNTS: Lazy<NestedFieldRef> = {
- Lazy::new(|| {
- Arc::new(NestedField::optional(
- <span class="number">137</span>,
- <span class="string">"nan_value_counts"</span>,
- Type::Map(MapType {
- key_field: Arc::new(NestedField::required(
- <span class="number">138</span>,
- <span class="string">"key"</span>,
- Type::Primitive(PrimitiveType::Int),
- )),
- value_field: Arc::new(NestedField::required(
- <span class="number">139</span>,
- <span class="string">"value"</span>,
- Type::Primitive(PrimitiveType::Long),
- )),
- }),
- ))
- })
- };
-
- <span class="kw">static </span>LOWER_BOUNDS: Lazy<NestedFieldRef> = {
- Lazy::new(|| {
- Arc::new(NestedField::optional(
- <span class="number">125</span>,
- <span class="string">"lower_bounds"</span>,
- Type::Map(MapType {
- key_field: Arc::new(NestedField::required(
- <span class="number">126</span>,
- <span class="string">"key"</span>,
- Type::Primitive(PrimitiveType::Int),
- )),
- value_field: Arc::new(NestedField::required(
- <span class="number">127</span>,
- <span class="string">"value"</span>,
- Type::Primitive(PrimitiveType::Binary),
- )),
- }),
- ))
- })
- };
-
- <span class="kw">static </span>UPPER_BOUNDS: Lazy<NestedFieldRef> = {
- Lazy::new(|| {
- Arc::new(NestedField::optional(
- <span class="number">128</span>,
- <span class="string">"upper_bounds"</span>,
- Type::Map(MapType {
- key_field: Arc::new(NestedField::required(
- <span class="number">129</span>,
- <span class="string">"key"</span>,
- Type::Primitive(PrimitiveType::Int),
- )),
- value_field: Arc::new(NestedField::required(
- <span class="number">130</span>,
- <span class="string">"value"</span>,
- Type::Primitive(PrimitiveType::Binary),
- )),
- }),
- ))
- })
- };
-
- <span class="kw">static </span>KEY_METADATA: Lazy<NestedFieldRef> = {
- Lazy::new(|| {
- Arc::new(NestedField::optional(
- <span class="number">131</span>,
- <span class="string">"key_metadata"</span>,
- Type::Primitive(PrimitiveType::Binary),
- ))
- })
- };
-
- <span class="kw">static </span>SPLIT_OFFSETS: Lazy<NestedFieldRef> = {
- Lazy::new(|| {
- Arc::new(NestedField::optional(
- <span class="number">132</span>,
- <span class="string">"split_offsets"</span>,
- Type::List(ListType {
- element_field: Arc::new(NestedField::required(
- <span class="number">133</span>,
- <span class="string">"element"</span>,
- Type::Primitive(PrimitiveType::Long),
- )),
- }),
- ))
- })
- };
-
- <span class="kw">static </span>EQUALITY_IDS: Lazy<NestedFieldRef> = {
- Lazy::new(|| {
- Arc::new(NestedField::optional(
- <span class="number">135</span>,
- <span class="string">"equality_ids"</span>,
- Type::List(ListType {
- element_field: Arc::new(NestedField::required(
- <span class="number">136</span>,
- <span class="string">"element"</span>,
- Type::Primitive(PrimitiveType::Int),
- )),
- }),
- ))
- })
- };
-
- <span class="kw">static </span>SORT_ORDER_ID: Lazy<NestedFieldRef> = {
- Lazy::new(|| {
- Arc::new(NestedField::optional(
- <span class="number">140</span>,
- <span class="string">"sort_order_id"</span>,
- Type::Primitive(PrimitiveType::Int),
- ))
- })
- };
-
- <span class="kw">fn </span>data_file_fields_v2(partition_type: <span class="kw-2">&</span>StructType) -> Vec<NestedFieldRef> {
- <span class="macro">vec!</span>[
- CONTENT.clone(),
- FILE_PATH.clone(),
- FILE_FORMAT.clone(),
- Arc::new(NestedField::required(
- <span class="number">102</span>,
- <span class="string">"partition"</span>,
- Type::Struct(partition_type.clone()),
- )),
- RECORD_COUNT.clone(),
- FILE_SIZE_IN_BYTES.clone(),
- COLUMN_SIZES.clone(),
- VALUE_COUNTS.clone(),
- NULL_VALUE_COUNTS.clone(),
- NAN_VALUE_COUNTS.clone(),
- LOWER_BOUNDS.clone(),
- UPPER_BOUNDS.clone(),
- KEY_METADATA.clone(),
- SPLIT_OFFSETS.clone(),
- EQUALITY_IDS.clone(),
- SORT_ORDER_ID.clone(),
- ]
- }
-
- <span class="kw">pub</span>(<span class="kw">super</span>) <span class="kw">fn </span>data_file_schema_v2(partition_type: <span class="kw-2">&</span>StructType) -> <span class="prelude-ty">Result</span><AvroSchema, Error> {
- <span class="kw">let </span>schema = Schema::builder()
- .with_fields(data_file_fields_v2(partition_type))
- .build()<span class="question-mark">?</span>;
- schema_to_avro_schema(<span class="string">"data_file"</span>, <span class="kw-2">&</span>schema)
- }
-
- <span class="kw">pub</span>(<span class="kw">super</span>) <span class="kw">fn </span>manifest_schema_v2(partition_type: <span class="kw-2">&</span>StructType) -> <span class="prelude-ty">Result</span><AvroSchema, Error> {
- <span class="kw">let </span>fields = <span class="macro">vec!</span>[
- STATUS.clone(),
- SNAPSHOT_ID_V2.clone(),
- SEQUENCE_NUMBER.clone(),
- FILE_SEQUENCE_NUMBER.clone(),
- Arc::new(NestedField::required(
- <span class="number">2</span>,
- <span class="string">"data_file"</span>,
- Type::Struct(StructType::new(data_file_fields_v2(partition_type))),
- )),
- ];
- <span class="kw">let </span>schema = Schema::builder().with_fields(fields).build()<span class="question-mark">?</span>;
- schema_to_avro_schema(<span class="string">"manifest_entry"</span>, <span class="kw-2">&</span>schema)
- }
-
- <span class="kw">fn </span>data_file_fields_v1(partition_type: <span class="kw-2">&</span>StructType) -> Vec<NestedFieldRef> {
- <span class="macro">vec!</span>[
- FILE_PATH.clone(),
- FILE_FORMAT.clone(),
- Arc::new(NestedField::required(
- <span class="number">102</span>,
- <span class="string">"partition"</span>,
- Type::Struct(partition_type.clone()),
- )),
- RECORD_COUNT.clone(),
- FILE_SIZE_IN_BYTES.clone(),
- BLOCK_SIZE_IN_BYTES.clone(),
- COLUMN_SIZES.clone(),
- VALUE_COUNTS.clone(),
- NULL_VALUE_COUNTS.clone(),
- NAN_VALUE_COUNTS.clone(),
- LOWER_BOUNDS.clone(),
- UPPER_BOUNDS.clone(),
- KEY_METADATA.clone(),
- SPLIT_OFFSETS.clone(),
- SORT_ORDER_ID.clone(),
- ]
- }
-
- <span class="kw">pub</span>(<span class="kw">super</span>) <span class="kw">fn </span>data_file_schema_v1(partition_type: <span class="kw-2">&</span>StructType) -> <span class="prelude-ty">Result</span><AvroSchema, Error> {
- <span class="kw">let </span>schema = Schema::builder()
- .with_fields(data_file_fields_v1(partition_type))
- .build()<span class="question-mark">?</span>;
- schema_to_avro_schema(<span class="string">"data_file"</span>, <span class="kw-2">&</span>schema)
- }
-
- <span class="kw">pub</span>(<span class="kw">super</span>) <span class="kw">fn </span>manifest_schema_v1(partition_type: <span class="kw-2">&</span>StructType) -> <span class="prelude-ty">Result</span><AvroSchema, Error> {
- <span class="kw">let </span>fields = <span class="macro">vec!</span>[
- STATUS.clone(),
- SNAPSHOT_ID_V1.clone(),
- Arc::new(NestedField::required(
- <span class="number">2</span>,
- <span class="string">"data_file"</span>,
- Type::Struct(StructType::new(data_file_fields_v1(partition_type))),
- )),
- ];
- <span class="kw">let </span>schema = Schema::builder().with_fields(fields).build()<span class="question-mark">?</span>;
- schema_to_avro_schema(<span class="string">"manifest_entry"</span>, <span class="kw-2">&</span>schema)
- }
-}
-
-<span class="doccomment">/// Meta data of a manifest that is stored in the key-value metadata of the Avro file
-</span><span class="attr">#[derive(Debug, PartialEq, Clone, Eq, TypedBuilder)]
-</span><span class="kw">pub struct </span>ManifestMetadata {
- <span class="doccomment">/// The table schema at the time the manifest
- /// was written
- </span>schema: SchemaRef,
- <span class="doccomment">/// ID of the schema used to write the manifest as a string
- </span>schema_id: SchemaId,
- <span class="doccomment">/// The partition spec used to write the manifest
- </span>partition_spec: PartitionSpec,
- <span class="doccomment">/// Table format version number of the manifest as a string
- </span>format_version: FormatVersion,
- <span class="doccomment">/// Type of content files tracked by the manifest: “data” or “deletes”
- </span>content: ManifestContentType,
-}
-
-<span class="kw">impl </span>ManifestMetadata {
- <span class="doccomment">/// Parse from metadata in avro file.
- </span><span class="kw">pub fn </span>parse(meta: <span class="kw-2">&</span>HashMap<String, Vec<u8>>) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
- <span class="kw">let </span>schema = Arc::new({
- <span class="kw">let </span>bs = meta.get(<span class="string">"schema"</span>).ok_or_else(|| {
- Error::new(
- ErrorKind::DataInvalid,
- <span class="string">"schema is required in manifest metadata but not found"</span>,
- )
- })<span class="question-mark">?</span>;
- serde_json::from_slice::<Schema>(bs).map_err(|err| {
- Error::new(
- ErrorKind::DataInvalid,
- <span class="string">"Fail to parse schema in manifest metadata"</span>,
- )
- .with_source(err)
- })<span class="question-mark">?
- </span>});
- <span class="kw">let </span>schema_id: i32 = meta
- .get(<span class="string">"schema-id"</span>)
- .map(|bs| {
- String::from_utf8_lossy(bs).parse().map_err(|err| {
- Error::new(
- ErrorKind::DataInvalid,
- <span class="string">"Fail to parse schema id in manifest metadata"</span>,
- )
- .with_source(err)
- })
- })
- .transpose()<span class="question-mark">?
- </span>.unwrap_or(<span class="number">0</span>);
- <span class="kw">let </span>partition_spec = {
- <span class="kw">let </span>fields = {
- <span class="kw">let </span>bs = meta.get(<span class="string">"partition-spec"</span>).ok_or_else(|| {
- Error::new(
- ErrorKind::DataInvalid,
- <span class="string">"partition-spec is required in manifest metadata but not found"</span>,
- )
- })<span class="question-mark">?</span>;
- serde_json::from_slice::<Vec<PartitionField>>(bs).map_err(|err| {
- Error::new(
- ErrorKind::DataInvalid,
- <span class="string">"Fail to parse partition spec in manifest metadata"</span>,
- )
- .with_source(err)
- })<span class="question-mark">?
- </span>};
- <span class="kw">let </span>spec_id = meta
- .get(<span class="string">"partition-spec-id"</span>)
- .map(|bs| {
- String::from_utf8_lossy(bs).parse().map_err(|err| {
- Error::new(
- ErrorKind::DataInvalid,
- <span class="string">"Fail to parse partition spec id in manifest metadata"</span>,
- )
- .with_source(err)
- })
- })
- .transpose()<span class="question-mark">?
- </span>.unwrap_or(<span class="number">0</span>);
- PartitionSpec::builder(schema.clone())
- .with_spec_id(spec_id)
- .add_unbound_fields(fields.into_iter().map(|f| f.into_unbound()))<span class="question-mark">?
- </span>.build()<span class="question-mark">?
- </span>};
- <span class="kw">let </span>format_version = <span class="kw">if let </span><span class="prelude-val">Some</span>(bs) = meta.get(<span class="string">"format-version"</span>) {
- serde_json::from_slice::<FormatVersion>(bs).map_err(|err| {
- Error::new(
- ErrorKind::DataInvalid,
- <span class="string">"Fail to parse format version in manifest metadata"</span>,
- )
- .with_source(err)
- })<span class="question-mark">?
- </span>} <span class="kw">else </span>{
- FormatVersion::V1
- };
- <span class="kw">let </span>content = <span class="kw">if let </span><span class="prelude-val">Some</span>(v) = meta.get(<span class="string">"content"</span>) {
- <span class="kw">let </span>v = String::from_utf8_lossy(v);
- v.parse()<span class="question-mark">?
- </span>} <span class="kw">else </span>{
- ManifestContentType::Data
- };
- <span class="prelude-val">Ok</span>(ManifestMetadata {
- schema,
- schema_id,
- partition_spec,
- format_version,
- content,
- })
- }
-
- <span class="doccomment">/// Get the schema of table at the time manifest was written
- </span><span class="kw">pub fn </span>schema(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>SchemaRef {
- <span class="kw-2">&</span><span class="self">self</span>.schema
- }
-
- <span class="doccomment">/// Get the ID of schema used to write the manifest
- </span><span class="kw">pub fn </span>schema_id(<span class="kw-2">&</span><span class="self">self</span>) -> SchemaId {
- <span class="self">self</span>.schema_id
- }
-
- <span class="doccomment">/// Get the partition spec used to write manifest
- </span><span class="kw">pub fn </span>partition_spec(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>PartitionSpec {
- <span class="kw-2">&</span><span class="self">self</span>.partition_spec
- }
-
- <span class="doccomment">/// Get the table format version
- </span><span class="kw">pub fn </span>format_version(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>FormatVersion {
- <span class="kw-2">&</span><span class="self">self</span>.format_version
- }
-
- <span class="doccomment">/// Get the type of content files tracked by manifest
- </span><span class="kw">pub fn </span>content(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>ManifestContentType {
- <span class="kw-2">&</span><span class="self">self</span>.content
- }
-}
-
-<span class="doccomment">/// Reference to [`ManifestEntry`].
-</span><span class="kw">pub type </span>ManifestEntryRef = Arc<ManifestEntry>;
-
-<span class="doccomment">/// A manifest is an immutable Avro file that lists data files or delete
-/// files, along with each file’s partition data tuple, metrics, and tracking
-/// information.
-</span><span class="attr">#[derive(Debug, PartialEq, Eq, Clone, TypedBuilder)]
-</span><span class="kw">pub struct </span>ManifestEntry {
- <span class="doccomment">/// field: 0
- ///
- /// Used to track additions and deletions.
- </span>status: ManifestStatus,
- <span class="doccomment">/// field id: 1
- ///
- /// Snapshot id where the file was added, or deleted if status is 2.
- /// Inherited when null.
- </span><span class="attr">#[builder(default, setter(strip_option(fallback = snapshot_id_opt)))]
- </span>snapshot_id: <span class="prelude-ty">Option</span><i64>,
- <span class="doccomment">/// field id: 3
- ///
- /// Data sequence number of the file.
- /// Inherited when null and status is 1 (added).
- </span><span class="attr">#[builder(default, setter(strip_option(fallback = sequence_number_opt)))]
- </span>sequence_number: <span class="prelude-ty">Option</span><i64>,
- <span class="doccomment">/// field id: 4
- ///
- /// File sequence number indicating when the file was added.
- /// Inherited when null and status is 1 (added).
- </span><span class="attr">#[builder(default, setter(strip_option(fallback = file_sequence_number_opt)))]
- </span>file_sequence_number: <span class="prelude-ty">Option</span><i64>,
- <span class="doccomment">/// field id: 2
- ///
- /// File path, partition tuple, metrics, …
- </span>data_file: DataFile,
-}
-
-<span class="kw">impl </span>ManifestEntry {
- <span class="doccomment">/// Check if this manifest entry is deleted.
- </span><span class="kw">pub fn </span>is_alive(<span class="kw-2">&</span><span class="self">self</span>) -> bool {
- <span class="macro">matches!</span>(
- <span class="self">self</span>.status,
- ManifestStatus::Added | ManifestStatus::Existing
- )
- }
-
- <span class="doccomment">/// Status of this manifest entry
- </span><span class="kw">pub fn </span>status(<span class="kw-2">&</span><span class="self">self</span>) -> ManifestStatus {
- <span class="self">self</span>.status
- }
-
- <span class="doccomment">/// Content type of this manifest entry.
- </span><span class="attr">#[inline]
- </span><span class="kw">pub fn </span>content_type(<span class="kw-2">&</span><span class="self">self</span>) -> DataContentType {
- <span class="self">self</span>.data_file.content
- }
-
- <span class="doccomment">/// File format of this manifest entry.
- </span><span class="attr">#[inline]
- </span><span class="kw">pub fn </span>file_format(<span class="kw-2">&</span><span class="self">self</span>) -> DataFileFormat {
- <span class="self">self</span>.data_file.file_format
- }
-
- <span class="doccomment">/// Data file path of this manifest entry.
- </span><span class="attr">#[inline]
- </span><span class="kw">pub fn </span>file_path(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>str {
- <span class="kw-2">&</span><span class="self">self</span>.data_file.file_path
- }
-
- <span class="doccomment">/// Data file record count of the manifest entry.
- </span><span class="attr">#[inline]
- </span><span class="kw">pub fn </span>record_count(<span class="kw-2">&</span><span class="self">self</span>) -> u64 {
- <span class="self">self</span>.data_file.record_count
- }
-
- <span class="doccomment">/// Inherit data from manifest list, such as snapshot id, sequence number.
- </span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>inherit_data(<span class="kw-2">&mut </span><span class="self">self</span>, snapshot_entry: <span class="kw-2">&</span>ManifestFile) {
- <span class="kw">if </span><span class="self">self</span>.snapshot_id.is_none() {
- <span class="self">self</span>.snapshot_id = <span class="prelude-val">Some</span>(snapshot_entry.added_snapshot_id);
- }
-
- <span class="kw">if </span><span class="self">self</span>.sequence_number.is_none()
- && (<span class="self">self</span>.status == ManifestStatus::Added
- || snapshot_entry.sequence_number == INITIAL_SEQUENCE_NUMBER)
- {
- <span class="self">self</span>.sequence_number = <span class="prelude-val">Some</span>(snapshot_entry.sequence_number);
- }
-
- <span class="kw">if </span><span class="self">self</span>.file_sequence_number.is_none()
- && (<span class="self">self</span>.status == ManifestStatus::Added
- || snapshot_entry.sequence_number == INITIAL_SEQUENCE_NUMBER)
- {
- <span class="self">self</span>.file_sequence_number = <span class="prelude-val">Some</span>(snapshot_entry.sequence_number);
- }
- }
-
- <span class="doccomment">/// Snapshot id
- </span><span class="attr">#[inline]
- </span><span class="kw">pub fn </span>snapshot_id(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="prelude-ty">Option</span><i64> {
- <span class="self">self</span>.snapshot_id
- }
-
- <span class="doccomment">/// Data sequence number.
- </span><span class="attr">#[inline]
- </span><span class="kw">pub fn </span>sequence_number(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="prelude-ty">Option</span><i64> {
- <span class="self">self</span>.sequence_number
- }
-
- <span class="doccomment">/// File size in bytes.
- </span><span class="attr">#[inline]
- </span><span class="kw">pub fn </span>file_size_in_bytes(<span class="kw-2">&</span><span class="self">self</span>) -> u64 {
- <span class="self">self</span>.data_file.file_size_in_bytes
- }
-
- <span class="doccomment">/// get a reference to the actual data file
- </span><span class="attr">#[inline]
- </span><span class="kw">pub fn </span>data_file(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>DataFile {
- <span class="kw-2">&</span><span class="self">self</span>.data_file
- }
-}
-
-<span class="doccomment">/// Used to track additions and deletions in ManifestEntry.
-</span><span class="attr">#[derive(Debug, PartialEq, Eq, Clone, Copy)]
-</span><span class="kw">pub enum </span>ManifestStatus {
- <span class="doccomment">/// Value: 0
- </span>Existing = <span class="number">0</span>,
- <span class="doccomment">/// Value: 1
- </span>Added = <span class="number">1</span>,
- <span class="doccomment">/// Value: 2
- ///
- /// Deletes are informational only and not used in scans.
- </span>Deleted = <span class="number">2</span>,
-}
-
-<span class="kw">impl </span>TryFrom<i32> <span class="kw">for </span>ManifestStatus {
- <span class="kw">type </span>Error = Error;
-
- <span class="kw">fn </span>try_from(v: i32) -> <span class="prelude-ty">Result</span><ManifestStatus> {
- <span class="kw">match </span>v {
- <span class="number">0 </span>=> <span class="prelude-val">Ok</span>(ManifestStatus::Existing),
- <span class="number">1 </span>=> <span class="prelude-val">Ok</span>(ManifestStatus::Added),
- <span class="number">2 </span>=> <span class="prelude-val">Ok</span>(ManifestStatus::Deleted),
- <span class="kw">_ </span>=> <span class="prelude-val">Err</span>(Error::new(
- ErrorKind::DataInvalid,
- <span class="macro">format!</span>(<span class="string">"manifest status {} is invalid"</span>, v),
- )),
- }
- }
-}
-
-<span class="doccomment">/// Data file carries data file path, partition tuple, metrics, …
-</span><span class="attr">#[derive(Debug, PartialEq, Clone, Eq, Builder)]
-</span><span class="kw">pub struct </span>DataFile {
- <span class="doccomment">/// field id: 134
- ///
- /// Type of content stored by the data file: data, equality deletes,
- /// or position deletes (all v1 files are data files)
- </span><span class="kw">pub</span>(<span class="kw">crate</span>) content: DataContentType,
- <span class="doccomment">/// field id: 100
- ///
- /// Full URI for the file with FS scheme
- </span><span class="kw">pub</span>(<span class="kw">crate</span>) file_path: String,
- <span class="doccomment">/// field id: 101
- ///
- /// String file format name, avro, orc or parquet
- </span><span class="kw">pub</span>(<span class="kw">crate</span>) file_format: DataFileFormat,
- <span class="doccomment">/// field id: 102
- ///
- /// Partition data tuple, schema based on the partition spec output using
- /// partition field ids for the struct field ids
- </span><span class="kw">pub</span>(<span class="kw">crate</span>) partition: Struct,
- <span class="doccomment">/// field id: 103
- ///
- /// Number of records in this file
- </span><span class="kw">pub</span>(<span class="kw">crate</span>) record_count: u64,
- <span class="doccomment">/// field id: 104
- ///
- /// Total file size in bytes
- </span><span class="kw">pub</span>(<span class="kw">crate</span>) file_size_in_bytes: u64,
- <span class="doccomment">/// field id: 108
- /// key field id: 117
- /// value field id: 118
- ///
- /// Map from column id to the total size on disk of all regions that
- /// store the column. Does not include bytes necessary to read other
- /// columns, like footers. Leave null for row-oriented formats (Avro)
- </span><span class="attr">#[builder(default)]
- </span><span class="kw">pub</span>(<span class="kw">crate</span>) column_sizes: HashMap<i32, u64>,
- <span class="doccomment">/// field id: 109
- /// key field id: 119
- /// value field id: 120
- ///
- /// Map from column id to number of values in the column (including null
- /// and NaN values)
- </span><span class="attr">#[builder(default)]
- </span><span class="kw">pub</span>(<span class="kw">crate</span>) value_counts: HashMap<i32, u64>,
- <span class="doccomment">/// field id: 110
- /// key field id: 121
- /// value field id: 122
- ///
- /// Map from column id to number of null values in the column
- </span><span class="attr">#[builder(default)]
- </span><span class="kw">pub</span>(<span class="kw">crate</span>) null_value_counts: HashMap<i32, u64>,
- <span class="doccomment">/// field id: 137
- /// key field id: 138
- /// value field id: 139
- ///
- /// Map from column id to number of NaN values in the column
- </span><span class="attr">#[builder(default)]
- </span><span class="kw">pub</span>(<span class="kw">crate</span>) nan_value_counts: HashMap<i32, u64>,
- <span class="doccomment">/// field id: 125
- /// key field id: 126
- /// value field id: 127
- ///
- /// Map from column id to lower bound in the column serialized as binary.
- /// Each value must be less than or equal to all non-null, non-NaN values
- /// in the column for the file.
- ///
- /// Reference:
- ///
- /// - [Binary single-value serialization](https://iceberg.apache.org/spec/#binary-single-value-serialization)
- </span><span class="attr">#[builder(default)]
- </span><span class="kw">pub</span>(<span class="kw">crate</span>) lower_bounds: HashMap<i32, Datum>,
- <span class="doccomment">/// field id: 128
- /// key field id: 129
- /// value field id: 130
- ///
- /// Map from column id to upper bound in the column serialized as binary.
- /// Each value must be greater than or equal to all non-null, non-Nan
- /// values in the column for the file.
- ///
- /// Reference:
- ///
- /// - [Binary single-value serialization](https://iceberg.apache.org/spec/#binary-single-value-serialization)
- </span><span class="attr">#[builder(default)]
- </span><span class="kw">pub</span>(<span class="kw">crate</span>) upper_bounds: HashMap<i32, Datum>,
- <span class="doccomment">/// field id: 131
- ///
- /// Implementation-specific key metadata for encryption
- </span><span class="attr">#[builder(default)]
- </span><span class="kw">pub</span>(<span class="kw">crate</span>) key_metadata: <span class="prelude-ty">Option</span><Vec<u8>>,
- <span class="doccomment">/// field id: 132
- /// element field id: 133
- ///
- /// Split offsets for the data file. For example, all row group offsets
- /// in a Parquet file. Must be sorted ascending
- </span><span class="attr">#[builder(default)]
- </span><span class="kw">pub</span>(<span class="kw">crate</span>) split_offsets: Vec<i64>,
- <span class="doccomment">/// field id: 135
- /// element field id: 136
- ///
- /// Field ids used to determine row equality in equality delete files.
- /// Required when content is EqualityDeletes and should be null
- /// otherwise. Fields with ids listed in this column must be present
- /// in the delete file
- </span><span class="attr">#[builder(default)]
- </span><span class="kw">pub</span>(<span class="kw">crate</span>) equality_ids: Vec<i32>,
- <span class="doccomment">/// field id: 140
- ///
- /// ID representing sort order for this file.
- ///
- /// If sort order ID is missing or unknown, then the order is assumed to
- /// be unsorted. Only data files and equality delete files should be
- /// written with a non-null order id. Position deletes are required to be
- /// sorted by file and position, not a table order, and should set sort
- /// order id to null. Readers must ignore sort order id for position
- /// delete files.
- </span><span class="attr">#[builder(default, setter(strip_option))]
- </span><span class="kw">pub</span>(<span class="kw">crate</span>) sort_order_id: <span class="prelude-ty">Option</span><i32>,
- <span class="doccomment">/// This field is not included in spec. It is just store in memory representation used
- /// in process.
- </span><span class="kw">pub</span>(<span class="kw">crate</span>) partition_spec_id: i32,
-}
-
-<span class="kw">impl </span>DataFile {
- <span class="doccomment">/// Get the content type of the data file (data, equality deletes, or position deletes)
- </span><span class="kw">pub fn </span>content_type(<span class="kw-2">&</span><span class="self">self</span>) -> DataContentType {
- <span class="self">self</span>.content
- }
- <span class="doccomment">/// Get the file path as full URI with FS scheme
- </span><span class="kw">pub fn </span>file_path(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>str {
- <span class="kw-2">&</span><span class="self">self</span>.file_path
- }
- <span class="doccomment">/// Get the file format of the file (avro, orc or parquet).
- </span><span class="kw">pub fn </span>file_format(<span class="kw-2">&</span><span class="self">self</span>) -> DataFileFormat {
- <span class="self">self</span>.file_format
- }
- <span class="doccomment">/// Get the partition values of the file.
- </span><span class="kw">pub fn </span>partition(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>Struct {
- <span class="kw-2">&</span><span class="self">self</span>.partition
- }
- <span class="doccomment">/// Get the record count in the data file.
- </span><span class="kw">pub fn </span>record_count(<span class="kw-2">&</span><span class="self">self</span>) -> u64 {
- <span class="self">self</span>.record_count
- }
- <span class="doccomment">/// Get the file size in bytes.
- </span><span class="kw">pub fn </span>file_size_in_bytes(<span class="kw-2">&</span><span class="self">self</span>) -> u64 {
- <span class="self">self</span>.file_size_in_bytes
- }
- <span class="doccomment">/// Get the column sizes.
- /// Map from column id to the total size on disk of all regions that
- /// store the column. Does not include bytes necessary to read other
- /// columns, like footers. Null for row-oriented formats (Avro)
- </span><span class="kw">pub fn </span>column_sizes(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>HashMap<i32, u64> {
- <span class="kw-2">&</span><span class="self">self</span>.column_sizes
- }
- <span class="doccomment">/// Get the columns value counts for the data file.
- /// Map from column id to number of values in the column (including null
- /// and NaN values)
- </span><span class="kw">pub fn </span>value_counts(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>HashMap<i32, u64> {
- <span class="kw-2">&</span><span class="self">self</span>.value_counts
- }
- <span class="doccomment">/// Get the null value counts of the data file.
- /// Map from column id to number of null values in the column
- </span><span class="kw">pub fn </span>null_value_counts(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>HashMap<i32, u64> {
- <span class="kw-2">&</span><span class="self">self</span>.null_value_counts
- }
- <span class="doccomment">/// Get the nan value counts of the data file.
- /// Map from column id to number of NaN values in the column
- </span><span class="kw">pub fn </span>nan_value_counts(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>HashMap<i32, u64> {
- <span class="kw-2">&</span><span class="self">self</span>.nan_value_counts
- }
- <span class="doccomment">/// Get the lower bounds of the data file values per column.
- /// Map from column id to lower bound in the column serialized as binary.
- </span><span class="kw">pub fn </span>lower_bounds(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>HashMap<i32, Datum> {
- <span class="kw-2">&</span><span class="self">self</span>.lower_bounds
- }
- <span class="doccomment">/// Get the upper bounds of the data file values per column.
- /// Map from column id to upper bound in the column serialized as binary.
- </span><span class="kw">pub fn </span>upper_bounds(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>HashMap<i32, Datum> {
- <span class="kw-2">&</span><span class="self">self</span>.upper_bounds
- }
- <span class="doccomment">/// Get the Implementation-specific key metadata for the data file.
- </span><span class="kw">pub fn </span>key_metadata(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="prelude-ty">Option</span><<span class="kw-2">&</span>[u8]> {
- <span class="self">self</span>.key_metadata.as_deref()
- }
- <span class="doccomment">/// Get the split offsets of the data file.
- /// For example, all row group offsets in a Parquet file.
- </span><span class="kw">pub fn </span>split_offsets(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>[i64] {
- <span class="kw-2">&</span><span class="self">self</span>.split_offsets
- }
- <span class="doccomment">/// Get the equality ids of the data file.
- /// Field ids used to determine row equality in equality delete files.
- /// null when content is not EqualityDeletes.
- </span><span class="kw">pub fn </span>equality_ids(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>[i32] {
- <span class="kw-2">&</span><span class="self">self</span>.equality_ids
- }
- <span class="doccomment">/// Get the sort order id of the data file.
- /// Only data files and equality delete files should be
- /// written with a non-null order id. Position deletes are required to be
- /// sorted by file and position, not a table order, and should set sort
- /// order id to null. Readers must ignore sort order id for position
- /// delete files.
- </span><span class="kw">pub fn </span>sort_order_id(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="prelude-ty">Option</span><i32> {
- <span class="self">self</span>.sort_order_id
- }
-}
-
-<span class="doccomment">/// Convert data files to avro bytes and write to writer.
-/// Return the bytes written.
-</span><span class="kw">pub fn </span>write_data_files_to_avro<W: Write>(
- writer: <span class="kw-2">&mut </span>W,
- data_files: <span class="kw">impl </span>IntoIterator<Item = DataFile>,
- partition_type: <span class="kw-2">&</span>StructType,
- version: FormatVersion,
-) -> <span class="prelude-ty">Result</span><usize> {
- <span class="kw">let </span>avro_schema = <span class="kw">match </span>version {
- FormatVersion::V1 => _const_schema::data_file_schema_v1(partition_type).unwrap(),
- FormatVersion::V2 => _const_schema::data_file_schema_v2(partition_type).unwrap(),
- };
- <span class="kw">let </span><span class="kw-2">mut </span>writer = AvroWriter::new(<span class="kw-2">&</span>avro_schema, writer);
-
- <span class="kw">for </span>data_file <span class="kw">in </span>data_files {
- <span class="kw">let </span>value = to_value(_serde::DataFile::try_from(data_file, partition_type, <span class="bool-val">true</span>)<span class="question-mark">?</span>)<span class="question-mark">?
- </span>.resolve(<span class="kw-2">&</span>avro_schema)<span class="question-mark">?</span>;
- writer.append(value)<span class="question-mark">?</span>;
- }
-
- <span class="prelude-val">Ok</span>(writer.flush()<span class="question-mark">?</span>)
-}
-
-<span class="doccomment">/// Parse data files from avro bytes.
-</span><span class="kw">pub fn </span>read_data_files_from_avro<R: Read>(
- reader: <span class="kw-2">&mut </span>R,
- schema: <span class="kw-2">&</span>Schema,
- partition_spec_id: i32,
- partition_type: <span class="kw-2">&</span>StructType,
- version: FormatVersion,
-) -> <span class="prelude-ty">Result</span><Vec<DataFile>> {
- <span class="kw">let </span>avro_schema = <span class="kw">match </span>version {
- FormatVersion::V1 => _const_schema::data_file_schema_v1(partition_type).unwrap(),
- FormatVersion::V2 => _const_schema::data_file_schema_v2(partition_type).unwrap(),
- };
-
- <span class="kw">let </span>reader = AvroReader::with_schema(<span class="kw-2">&</span>avro_schema, reader)<span class="question-mark">?</span>;
- reader
- .into_iter()
- .map(|value| {
- from_value::<_serde::DataFile>(<span class="kw-2">&</span>value<span class="question-mark">?</span>)<span class="question-mark">?</span>.try_into(
- partition_spec_id,
- partition_type,
- schema,
- )
- })
- .collect::<<span class="prelude-ty">Result</span><Vec<<span class="kw">_</span>>>>()
-}
-
-<span class="doccomment">/// Type of content stored by the data file: data, equality deletes, or
-/// position deletes (all v1 files are data files)
-</span><span class="attr">#[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize, Deserialize)]
-</span><span class="kw">pub enum </span>DataContentType {
- <span class="doccomment">/// value: 0
- </span>Data = <span class="number">0</span>,
- <span class="doccomment">/// value: 1
- </span>PositionDeletes = <span class="number">1</span>,
- <span class="doccomment">/// value: 2
- </span>EqualityDeletes = <span class="number">2</span>,
-}
-
-<span class="kw">impl </span>TryFrom<i32> <span class="kw">for </span>DataContentType {
- <span class="kw">type </span>Error = Error;
-
- <span class="kw">fn </span>try_from(v: i32) -> <span class="prelude-ty">Result</span><DataContentType> {
- <span class="kw">match </span>v {
- <span class="number">0 </span>=> <span class="prelude-val">Ok</span>(DataContentType::Data),
- <span class="number">1 </span>=> <span class="prelude-val">Ok</span>(DataContentType::PositionDeletes),
- <span class="number">2 </span>=> <span class="prelude-val">Ok</span>(DataContentType::EqualityDeletes),
- <span class="kw">_ </span>=> <span class="prelude-val">Err</span>(Error::new(
- ErrorKind::DataInvalid,
- <span class="macro">format!</span>(<span class="string">"data content type {} is invalid"</span>, v),
- )),
- }
- }
-}
-
-<span class="doccomment">/// Format of this data.
-</span><span class="attr">#[derive(Debug, PartialEq, Eq, Clone, Copy, SerializeDisplay, DeserializeFromStr)]
-</span><span class="kw">pub enum </span>DataFileFormat {
- <span class="doccomment">/// Avro file format: <https://avro.apache.org/>
- </span>Avro,
- <span class="doccomment">/// Orc file format: <https://orc.apache.org/>
- </span>Orc,
- <span class="doccomment">/// Parquet file format: <https://parquet.apache.org/>
- </span>Parquet,
-}
-
-<span class="kw">impl </span>FromStr <span class="kw">for </span>DataFileFormat {
- <span class="kw">type </span><span class="prelude-val">Err </span>= Error;
-
- <span class="kw">fn </span>from_str(s: <span class="kw-2">&</span>str) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
- <span class="kw">match </span>s.to_lowercase().as_str() {
- <span class="string">"avro" </span>=> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::Avro),
- <span class="string">"orc" </span>=> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::Orc),
- <span class="string">"parquet" </span>=> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::Parquet),
- <span class="kw">_ </span>=> <span class="prelude-val">Err</span>(Error::new(
- ErrorKind::DataInvalid,
- <span class="macro">format!</span>(<span class="string">"Unsupported data file format: {}"</span>, s),
- )),
- }
- }
-}
-
-<span class="kw">impl </span>std::fmt::Display <span class="kw">for </span>DataFileFormat {
- <span class="kw">fn </span>fmt(<span class="kw-2">&</span><span class="self">self</span>, f: <span class="kw-2">&mut </span>std::fmt::Formatter<<span class="lifetime">'_</span>>) -> std::fmt::Result {
- <span class="kw">match </span><span class="self">self </span>{
- DataFileFormat::Avro => <span class="macro">write!</span>(f, <span class="string">"avro"</span>),
- DataFileFormat::Orc => <span class="macro">write!</span>(f, <span class="string">"orc"</span>),
- DataFileFormat::Parquet => <span class="macro">write!</span>(f, <span class="string">"parquet"</span>),
- }
- }
-}
-
-<span class="kw">mod </span>_serde {
- <span class="kw">use </span>std::collections::HashMap;
-
- <span class="kw">use </span>serde_derive::{Deserialize, Serialize};
- <span class="kw">use </span>serde_with::serde_as;
-
- <span class="kw">use </span><span class="kw">super</span>::ManifestEntry;
- <span class="kw">use </span><span class="kw">crate</span>::spec::{Datum, Literal, RawLiteral, Schema, Struct, StructType, Type};
- <span class="kw">use crate</span>::{Error, ErrorKind};
-
- <span class="attr">#[derive(Serialize, Deserialize)]
- </span><span class="kw">pub</span>(<span class="kw">super</span>) <span class="kw">struct </span>ManifestEntryV2 {
- status: i32,
- snapshot_id: <span class="prelude-ty">Option</span><i64>,
- sequence_number: <span class="prelude-ty">Option</span><i64>,
- file_sequence_number: <span class="prelude-ty">Option</span><i64>,
- data_file: DataFile,
- }
-
- <span class="kw">impl </span>ManifestEntryV2 {
- <span class="kw">pub fn </span>try_from(value: ManifestEntry, partition_type: <span class="kw-2">&</span>StructType) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>, Error> {
- <span class="prelude-val">Ok</span>(<span class="self">Self </span>{
- status: value.status <span class="kw">as </span>i32,
- snapshot_id: value.snapshot_id,
- sequence_number: value.sequence_number,
- file_sequence_number: value.file_sequence_number,
- data_file: DataFile::try_from(value.data_file, partition_type, <span class="bool-val">false</span>)<span class="question-mark">?</span>,
- })
- }
-
- <span class="kw">pub fn </span>try_into(
- <span class="self">self</span>,
- partition_spec_id: i32,
- partition_type: <span class="kw-2">&</span>StructType,
- schema: <span class="kw-2">&</span>Schema,
- ) -> <span class="prelude-ty">Result</span><ManifestEntry, Error> {
- <span class="prelude-val">Ok</span>(ManifestEntry {
- status: <span class="self">self</span>.status.try_into()<span class="question-mark">?</span>,
- snapshot_id: <span class="self">self</span>.snapshot_id,
- sequence_number: <span class="self">self</span>.sequence_number,
- file_sequence_number: <span class="self">self</span>.file_sequence_number,
- data_file: <span class="self">self
- </span>.data_file
- .try_into(partition_spec_id, partition_type, schema)<span class="question-mark">?</span>,
- })
- }
- }
-
- <span class="attr">#[derive(Serialize, Deserialize)]
- </span><span class="kw">pub</span>(<span class="kw">super</span>) <span class="kw">struct </span>ManifestEntryV1 {
- status: i32,
- <span class="kw">pub </span>snapshot_id: i64,
- data_file: DataFile,
- }
-
- <span class="kw">impl </span>ManifestEntryV1 {
- <span class="kw">pub fn </span>try_from(value: ManifestEntry, partition_type: <span class="kw-2">&</span>StructType) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>, Error> {
- <span class="prelude-val">Ok</span>(<span class="self">Self </span>{
- status: value.status <span class="kw">as </span>i32,
- snapshot_id: value.snapshot_id.unwrap_or_default(),
- data_file: DataFile::try_from(value.data_file, partition_type, <span class="bool-val">true</span>)<span class="question-mark">?</span>,
- })
- }
-
- <span class="kw">pub fn </span>try_into(
- <span class="self">self</span>,
- partition_spec_id: i32,
- partition_type: <span class="kw-2">&</span>StructType,
- schema: <span class="kw-2">&</span>Schema,
- ) -> <span class="prelude-ty">Result</span><ManifestEntry, Error> {
- <span class="prelude-val">Ok</span>(ManifestEntry {
- status: <span class="self">self</span>.status.try_into()<span class="question-mark">?</span>,
- snapshot_id: <span class="prelude-val">Some</span>(<span class="self">self</span>.snapshot_id),
- sequence_number: <span class="prelude-val">Some</span>(<span class="number">0</span>),
- file_sequence_number: <span class="prelude-val">Some</span>(<span class="number">0</span>),
- data_file: <span class="self">self
- </span>.data_file
- .try_into(partition_spec_id, partition_type, schema)<span class="question-mark">?</span>,
- })
- }
- }
-
- <span class="attr">#[serde_as]
- #[derive(Serialize, Deserialize)]
- </span><span class="kw">pub</span>(<span class="kw">super</span>) <span class="kw">struct </span>DataFile {
- <span class="attr">#[serde(default)]
- </span>content: i32,
- file_path: String,
- file_format: String,
- partition: RawLiteral,
- record_count: i64,
- file_size_in_bytes: i64,
- <span class="attr">#[serde(skip_deserializing, skip_serializing_if = <span class="string">"Option::is_none"</span>)]
- </span>block_size_in_bytes: <span class="prelude-ty">Option</span><i64>,
- column_sizes: <span class="prelude-ty">Option</span><Vec<I64Entry>>,
- value_counts: <span class="prelude-ty">Option</span><Vec<I64Entry>>,
- null_value_counts: <span class="prelude-ty">Option</span><Vec<I64Entry>>,
- nan_value_counts: <span class="prelude-ty">Option</span><Vec<I64Entry>>,
- lower_bounds: <span class="prelude-ty">Option</span><Vec<BytesEntry>>,
- upper_bounds: <span class="prelude-ty">Option</span><Vec<BytesEntry>>,
- key_metadata: <span class="prelude-ty">Option</span><serde_bytes::ByteBuf>,
- split_offsets: <span class="prelude-ty">Option</span><Vec<i64>>,
- <span class="attr">#[serde(default)]
- </span>equality_ids: <span class="prelude-ty">Option</span><Vec<i32>>,
- sort_order_id: <span class="prelude-ty">Option</span><i32>,
- }
-
- <span class="kw">impl </span>DataFile {
- <span class="kw">pub fn </span>try_from(
- value: <span class="kw">super</span>::DataFile,
- partition_type: <span class="kw-2">&</span>StructType,
- is_version_1: bool,
- ) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>, Error> {
- <span class="kw">let </span>block_size_in_bytes = <span class="kw">if </span>is_version_1 { <span class="prelude-val">Some</span>(<span class="number">0</span>) } <span class="kw">else </span>{ <span class="prelude-val">None </span>};
- <span class="prelude-val">Ok</span>(<span class="self">Self </span>{
- content: value.content <span class="kw">as </span>i32,
- file_path: value.file_path,
- file_format: value.file_format.to_string().to_ascii_uppercase(),
- partition: RawLiteral::try_from(
- Literal::Struct(value.partition),
- <span class="kw-2">&</span>Type::Struct(partition_type.clone()),
- )<span class="question-mark">?</span>,
- record_count: value.record_count.try_into()<span class="question-mark">?</span>,
- file_size_in_bytes: value.file_size_in_bytes.try_into()<span class="question-mark">?</span>,
- block_size_in_bytes,
- column_sizes: <span class="prelude-val">Some</span>(to_i64_entry(value.column_sizes)<span class="question-mark">?</span>),
- value_counts: <span class="prelude-val">Some</span>(to_i64_entry(value.value_counts)<span class="question-mark">?</span>),
- null_value_counts: <span class="prelude-val">Some</span>(to_i64_entry(value.null_value_counts)<span class="question-mark">?</span>),
- nan_value_counts: <span class="prelude-val">Some</span>(to_i64_entry(value.nan_value_counts)<span class="question-mark">?</span>),
- lower_bounds: <span class="prelude-val">Some</span>(to_bytes_entry(value.lower_bounds)<span class="question-mark">?</span>),
- upper_bounds: <span class="prelude-val">Some</span>(to_bytes_entry(value.upper_bounds)<span class="question-mark">?</span>),
- key_metadata: value.key_metadata.map(serde_bytes::ByteBuf::from),
- split_offsets: <span class="prelude-val">Some</span>(value.split_offsets),
- equality_ids: <span class="prelude-val">Some</span>(value.equality_ids),
- sort_order_id: value.sort_order_id,
- })
- }
-
- <span class="kw">pub fn </span>try_into(
- <span class="self">self</span>,
- partition_spec_id: i32,
- partition_type: <span class="kw-2">&</span>StructType,
- schema: <span class="kw-2">&</span>Schema,
- ) -> <span class="prelude-ty">Result</span><<span class="kw">super</span>::DataFile, Error> {
- <span class="kw">let </span>partition = <span class="self">self
- </span>.partition
- .try_into(<span class="kw-2">&</span>Type::Struct(partition_type.clone()))<span class="question-mark">?
- </span>.map(|v| {
- <span class="kw">if let </span>Literal::Struct(v) = v {
- <span class="prelude-val">Ok</span>(v)
- } <span class="kw">else </span>{
- <span class="prelude-val">Err</span>(Error::new(
- ErrorKind::DataInvalid,
- <span class="string">"partition value is not a struct"</span>,
- ))
- }
- })
- .transpose()<span class="question-mark">?
- </span>.unwrap_or(Struct::empty());
- <span class="prelude-val">Ok</span>(<span class="kw">super</span>::DataFile {
- content: <span class="self">self</span>.content.try_into()<span class="question-mark">?</span>,
- file_path: <span class="self">self</span>.file_path,
- file_format: <span class="self">self</span>.file_format.parse()<span class="question-mark">?</span>,
- partition,
- record_count: <span class="self">self</span>.record_count.try_into()<span class="question-mark">?</span>,
- file_size_in_bytes: <span class="self">self</span>.file_size_in_bytes.try_into()<span class="question-mark">?</span>,
- column_sizes: <span class="self">self
- </span>.column_sizes
- .map(parse_i64_entry)
- .transpose()<span class="question-mark">?
- </span>.unwrap_or_default(),
- value_counts: <span class="self">self
- </span>.value_counts
- .map(parse_i64_entry)
- .transpose()<span class="question-mark">?
- </span>.unwrap_or_default(),
- null_value_counts: <span class="self">self
- </span>.null_value_counts
- .map(parse_i64_entry)
- .transpose()<span class="question-mark">?
- </span>.unwrap_or_default(),
- nan_value_counts: <span class="self">self
- </span>.nan_value_counts
- .map(parse_i64_entry)
- .transpose()<span class="question-mark">?
- </span>.unwrap_or_default(),
- lower_bounds: <span class="self">self
- </span>.lower_bounds
- .map(|v| parse_bytes_entry(v, schema))
- .transpose()<span class="question-mark">?
- </span>.unwrap_or_default(),
- upper_bounds: <span class="self">self
- </span>.upper_bounds
- .map(|v| parse_bytes_entry(v, schema))
- .transpose()<span class="question-mark">?
- </span>.unwrap_or_default(),
- key_metadata: <span class="self">self</span>.key_metadata.map(|v| v.to_vec()),
- split_offsets: <span class="self">self</span>.split_offsets.unwrap_or_default(),
- equality_ids: <span class="self">self</span>.equality_ids.unwrap_or_default(),
- sort_order_id: <span class="self">self</span>.sort_order_id,
- partition_spec_id,
- })
- }
- }
-
- <span class="attr">#[serde_as]
- #[derive(Serialize, Deserialize)]
- #[cfg_attr(test, derive(Debug, PartialEq, Eq))]
- </span><span class="kw">struct </span>BytesEntry {
- key: i32,
- value: serde_bytes::ByteBuf,
- }
-
- <span class="kw">fn </span>parse_bytes_entry(
- v: Vec<BytesEntry>,
- schema: <span class="kw-2">&</span>Schema,
- ) -> <span class="prelude-ty">Result</span><HashMap<i32, Datum>, Error> {
- <span class="kw">let </span><span class="kw-2">mut </span>m = HashMap::with_capacity(v.len());
- <span class="kw">for </span>entry <span class="kw">in </span>v {
- <span class="comment">// We ignore the entry if the field is not found in the schema, due to schema evolution.
- </span><span class="kw">if let </span><span class="prelude-val">Some</span>(field) = schema.field_by_id(entry.key) {
- <span class="kw">let </span>data_type = field
- .field_type
- .as_primitive_type()
- .ok_or_else(|| {
- Error::new(
- ErrorKind::DataInvalid,
- <span class="macro">format!</span>(<span class="string">"field {} is not a primitive type"</span>, field.name),
- )
- })<span class="question-mark">?
- </span>.clone();
- m.insert(entry.key, Datum::try_from_bytes(<span class="kw-2">&</span>entry.value, data_type)<span class="question-mark">?</span>);
- }
- }
- <span class="prelude-val">Ok</span>(m)
- }
-
- <span class="kw">fn </span>to_bytes_entry(v: <span class="kw">impl </span>IntoIterator<Item = (i32, Datum)>) -> <span class="prelude-ty">Result</span><Vec<BytesEntry>, Error> {
- <span class="kw">let </span>iter = v.into_iter();
- <span class="comment">// Reserve the capacity to the lower bound.
- </span><span class="kw">let </span><span class="kw-2">mut </span>bs = Vec::with_capacity(iter.size_hint().<span class="number">0</span>);
- <span class="kw">for </span>(k, d) <span class="kw">in </span>iter {
- bs.push(BytesEntry {
- key: k,
- value: d.to_bytes()<span class="question-mark">?</span>,
- });
- }
- <span class="prelude-val">Ok</span>(bs)
- }
-
- <span class="attr">#[derive(Serialize, Deserialize)]
- #[cfg_attr(test, derive(Debug, PartialEq, Eq))]
- </span><span class="kw">struct </span>I64Entry {
- key: i32,
- value: i64,
- }
-
- <span class="kw">fn </span>parse_i64_entry(v: Vec<I64Entry>) -> <span class="prelude-ty">Result</span><HashMap<i32, u64>, Error> {
- <span class="kw">let </span><span class="kw-2">mut </span>m = HashMap::with_capacity(v.len());
- <span class="kw">for </span>entry <span class="kw">in </span>v {
- <span class="comment">// We ignore the entry if it's value is negative since these entries are supposed to be used for
- // counting, which should never be negative.
- </span><span class="kw">if let </span><span class="prelude-val">Ok</span>(v) = entry.value.try_into() {
- m.insert(entry.key, v);
- }
- }
- <span class="prelude-val">Ok</span>(m)
- }
-
- <span class="kw">fn </span>to_i64_entry(entries: HashMap<i32, u64>) -> <span class="prelude-ty">Result</span><Vec<I64Entry>, Error> {
- entries
- .iter()
- .map(|e| {
- <span class="prelude-val">Ok</span>(I64Entry {
- key: <span class="kw-2">*</span>e.<span class="number">0</span>,
- value: (<span class="kw-2">*</span>e.<span class="number">1</span>).try_into()<span class="question-mark">?</span>,
- })
- })
- .collect()
- }
-
- <span class="attr">#[cfg(test)]
- </span><span class="kw">mod </span>tests {
- <span class="kw">use </span>std::collections::HashMap;
-
- <span class="kw">use </span><span class="kw">crate</span>::spec::manifest::_serde::{parse_i64_entry, I64Entry};
-
- <span class="attr">#[test]
- </span><span class="kw">fn </span>test_parse_negative_manifest_entry() {
- <span class="kw">let </span>entries = <span class="macro">vec!</span>[I64Entry { key: <span class="number">1</span>, value: -<span class="number">1 </span>}, I64Entry {
- key: <span class="number">2</span>,
- value: <span class="number">3</span>,
- }];
-
- <span class="kw">let </span>ret = parse_i64_entry(entries).unwrap();
-
- <span class="kw">let </span>expected_ret = HashMap::from([(<span class="number">2</span>, <span class="number">3</span>)]);
- <span class="macro">assert_eq!</span>(ret, expected_ret, <span class="string">"Negative i64 entry should be ignored!"</span>);
- }
- }
-}
-
-<span class="attr">#[cfg(test)]
-</span><span class="kw">mod </span>tests {
- <span class="kw">use </span>std::fs;
- <span class="kw">use </span>std::io::Cursor;
- <span class="kw">use </span>std::sync::Arc;
-
- <span class="kw">use </span>tempfile::TempDir;
-
- <span class="kw">use super</span>::<span class="kw-2">*</span>;
- <span class="kw">use </span><span class="kw">crate</span>::io::FileIOBuilder;
- <span class="kw">use </span><span class="kw">crate</span>::spec::{Literal, NestedField, PrimitiveType, Struct, Transform, Type};
-
- <span class="attr">#[tokio::test]
- </span><span class="kw">async fn </span>test_parse_manifest_v2_unpartition() {
- <span class="kw">let </span>schema = Arc::new(
- Schema::builder()
- .with_fields(<span class="macro">vec!</span>[
- <span class="comment">// id v_int v_long v_float v_double v_varchar v_bool v_date v_timestamp v_decimal v_ts_ntz
- </span>Arc::new(NestedField::optional(
- <span class="number">1</span>,
- <span class="string">"id"</span>,
- Type::Primitive(PrimitiveType::Long),
- )),
- Arc::new(NestedField::optional(
- <span class="number">2</span>,
- <span class="string">"v_int"</span>,
- Type::Primitive(PrimitiveType::Int),
- )),
- Arc::new(NestedField::optional(
- <span class="number">3</span>,
- <span class="string">"v_long"</span>,
- Type::Primitive(PrimitiveType::Long),
- )),
- Arc::new(NestedField::optional(
- <span class="number">4</span>,
- <span class="string">"v_float"</span>,
- Type::Primitive(PrimitiveType::Float),
- )),
- Arc::new(NestedField::optional(
- <span class="number">5</span>,
- <span class="string">"v_double"</span>,
- Type::Primitive(PrimitiveType::Double),
- )),
- Arc::new(NestedField::optional(
- <span class="number">6</span>,
- <span class="string">"v_varchar"</span>,
- Type::Primitive(PrimitiveType::String),
- )),
- Arc::new(NestedField::optional(
- <span class="number">7</span>,
- <span class="string">"v_bool"</span>,
- Type::Primitive(PrimitiveType::Boolean),
- )),
- Arc::new(NestedField::optional(
- <span class="number">8</span>,
- <span class="string">"v_date"</span>,
- Type::Primitive(PrimitiveType::Date),
- )),
- Arc::new(NestedField::optional(
- <span class="number">9</span>,
- <span class="string">"v_timestamp"</span>,
- Type::Primitive(PrimitiveType::Timestamptz),
- )),
- Arc::new(NestedField::optional(
- <span class="number">10</span>,
- <span class="string">"v_decimal"</span>,
- Type::Primitive(PrimitiveType::Decimal {
- precision: <span class="number">36</span>,
- scale: <span class="number">10</span>,
- }),
- )),
- Arc::new(NestedField::optional(
- <span class="number">11</span>,
- <span class="string">"v_ts_ntz"</span>,
- Type::Primitive(PrimitiveType::Timestamp),
- )),
- Arc::new(NestedField::optional(
- <span class="number">12</span>,
- <span class="string">"v_ts_ns_ntz"</span>,
- Type::Primitive(PrimitiveType::TimestampNs),
- )),
- ])
- .build()
- .unwrap(),
- );
- <span class="kw">let </span>metadata = ManifestMetadata {
- schema_id: <span class="number">0</span>,
- schema: schema.clone(),
- partition_spec: PartitionSpec::builder(schema)
- .with_spec_id(<span class="number">0</span>)
- .build()
- .unwrap(),
- content: ManifestContentType::Data,
- format_version: FormatVersion::V2,
- };
- <span class="kw">let </span><span class="kw-2">mut </span>entries = <span class="macro">vec!</span>[
- ManifestEntry {
- status: ManifestStatus::Added,
- snapshot_id: <span class="prelude-val">None</span>,
- sequence_number: <span class="prelude-val">None</span>,
- file_sequence_number: <span class="prelude-val">None</span>,
- data_file: DataFile {content:DataContentType::Data,file_path:<span class="string">"s3a://icebergdata/demo/s1/t1/data/00000-0-ba56fbfa-f2ff-40c9-bb27-565ad6dc2be8-00000.parquet"</span>.to_string(),file_format:DataFileFormat::Parquet,partition:Struct::empty(),record_count:<span class="number">1</span>,file_size_in_bytes:<span class="number">5442</span>,column_sizes:HashMap::from([(<span class="number">0</span>,<span class="number">73</span>),(<span class="number">6</spa [...]
- }
- ];
-
- <span class="comment">// write manifest to file
- </span><span class="kw">let </span>tmp_dir = TempDir::new().unwrap();
- <span class="kw">let </span>path = tmp_dir.path().join(<span class="string">"test_manifest.avro"</span>);
- <span class="kw">let </span>io = FileIOBuilder::new_fs_io().build().unwrap();
- <span class="kw">let </span>output_file = io.new_output(path.to_str().unwrap()).unwrap();
- <span class="kw">let </span><span class="kw-2">mut </span>writer = ManifestWriterBuilder::new(
- output_file,
- <span class="prelude-val">Some</span>(<span class="number">1</span>),
- <span class="macro">vec!</span>[],
- metadata.schema.clone(),
- metadata.partition_spec.clone(),
- )
- .build_v2_data();
- <span class="kw">for </span>entry <span class="kw">in </span><span class="kw-2">&</span>entries {
- writer.add_entry(entry.clone()).unwrap();
- }
- writer.write_manifest_file().<span class="kw">await</span>.unwrap();
-
- <span class="comment">// read back the manifest file and check the content
- </span><span class="kw">let </span>actual_manifest =
- Manifest::parse_avro(fs::read(path).expect(<span class="string">"read_file must succeed"</span>).as_slice())
- .unwrap();
- <span class="comment">// The snapshot id is assigned when the entry is added to the manifest.
- </span>entries[<span class="number">0</span>].snapshot_id = <span class="prelude-val">Some</span>(<span class="number">1</span>);
- <span class="macro">assert_eq!</span>(actual_manifest, Manifest::new(metadata, entries));
- }
-
- <span class="attr">#[tokio::test]
- </span><span class="kw">async fn </span>test_parse_manifest_v2_partition() {
- <span class="kw">let </span>schema = Arc::new(
- Schema::builder()
- .with_fields(<span class="macro">vec!</span>[
- Arc::new(NestedField::optional(
- <span class="number">1</span>,
- <span class="string">"id"</span>,
- Type::Primitive(PrimitiveType::Long),
- )),
- Arc::new(NestedField::optional(
- <span class="number">2</span>,
- <span class="string">"v_int"</span>,
- Type::Primitive(PrimitiveType::Int),
- )),
- Arc::new(NestedField::optional(
- <span class="number">3</span>,
- <span class="string">"v_long"</span>,
- Type::Primitive(PrimitiveType::Long),
- )),
- Arc::new(NestedField::optional(
- <span class="number">4</span>,
- <span class="string">"v_float"</span>,
- Type::Primitive(PrimitiveType::Float),
- )),
- Arc::new(NestedField::optional(
- <span class="number">5</span>,
- <span class="string">"v_double"</span>,
- Type::Primitive(PrimitiveType::Double),
- )),
- Arc::new(NestedField::optional(
- <span class="number">6</span>,
- <span class="string">"v_varchar"</span>,
- Type::Primitive(PrimitiveType::String),
- )),
- Arc::new(NestedField::optional(
- <span class="number">7</span>,
- <span class="string">"v_bool"</span>,
- Type::Primitive(PrimitiveType::Boolean),
- )),
- Arc::new(NestedField::optional(
- <span class="number">8</span>,
- <span class="string">"v_date"</span>,
- Type::Primitive(PrimitiveType::Date),
- )),
- Arc::new(NestedField::optional(
- <span class="number">9</span>,
- <span class="string">"v_timestamp"</span>,
- Type::Primitive(PrimitiveType::Timestamptz),
- )),
- Arc::new(NestedField::optional(
- <span class="number">10</span>,
- <span class="string">"v_decimal"</span>,
- Type::Primitive(PrimitiveType::Decimal {
- precision: <span class="number">36</span>,
- scale: <span class="number">10</span>,
- }),
- )),
- Arc::new(NestedField::optional(
- <span class="number">11</span>,
- <span class="string">"v_ts_ntz"</span>,
- Type::Primitive(PrimitiveType::Timestamp),
- )),
- Arc::new(NestedField::optional(
- <span class="number">12</span>,
- <span class="string">"v_ts_ns_ntz"</span>,
- Type::Primitive(PrimitiveType::TimestampNs),
- )),
- ])
- .build()
- .unwrap(),
- );
- <span class="kw">let </span>metadata = ManifestMetadata {
- schema_id: <span class="number">0</span>,
- schema: schema.clone(),
- partition_spec: PartitionSpec::builder(schema)
- .with_spec_id(<span class="number">0</span>)
- .add_partition_field(<span class="string">"v_int"</span>, <span class="string">"v_int"</span>, Transform::Identity)
- .unwrap()
- .add_partition_field(<span class="string">"v_long"</span>, <span class="string">"v_long"</span>, Transform::Identity)
- .unwrap()
- .build()
- .unwrap(),
- content: ManifestContentType::Data,
- format_version: FormatVersion::V2,
- };
- <span class="kw">let </span><span class="kw-2">mut </span>entries = <span class="macro">vec!</span>[ManifestEntry {
- status: ManifestStatus::Added,
- snapshot_id: <span class="prelude-val">None</span>,
- sequence_number: <span class="prelude-val">None</span>,
- file_sequence_number: <span class="prelude-val">None</span>,
- data_file: DataFile {
- content: DataContentType::Data,
- file_format: DataFileFormat::Parquet,
- file_path: <span class="string">"s3a://icebergdata/demo/s1/t1/data/00000-0-378b56f5-5c52-4102-a2c2-f05f8a7cbe4a-00000.parquet"</span>.to_string(),
- partition: Struct::from_iter(
- <span class="macro">vec!</span>[
- <span class="prelude-val">Some</span>(Literal::int(<span class="number">1</span>)),
- <span class="prelude-val">Some</span>(Literal::long(<span class="number">1000</span>)),
- ]
- .into_iter()
- ),
- record_count: <span class="number">1</span>,
- file_size_in_bytes: <span class="number">5442</span>,
- column_sizes: HashMap::from([
- (<span class="number">0</span>, <span class="number">73</span>),
- (<span class="number">6</span>, <span class="number">34</span>),
- (<span class="number">2</span>, <span class="number">73</span>),
- (<span class="number">7</span>, <span class="number">61</span>),
- (<span class="number">3</span>, <span class="number">61</span>),
- (<span class="number">5</span>, <span class="number">62</span>),
- (<span class="number">9</span>, <span class="number">79</span>),
- (<span class="number">10</span>, <span class="number">73</span>),
- (<span class="number">1</span>, <span class="number">61</span>),
- (<span class="number">4</span>, <span class="number">73</span>),
- (<span class="number">8</span>, <span class="number">73</span>)
- ]),
- value_counts: HashMap::from([
- (<span class="number">4</span>, <span class="number">1</span>),
- (<span class="number">5</span>, <span class="number">1</span>),
- (<span class="number">2</span>, <span class="number">1</span>),
- (<span class="number">0</span>, <span class="number">1</span>),
- (<span class="number">3</span>, <span class="number">1</span>),
- (<span class="number">6</span>, <span class="number">1</span>),
- (<span class="number">8</span>, <span class="number">1</span>),
- (<span class="number">1</span>, <span class="number">1</span>),
- (<span class="number">10</span>, <span class="number">1</span>),
- (<span class="number">7</span>, <span class="number">1</span>),
- (<span class="number">9</span>, <span class="number">1</span>)
- ]),
- null_value_counts: HashMap::from([
- (<span class="number">1</span>, <span class="number">0</span>),
- (<span class="number">6</span>, <span class="number">0</span>),
- (<span class="number">2</span>, <span class="number">0</span>),
- (<span class="number">8</span>, <span class="number">0</span>),
- (<span class="number">0</span>, <span class="number">0</span>),
- (<span class="number">3</span>, <span class="number">0</span>),
- (<span class="number">5</span>, <span class="number">0</span>),
- (<span class="number">9</span>, <span class="number">0</span>),
- (<span class="number">7</span>, <span class="number">0</span>),
- (<span class="number">4</span>, <span class="number">0</span>),
- (<span class="number">10</span>, <span class="number">0</span>)
- ]),
- nan_value_counts: HashMap::new(),
- lower_bounds: HashMap::new(),
- upper_bounds: HashMap::new(),
- key_metadata: <span class="prelude-val">None</span>,
- split_offsets: <span class="macro">vec!</span>[<span class="number">4</span>],
- equality_ids: <span class="macro">vec!</span>[],
- sort_order_id: <span class="prelude-val">None</span>,
- partition_spec_id: <span class="number">0
- </span>},
- }];
-
- <span class="comment">// write manifest to file and check the return manifest file.
- </span><span class="kw">let </span>tmp_dir = TempDir::new().unwrap();
- <span class="kw">let </span>path = tmp_dir.path().join(<span class="string">"test_manifest.avro"</span>);
- <span class="kw">let </span>io = FileIOBuilder::new_fs_io().build().unwrap();
- <span class="kw">let </span>output_file = io.new_output(path.to_str().unwrap()).unwrap();
- <span class="kw">let </span><span class="kw-2">mut </span>writer = ManifestWriterBuilder::new(
- output_file,
- <span class="prelude-val">Some</span>(<span class="number">2</span>),
- <span class="macro">vec!</span>[],
- metadata.schema.clone(),
- metadata.partition_spec.clone(),
- )
- .build_v2_data();
- <span class="kw">for </span>entry <span class="kw">in </span><span class="kw-2">&</span>entries {
- writer.add_entry(entry.clone()).unwrap();
- }
- <span class="kw">let </span>manifest_file = writer.write_manifest_file().<span class="kw">await</span>.unwrap();
- <span class="macro">assert_eq!</span>(manifest_file.sequence_number, UNASSIGNED_SEQUENCE_NUMBER);
- <span class="macro">assert_eq!</span>(
- manifest_file.min_sequence_number,
- UNASSIGNED_SEQUENCE_NUMBER
- );
-
- <span class="comment">// read back the manifest file and check the content
- </span><span class="kw">let </span>actual_manifest =
- Manifest::parse_avro(fs::read(path).expect(<span class="string">"read_file must succeed"</span>).as_slice())
- .unwrap();
- <span class="comment">// The snapshot id is assigned when the entry is added to the manifest.
- </span>entries[<span class="number">0</span>].snapshot_id = <span class="prelude-val">Some</span>(<span class="number">2</span>);
- <span class="macro">assert_eq!</span>(actual_manifest, Manifest::new(metadata, entries));
- }
-
- <span class="attr">#[tokio::test]
- </span><span class="kw">async fn </span>test_parse_manifest_v1_unpartition() {
- <span class="kw">let </span>schema = Arc::new(
- Schema::builder()
- .with_schema_id(<span class="number">1</span>)
- .with_fields(<span class="macro">vec!</span>[
- Arc::new(NestedField::optional(
- <span class="number">1</span>,
- <span class="string">"id"</span>,
- Type::Primitive(PrimitiveType::Int),
- )),
- Arc::new(NestedField::optional(
- <span class="number">2</span>,
- <span class="string">"data"</span>,
- Type::Primitive(PrimitiveType::String),
- )),
- Arc::new(NestedField::optional(
- <span class="number">3</span>,
- <span class="string">"comment"</span>,
- Type::Primitive(PrimitiveType::String),
- )),
- ])
- .build()
- .unwrap(),
- );
- <span class="kw">let </span>metadata = ManifestMetadata {
- schema_id: <span class="number">1</span>,
- schema: schema.clone(),
- partition_spec: PartitionSpec::builder(schema)
- .with_spec_id(<span class="number">0</span>)
- .build()
- .unwrap(),
- content: ManifestContentType::Data,
- format_version: FormatVersion::V1,
- };
- <span class="kw">let </span><span class="kw-2">mut </span>entries = <span class="macro">vec!</span>[ManifestEntry {
- status: ManifestStatus::Added,
- snapshot_id: <span class="prelude-val">Some</span>(<span class="number">0</span>),
- sequence_number: <span class="prelude-val">Some</span>(<span class="number">0</span>),
- file_sequence_number: <span class="prelude-val">Some</span>(<span class="number">0</span>),
- data_file: DataFile {
- content: DataContentType::Data,
- file_path: <span class="string">"s3://testbucket/iceberg_data/iceberg_ctl/iceberg_db/iceberg_tbl/data/00000-7-45268d71-54eb-476c-b42c-942d880c04a1-00001.parquet"</span>.to_string(),
- file_format: DataFileFormat::Parquet,
- partition: Struct::empty(),
- record_count: <span class="number">1</span>,
- file_size_in_bytes: <span class="number">875</span>,
- column_sizes: HashMap::from([(<span class="number">1</span>,<span class="number">47</span>),(<span class="number">2</span>,<span class="number">48</span>),(<span class="number">3</span>,<span class="number">52</span>)]),
- value_counts: HashMap::from([(<span class="number">1</span>,<span class="number">1</span>),(<span class="number">2</span>,<span class="number">1</span>),(<span class="number">3</span>,<span class="number">1</span>)]),
- null_value_counts: HashMap::from([(<span class="number">1</span>,<span class="number">0</span>),(<span class="number">2</span>,<span class="number">0</span>),(<span class="number">3</span>,<span class="number">0</span>)]),
- nan_value_counts: HashMap::new(),
- lower_bounds: HashMap::from([(<span class="number">1</span>,Datum::int(<span class="number">1</span>)),(<span class="number">2</span>,Datum::string(<span class="string">"a"</span>)),(<span class="number">3</span>,Datum::string(<span class="string">"AC/DC"</span>))]),
- upper_bounds: HashMap::from([(<span class="number">1</span>,Datum::int(<span class="number">1</span>)),(<span class="number">2</span>,Datum::string(<span class="string">"a"</span>)),(<span class="number">3</span>,Datum::string(<span class="string">"AC/DC"</span>))]),
- key_metadata: <span class="prelude-val">None</span>,
- split_offsets: <span class="macro">vec!</span>[<span class="number">4</span>],
- equality_ids: <span class="macro">vec!</span>[],
- sort_order_id: <span class="prelude-val">Some</span>(<span class="number">0</span>),
- partition_spec_id: <span class="number">0
- </span>}
- }];
-
- <span class="comment">// write manifest to file
- </span><span class="kw">let </span>tmp_dir = TempDir::new().unwrap();
- <span class="kw">let </span>path = tmp_dir.path().join(<span class="string">"test_manifest.avro"</span>);
- <span class="kw">let </span>io = FileIOBuilder::new_fs_io().build().unwrap();
- <span class="kw">let </span>output_file = io.new_output(path.to_str().unwrap()).unwrap();
- <span class="kw">let </span><span class="kw-2">mut </span>writer = ManifestWriterBuilder::new(
- output_file,
- <span class="prelude-val">Some</span>(<span class="number">3</span>),
- <span class="macro">vec!</span>[],
- metadata.schema.clone(),
- metadata.partition_spec.clone(),
- )
- .build_v1();
- <span class="kw">for </span>entry <span class="kw">in </span><span class="kw-2">&</span>entries {
- writer.add_entry(entry.clone()).unwrap();
- }
- writer.write_manifest_file().<span class="kw">await</span>.unwrap();
-
- <span class="comment">// read back the manifest file and check the content
- </span><span class="kw">let </span>actual_manifest =
- Manifest::parse_avro(fs::read(path).expect(<span class="string">"read_file must succeed"</span>).as_slice())
- .unwrap();
- <span class="comment">// The snapshot id is assigned when the entry is added to the manifest.
- </span>entries[<span class="number">0</span>].snapshot_id = <span class="prelude-val">Some</span>(<span class="number">3</span>);
- <span class="macro">assert_eq!</span>(actual_manifest, Manifest::new(metadata, entries));
- }
-
- <span class="attr">#[tokio::test]
- </span><span class="kw">async fn </span>test_parse_manifest_v1_partition() {
- <span class="kw">let </span>schema = Arc::new(
- Schema::builder()
- .with_fields(<span class="macro">vec!</span>[
- Arc::new(NestedField::optional(
- <span class="number">1</span>,
- <span class="string">"id"</span>,
- Type::Primitive(PrimitiveType::Long),
- )),
- Arc::new(NestedField::optional(
- <span class="number">2</span>,
- <span class="string">"data"</span>,
- Type::Primitive(PrimitiveType::String),
- )),
- Arc::new(NestedField::optional(
- <span class="number">3</span>,
- <span class="string">"category"</span>,
- Type::Primitive(PrimitiveType::String),
- )),
- ])
- .build()
- .unwrap(),
- );
- <span class="kw">let </span>metadata = ManifestMetadata {
- schema_id: <span class="number">0</span>,
- schema: schema.clone(),
- partition_spec: PartitionSpec::builder(schema)
- .add_partition_field(<span class="string">"category"</span>, <span class="string">"category"</span>, Transform::Identity)
- .unwrap()
- .build()
- .unwrap(),
- content: ManifestContentType::Data,
- format_version: FormatVersion::V1,
- };
- <span class="kw">let </span><span class="kw-2">mut </span>entries = <span class="macro">vec!</span>[
- ManifestEntry {
- status: ManifestStatus::Added,
- snapshot_id: <span class="prelude-val">Some</span>(<span class="number">0</span>),
- sequence_number: <span class="prelude-val">Some</span>(<span class="number">0</span>),
- file_sequence_number: <span class="prelude-val">Some</span>(<span class="number">0</span>),
- data_file: DataFile {
- content: DataContentType::Data,
- file_path: <span class="string">"s3://testbucket/prod/db/sample/data/category=x/00010-1-d5c93668-1e52-41ac-92a6-bba590cbf249-00001.parquet"</span>.to_string(),
- file_format: DataFileFormat::Parquet,
- partition: Struct::from_iter(
- <span class="macro">vec!</span>[
- <span class="prelude-val">Some</span>(
- Literal::string(<span class="string">"x"</span>),
- ),
- ]
- .into_iter()
- ),
- record_count: <span class="number">1</span>,
- file_size_in_bytes: <span class="number">874</span>,
- column_sizes: HashMap::from([(<span class="number">1</span>, <span class="number">46</span>), (<span class="number">2</span>, <span class="number">48</span>), (<span class="number">3</span>, <span class="number">48</span>)]),
- value_counts: HashMap::from([(<span class="number">1</span>, <span class="number">1</span>), (<span class="number">2</span>, <span class="number">1</span>), (<span class="number">3</span>, <span class="number">1</span>)]),
- null_value_counts: HashMap::from([(<span class="number">1</span>, <span class="number">0</span>), (<span class="number">2</span>, <span class="number">0</span>), (<span class="number">3</span>, <span class="number">0</span>)]),
- nan_value_counts: HashMap::new(),
- lower_bounds: HashMap::from([
- (<span class="number">1</span>, Datum::long(<span class="number">1</span>)),
- (<span class="number">2</span>, Datum::string(<span class="string">"a"</span>)),
- (<span class="number">3</span>, Datum::string(<span class="string">"x"</span>))
- ]),
- upper_bounds: HashMap::from([
- (<span class="number">1</span>, Datum::long(<span class="number">1</span>)),
- (<span class="number">2</span>, Datum::string(<span class="string">"a"</span>)),
- (<span class="number">3</span>, Datum::string(<span class="string">"x"</span>))
- ]),
- key_metadata: <span class="prelude-val">None</span>,
- split_offsets: <span class="macro">vec!</span>[<span class="number">4</span>],
- equality_ids: <span class="macro">vec!</span>[],
- sort_order_id: <span class="prelude-val">Some</span>(<span class="number">0</span>),
- partition_spec_id: <span class="number">0
- </span>},
- }
- ];
-
- <span class="comment">// write manifest to file
- </span><span class="kw">let </span>tmp_dir = TempDir::new().unwrap();
- <span class="kw">let </span>path = tmp_dir.path().join(<span class="string">"test_manifest.avro"</span>);
- <span class="kw">let </span>io = FileIOBuilder::new_fs_io().build().unwrap();
- <span class="kw">let </span>output_file = io.new_output(path.to_str().unwrap()).unwrap();
- <span class="kw">let </span><span class="kw-2">mut </span>writer = ManifestWriterBuilder::new(
- output_file,
- <span class="prelude-val">Some</span>(<span class="number">2</span>),
- <span class="macro">vec!</span>[],
- metadata.schema.clone(),
- metadata.partition_spec.clone(),
- )
- .build_v1();
- <span class="kw">for </span>entry <span class="kw">in </span><span class="kw-2">&</span>entries {
- writer.add_entry(entry.clone()).unwrap();
- }
- <span class="kw">let </span>manifest_file = writer.write_manifest_file().<span class="kw">await</span>.unwrap();
- <span class="macro">assert_eq!</span>(manifest_file.partitions.len(), <span class="number">1</span>);
- <span class="macro">assert_eq!</span>(
- manifest_file.partitions[<span class="number">0</span>].lower_bound,
- <span class="prelude-val">Some</span>(Datum::string(<span class="string">"x"</span>))
- );
- <span class="macro">assert_eq!</span>(
- manifest_file.partitions[<span class="number">0</span>].upper_bound,
- <span class="prelude-val">Some</span>(Datum::string(<span class="string">"x"</span>))
- );
-
- <span class="comment">// read back the manifest file and check the content
- </span><span class="kw">let </span>actual_manifest =
- Manifest::parse_avro(fs::read(path).expect(<span class="string">"read_file must succeed"</span>).as_slice())
- .unwrap();
- <span class="comment">// The snapshot id is assigned when the entry is added to the manifest.
- </span>entries[<span class="number">0</span>].snapshot_id = <span class="prelude-val">Some</span>(<span class="number">2</span>);
- <span class="macro">assert_eq!</span>(actual_manifest, Manifest::new(metadata, entries));
- }
-
- <span class="attr">#[tokio::test]
- </span><span class="kw">async fn </span>test_parse_manifest_with_schema_evolution() {
- <span class="kw">let </span>schema = Arc::new(
- Schema::builder()
- .with_fields(<span class="macro">vec!</span>[
- Arc::new(NestedField::optional(
- <span class="number">1</span>,
- <span class="string">"id"</span>,
- Type::Primitive(PrimitiveType::Long),
- )),
- Arc::new(NestedField::optional(
- <span class="number">2</span>,
- <span class="string">"v_int"</span>,
- Type::Primitive(PrimitiveType::Int),
- )),
- ])
- .build()
- .unwrap(),
- );
- <span class="kw">let </span>metadata = ManifestMetadata {
- schema_id: <span class="number">0</span>,
- schema: schema.clone(),
- partition_spec: PartitionSpec::builder(schema)
- .with_spec_id(<span class="number">0</span>)
- .build()
- .unwrap(),
- content: ManifestContentType::Data,
- format_version: FormatVersion::V2,
- };
- <span class="kw">let </span>entries = <span class="macro">vec!</span>[ManifestEntry {
- status: ManifestStatus::Added,
- snapshot_id: <span class="prelude-val">None</span>,
- sequence_number: <span class="prelude-val">None</span>,
- file_sequence_number: <span class="prelude-val">None</span>,
- data_file: DataFile {
- content: DataContentType::Data,
- file_format: DataFileFormat::Parquet,
- file_path: <span class="string">"s3a://icebergdata/demo/s1/t1/data/00000-0-378b56f5-5c52-4102-a2c2-f05f8a7cbe4a-00000.parquet"</span>.to_string(),
- partition: Struct::empty(),
- record_count: <span class="number">1</span>,
- file_size_in_bytes: <span class="number">5442</span>,
- column_sizes: HashMap::from([
- (<span class="number">1</span>, <span class="number">61</span>),
- (<span class="number">2</span>, <span class="number">73</span>),
- (<span class="number">3</span>, <span class="number">61</span>),
- ]),
- value_counts: HashMap::default(),
- null_value_counts: HashMap::default(),
- nan_value_counts: HashMap::new(),
- lower_bounds: HashMap::from([
- (<span class="number">1</span>, Datum::long(<span class="number">1</span>)),
- (<span class="number">2</span>, Datum::int(<span class="number">2</span>)),
- (<span class="number">3</span>, Datum::string(<span class="string">"x"</span>))
- ]),
- upper_bounds: HashMap::from([
- (<span class="number">1</span>, Datum::long(<span class="number">1</span>)),
- (<span class="number">2</span>, Datum::int(<span class="number">2</span>)),
- (<span class="number">3</span>, Datum::string(<span class="string">"x"</span>))
- ]),
- key_metadata: <span class="prelude-val">None</span>,
- split_offsets: <span class="macro">vec!</span>[<span class="number">4</span>],
- equality_ids: <span class="macro">vec!</span>[],
- sort_order_id: <span class="prelude-val">None</span>,
- partition_spec_id: <span class="number">0
- </span>},
- }];
-
- <span class="comment">// write manifest to file
- </span><span class="kw">let </span>tmp_dir = TempDir::new().unwrap();
- <span class="kw">let </span>path = tmp_dir.path().join(<span class="string">"test_manifest.avro"</span>);
- <span class="kw">let </span>io = FileIOBuilder::new_fs_io().build().unwrap();
- <span class="kw">let </span>output_file = io.new_output(path.to_str().unwrap()).unwrap();
- <span class="kw">let </span><span class="kw-2">mut </span>writer = ManifestWriterBuilder::new(
- output_file,
- <span class="prelude-val">Some</span>(<span class="number">2</span>),
- <span class="macro">vec!</span>[],
- metadata.schema.clone(),
- metadata.partition_spec.clone(),
- )
- .build_v2_data();
- <span class="kw">for </span>entry <span class="kw">in </span><span class="kw-2">&</span>entries {
- writer.add_entry(entry.clone()).unwrap();
- }
- writer.write_manifest_file().<span class="kw">await</span>.unwrap();
-
- <span class="comment">// read back the manifest file and check the content
- </span><span class="kw">let </span>actual_manifest =
- Manifest::parse_avro(fs::read(path).expect(<span class="string">"read_file must succeed"</span>).as_slice())
- .unwrap();
-
- <span class="comment">// Compared with original manifest, the lower_bounds and upper_bounds no longer has data for field 3, and
- // other parts should be same.
- // The snapshot id is assigned when the entry is added to the manifest.
- </span><span class="kw">let </span>schema = Arc::new(
- Schema::builder()
- .with_fields(<span class="macro">vec!</span>[
- Arc::new(NestedField::optional(
- <span class="number">1</span>,
- <span class="string">"id"</span>,
- Type::Primitive(PrimitiveType::Long),
- )),
- Arc::new(NestedField::optional(
- <span class="number">2</span>,
- <span class="string">"v_int"</span>,
- Type::Primitive(PrimitiveType::Int),
- )),
- ])
- .build()
- .unwrap(),
- );
- <span class="kw">let </span>expected_manifest = Manifest {
- metadata: ManifestMetadata {
- schema_id: <span class="number">0</span>,
- schema: schema.clone(),
- partition_spec: PartitionSpec::builder(schema).with_spec_id(<span class="number">0</span>).build().unwrap(),
- content: ManifestContentType::Data,
- format_version: FormatVersion::V2,
- },
- entries: <span class="macro">vec!</span>[Arc::new(ManifestEntry {
- status: ManifestStatus::Added,
- snapshot_id: <span class="prelude-val">Some</span>(<span class="number">2</span>),
- sequence_number: <span class="prelude-val">None</span>,
- file_sequence_number: <span class="prelude-val">None</span>,
- data_file: DataFile {
- content: DataContentType::Data,
- file_format: DataFileFormat::Parquet,
- file_path: <span class="string">"s3a://icebergdata/demo/s1/t1/data/00000-0-378b56f5-5c52-4102-a2c2-f05f8a7cbe4a-00000.parquet"</span>.to_string(),
- partition: Struct::empty(),
- record_count: <span class="number">1</span>,
- file_size_in_bytes: <span class="number">5442</span>,
- column_sizes: HashMap::from([
- (<span class="number">1</span>, <span class="number">61</span>),
- (<span class="number">2</span>, <span class="number">73</span>),
- (<span class="number">3</span>, <span class="number">61</span>),
- ]),
- value_counts: HashMap::default(),
- null_value_counts: HashMap::default(),
- nan_value_counts: HashMap::new(),
- lower_bounds: HashMap::from([
- (<span class="number">1</span>, Datum::long(<span class="number">1</span>)),
- (<span class="number">2</span>, Datum::int(<span class="number">2</span>)),
- ]),
- upper_bounds: HashMap::from([
- (<span class="number">1</span>, Datum::long(<span class="number">1</span>)),
- (<span class="number">2</span>, Datum::int(<span class="number">2</span>)),
- ]),
- key_metadata: <span class="prelude-val">None</span>,
- split_offsets: <span class="macro">vec!</span>[<span class="number">4</span>],
- equality_ids: <span class="macro">vec!</span>[],
- sort_order_id: <span class="prelude-val">None</span>,
- partition_spec_id: <span class="number">0
- </span>},
- })],
- };
-
- <span class="macro">assert_eq!</span>(actual_manifest, expected_manifest);
- }
-
- <span class="attr">#[tokio::test]
- </span><span class="kw">async fn </span>test_manifest_summary() {
- <span class="kw">let </span>schema = Arc::new(
- Schema::builder()
- .with_fields(<span class="macro">vec!</span>[
- Arc::new(NestedField::optional(
- <span class="number">1</span>,
- <span class="string">"time"</span>,
- Type::Primitive(PrimitiveType::Date),
- )),
- Arc::new(NestedField::optional(
- <span class="number">2</span>,
- <span class="string">"v_float"</span>,
- Type::Primitive(PrimitiveType::Float),
- )),
- Arc::new(NestedField::optional(
- <span class="number">3</span>,
- <span class="string">"v_double"</span>,
- Type::Primitive(PrimitiveType::Double),
- )),
- ])
- .build()
- .unwrap(),
- );
- <span class="kw">let </span>partition_spec = PartitionSpec::builder(schema.clone())
- .with_spec_id(<span class="number">0</span>)
- .add_partition_field(<span class="string">"time"</span>, <span class="string">"year_of_time"</span>, Transform::Year)
- .unwrap()
- .add_partition_field(<span class="string">"v_float"</span>, <span class="string">"f"</span>, Transform::Identity)
- .unwrap()
- .add_partition_field(<span class="string">"v_double"</span>, <span class="string">"d"</span>, Transform::Identity)
- .unwrap()
- .build()
- .unwrap();
- <span class="kw">let </span>metadata = ManifestMetadata {
- schema_id: <span class="number">0</span>,
- schema,
- partition_spec,
- content: ManifestContentType::Data,
- format_version: FormatVersion::V2,
- };
- <span class="kw">let </span>entries = <span class="macro">vec!</span>[
- ManifestEntry {
- status: ManifestStatus::Added,
- snapshot_id: <span class="prelude-val">None</span>,
- sequence_number: <span class="prelude-val">None</span>,
- file_sequence_number: <span class="prelude-val">None</span>,
- data_file: DataFile {
- content: DataContentType::Data,
- file_path: <span class="string">"s3a://icebergdata/demo/s1/t1/data/00000-0-ba56fbfa-f2ff-40c9-bb27-565ad6dc2be8-00000.parquet"</span>.to_string(),
- file_format: DataFileFormat::Parquet,
- partition: Struct::from_iter(
- <span class="macro">vec!</span>[
- <span class="prelude-val">Some</span>(Literal::int(<span class="number">2021</span>)),
- <span class="prelude-val">Some</span>(Literal::float(<span class="number">1.0</span>)),
- <span class="prelude-val">Some</span>(Literal::double(<span class="number">2.0</span>)),
- ]
- ),
- record_count: <span class="number">1</span>,
- file_size_in_bytes: <span class="number">5442</span>,
- column_sizes: HashMap::from([(<span class="number">0</span>,<span class="number">73</span>),(<span class="number">6</span>,<span class="number">34</span>),(<span class="number">2</span>,<span class="number">73</span>),(<span class="number">7</span>,<span class="number">61</span>),(<span class="number">3</span>,<span class="number">61</span>),(<span class="number">5</span>,<span class="number">62</span>),(<span class="number">9</span>,<span class="number">79</span> [...]
- value_counts: HashMap::from([(<span class="number">4</span>,<span class="number">1</span>),(<span class="number">5</span>,<span class="number">1</span>),(<span class="number">2</span>,<span class="number">1</span>),(<span class="number">0</span>,<span class="number">1</span>),(<span class="number">3</span>,<span class="number">1</span>),(<span class="number">6</span>,<span class="number">1</span>),(<span class="number">8</span>,<span class="number">1</span>),(<spa [...]
- null_value_counts: HashMap::from([(<span class="number">1</span>,<span class="number">0</span>),(<span class="number">6</span>,<span class="number">0</span>),(<span class="number">2</span>,<span class="number">0</span>),(<span class="number">8</span>,<span class="number">0</span>),(<span class="number">0</span>,<span class="number">0</span>),(<span class="number">3</span>,<span class="number">0</span>),(<span class="number">5</span>,<span class="number">0</span>), [...]
- nan_value_counts: HashMap::new(),
- lower_bounds: HashMap::new(),
- upper_bounds: HashMap::new(),
- key_metadata: <span class="prelude-val">None</span>,
- split_offsets: <span class="macro">vec!</span>[<span class="number">4</span>],
- equality_ids: Vec::new(),
- sort_order_id: <span class="prelude-val">None</span>,
- partition_spec_id: <span class="number">0
- </span>}
- },
- ManifestEntry {
- status: ManifestStatus::Added,
- snapshot_id: <span class="prelude-val">None</span>,
- sequence_number: <span class="prelude-val">None</span>,
- file_sequence_number: <span class="prelude-val">None</span>,
- data_file: DataFile {
- content: DataContentType::Data,
- file_path: <span class="string">"s3a://icebergdata/demo/s1/t1/data/00000-0-ba56fbfa-f2ff-40c9-bb27-565ad6dc2be8-00000.parquet"</span>.to_string(),
- file_format: DataFileFormat::Parquet,
- partition: Struct::from_iter(
- <span class="macro">vec!</span>[
- <span class="prelude-val">Some</span>(Literal::int(<span class="number">1111</span>)),
- <span class="prelude-val">Some</span>(Literal::float(<span class="number">15.5</span>)),
- <span class="prelude-val">Some</span>(Literal::double(<span class="number">25.5</span>)),
- ]
- ),
- record_count: <span class="number">1</span>,
- file_size_in_bytes: <span class="number">5442</span>,
- column_sizes: HashMap::from([(<span class="number">0</span>,<span class="number">73</span>),(<span class="number">6</span>,<span class="number">34</span>),(<span class="number">2</span>,<span class="number">73</span>),(<span class="number">7</span>,<span class="number">61</span>),(<span class="number">3</span>,<span class="number">61</span>),(<span class="number">5</span>,<span class="number">62</span>),(<span class="number">9</span>,<span class="number">79</s [...]
- value_counts: HashMap::from([(<span class="number">4</span>,<span class="number">1</span>),(<span class="number">5</span>,<span class="number">1</span>),(<span class="number">2</span>,<span class="number">1</span>),(<span class="number">0</span>,<span class="number">1</span>),(<span class="number">3</span>,<span class="number">1</span>),(<span class="number">6</span>,<span class="number">1</span>),(<span class="number">8</span>,<span class="number">1</span>),( [...]
- null_value_counts: HashMap::from([(<span class="number">1</span>,<span class="number">0</span>),(<span class="number">6</span>,<span class="number">0</span>),(<span class="number">2</span>,<span class="number">0</span>),(<span class="number">8</span>,<span class="number">0</span>),(<span class="number">0</span>,<span class="number">0</span>),(<span class="number">3</span>,<span class="number">0</span>),(<span class="number">5</span>,<span class="number">0</spa [...]
- nan_value_counts: HashMap::new(),
- lower_bounds: HashMap::new(),
- upper_bounds: HashMap::new(),
- key_metadata: <span class="prelude-val">None</span>,
- split_offsets: <span class="macro">vec!</span>[<span class="number">4</span>],
- equality_ids: Vec::new(),
- sort_order_id: <span class="prelude-val">None</span>,
- partition_spec_id: <span class="number">0
- </span>}
- },
- ManifestEntry {
- status: ManifestStatus::Added,
- snapshot_id: <span class="prelude-val">None</span>,
- sequence_number: <span class="prelude-val">None</span>,
- file_sequence_number: <span class="prelude-val">None</span>,
- data_file: DataFile {
- content: DataContentType::Data,
- file_path: <span class="string">"s3a://icebergdata/demo/s1/t1/data/00000-0-ba56fbfa-f2ff-40c9-bb27-565ad6dc2be8-00000.parquet"</span>.to_string(),
- file_format: DataFileFormat::Parquet,
- partition: Struct::from_iter(
- <span class="macro">vec!</span>[
- <span class="prelude-val">Some</span>(Literal::int(<span class="number">1211</span>)),
- <span class="prelude-val">Some</span>(Literal::float(f32::NAN)),
- <span class="prelude-val">Some</span>(Literal::double(<span class="number">1.0</span>)),
- ]
- ),
- record_count: <span class="number">1</span>,
- file_size_in_bytes: <span class="number">5442</span>,
- column_sizes: HashMap::from([(<span class="number">0</span>,<span class="number">73</span>),(<span class="number">6</span>,<span class="number">34</span>),(<span class="number">2</span>,<span class="number">73</span>),(<span class="number">7</span>,<span class="number">61</span>),(<span class="number">3</span>,<span class="number">61</span>),(<span class="number">5</span>,<span class="number">62</span>),(<span class="number">9</span>,<span class="number">79</s [...]
- value_counts: HashMap::from([(<span class="number">4</span>,<span class="number">1</span>),(<span class="number">5</span>,<span class="number">1</span>),(<span class="number">2</span>,<span class="number">1</span>),(<span class="number">0</span>,<span class="number">1</span>),(<span class="number">3</span>,<span class="number">1</span>),(<span class="number">6</span>,<span class="number">1</span>),(<span class="number">8</span>,<span class="number">1</span>),( [...]
- null_value_counts: HashMap::from([(<span class="number">1</span>,<span class="number">0</span>),(<span class="number">6</span>,<span class="number">0</span>),(<span class="number">2</span>,<span class="number">0</span>),(<span class="number">8</span>,<span class="number">0</span>),(<span class="number">0</span>,<span class="number">0</span>),(<span class="number">3</span>,<span class="number">0</span>),(<span class="number">5</span>,<span class="number">0</spa [...]
- nan_value_counts: HashMap::new(),
- lower_bounds: HashMap::new(),
- upper_bounds: HashMap::new(),
- key_metadata: <span class="prelude-val">None</span>,
- split_offsets: <span class="macro">vec!</span>[<span class="number">4</span>],
- equality_ids: Vec::new(),
- sort_order_id: <span class="prelude-val">None</span>,
- partition_spec_id: <span class="number">0
- </span>}
- },
- ManifestEntry {
- status: ManifestStatus::Added,
- snapshot_id: <span class="prelude-val">None</span>,
- sequence_number: <span class="prelude-val">None</span>,
- file_sequence_number: <span class="prelude-val">None</span>,
- data_file: DataFile {
- content: DataContentType::Data,
- file_path: <span class="string">"s3a://icebergdata/demo/s1/t1/data/00000-0-ba56fbfa-f2ff-40c9-bb27-565ad6dc2be8-00000.parquet"</span>.to_string(),
- file_format: DataFileFormat::Parquet,
- partition: Struct::from_iter(
- <span class="macro">vec!</span>[
- <span class="prelude-val">Some</span>(Literal::int(<span class="number">1111</span>)),
- <span class="prelude-val">None</span>,
- <span class="prelude-val">Some</span>(Literal::double(<span class="number">11.0</span>)),
- ]
- ),
- record_count: <span class="number">1</span>,
- file_size_in_bytes: <span class="number">5442</span>,
- column_sizes: HashMap::from([(<span class="number">0</span>,<span class="number">73</span>),(<span class="number">6</span>,<span class="number">34</span>),(<span class="number">2</span>,<span class="number">73</span>),(<span class="number">7</span>,<span class="number">61</span>),(<span class="number">3</span>,<span class="number">61</span>),(<span class="number">5</span>,<span class="number">62</span>),(<span class="number">9</span>,<span class="number">79</s [...]
- value_counts: HashMap::from([(<span class="number">4</span>,<span class="number">1</span>),(<span class="number">5</span>,<span class="number">1</span>),(<span class="number">2</span>,<span class="number">1</span>),(<span class="number">0</span>,<span class="number">1</span>),(<span class="number">3</span>,<span class="number">1</span>),(<span class="number">6</span>,<span class="number">1</span>),(<span class="number">8</span>,<span class="number">1</span>),( [...]
- null_value_counts: HashMap::from([(<span class="number">1</span>,<span class="number">0</span>),(<span class="number">6</span>,<span class="number">0</span>),(<span class="number">2</span>,<span class="number">0</span>),(<span class="number">8</span>,<span class="number">0</span>),(<span class="number">0</span>,<span class="number">0</span>),(<span class="number">3</span>,<span class="number">0</span>),(<span class="number">5</span>,<span class="number">0</spa [...]
- nan_value_counts: HashMap::new(),
- lower_bounds: HashMap::new(),
- upper_bounds: HashMap::new(),
- key_metadata: <span class="prelude-val">None</span>,
- split_offsets: <span class="macro">vec!</span>[<span class="number">4</span>],
- equality_ids: Vec::new(),
- sort_order_id: <span class="prelude-val">None</span>,
- partition_spec_id: <span class="number">0
- </span>}
- },
- ];
-
- <span class="comment">// write manifest to file
- </span><span class="kw">let </span>tmp_dir = TempDir::new().unwrap();
- <span class="kw">let </span>path = tmp_dir.path().join(<span class="string">"test_manifest.avro"</span>);
- <span class="kw">let </span>io = FileIOBuilder::new_fs_io().build().unwrap();
- <span class="kw">let </span>output_file = io.new_output(path.to_str().unwrap()).unwrap();
- <span class="kw">let </span><span class="kw-2">mut </span>writer = ManifestWriterBuilder::new(
- output_file,
- <span class="prelude-val">Some</span>(<span class="number">1</span>),
- <span class="macro">vec!</span>[],
- metadata.schema.clone(),
- metadata.partition_spec.clone(),
- )
- .build_v2_data();
- <span class="kw">for </span>entry <span class="kw">in </span><span class="kw-2">&</span>entries {
- writer.add_entry(entry.clone()).unwrap();
- }
- <span class="kw">let </span>res = writer.write_manifest_file().<span class="kw">await</span>.unwrap();
-
- <span class="macro">assert_eq!</span>(res.partitions.len(), <span class="number">3</span>);
- <span class="macro">assert_eq!</span>(res.partitions[<span class="number">0</span>].lower_bound, <span class="prelude-val">Some</span>(Datum::int(<span class="number">1111</span>)));
- <span class="macro">assert_eq!</span>(res.partitions[<span class="number">0</span>].upper_bound, <span class="prelude-val">Some</span>(Datum::int(<span class="number">2021</span>)));
- <span class="macro">assert!</span>(!res.partitions[<span class="number">0</span>].contains_null);
- <span class="macro">assert_eq!</span>(res.partitions[<span class="number">0</span>].contains_nan, <span class="prelude-val">Some</span>(<span class="bool-val">false</span>));
-
- <span class="macro">assert_eq!</span>(res.partitions[<span class="number">1</span>].lower_bound, <span class="prelude-val">Some</span>(Datum::float(<span class="number">1.0</span>)));
- <span class="macro">assert_eq!</span>(res.partitions[<span class="number">1</span>].upper_bound, <span class="prelude-val">Some</span>(Datum::float(<span class="number">15.5</span>)));
- <span class="macro">assert!</span>(res.partitions[<span class="number">1</span>].contains_null);
- <span class="macro">assert_eq!</span>(res.partitions[<span class="number">1</span>].contains_nan, <span class="prelude-val">Some</span>(<span class="bool-val">true</span>));
-
- <span class="macro">assert_eq!</span>(res.partitions[<span class="number">2</span>].lower_bound, <span class="prelude-val">Some</span>(Datum::double(<span class="number">1.0</span>)));
- <span class="macro">assert_eq!</span>(res.partitions[<span class="number">2</span>].upper_bound, <span class="prelude-val">Some</span>(Datum::double(<span class="number">25.5</span>)));
- <span class="macro">assert!</span>(!res.partitions[<span class="number">2</span>].contains_null);
- <span class="macro">assert_eq!</span>(res.partitions[<span class="number">2</span>].contains_nan, <span class="prelude-val">Some</span>(<span class="bool-val">false</span>));
- }
-
- <span class="attr">#[tokio::test]
- </span><span class="kw">async fn </span>test_add_delete_existing() {
- <span class="kw">let </span>schema = Arc::new(
- Schema::builder()
- .with_fields(<span class="macro">vec!</span>[
- Arc::new(NestedField::optional(
- <span class="number">1</span>,
- <span class="string">"id"</span>,
- Type::Primitive(PrimitiveType::Int),
- )),
- Arc::new(NestedField::optional(
- <span class="number">2</span>,
- <span class="string">"name"</span>,
- Type::Primitive(PrimitiveType::String),
- )),
- ])
- .build()
- .unwrap(),
- );
- <span class="kw">let </span>metadata = ManifestMetadata {
- schema_id: <span class="number">0</span>,
- schema: schema.clone(),
- partition_spec: PartitionSpec::builder(schema)
- .with_spec_id(<span class="number">0</span>)
- .build()
- .unwrap(),
- content: ManifestContentType::Data,
- format_version: FormatVersion::V2,
- };
- <span class="kw">let </span><span class="kw-2">mut </span>entries = <span class="macro">vec!</span>[
- ManifestEntry {
- status: ManifestStatus::Added,
- snapshot_id: <span class="prelude-val">None</span>,
- sequence_number: <span class="prelude-val">Some</span>(<span class="number">1</span>),
- file_sequence_number: <span class="prelude-val">Some</span>(<span class="number">1</span>),
- data_file: DataFile {
- content: DataContentType::Data,
- file_path: <span class="string">"s3a://icebergdata/demo/s1/t1/data/00000-0-ba56fbfa-f2ff-40c9-bb27-565ad6dc2be8-00000.parquet"</span>.to_string(),
- file_format: DataFileFormat::Parquet,
- partition: Struct::empty(),
- record_count: <span class="number">1</span>,
- file_size_in_bytes: <span class="number">5442</span>,
- column_sizes: HashMap::from([(<span class="number">1</span>, <span class="number">61</span>), (<span class="number">2</span>, <span class="number">73</span>)]),
- value_counts: HashMap::from([(<span class="number">1</span>, <span class="number">1</span>), (<span class="number">2</span>, <span class="number">1</span>)]),
- null_value_counts: HashMap::from([(<span class="number">1</span>, <span class="number">0</span>), (<span class="number">2</span>, <span class="number">0</span>)]),
- nan_value_counts: HashMap::new(),
- lower_bounds: HashMap::new(),
- upper_bounds: HashMap::new(),
- key_metadata: <span class="prelude-val">Some</span>(Vec::new()),
- split_offsets: <span class="macro">vec!</span>[<span class="number">4</span>],
- equality_ids: Vec::new(),
- sort_order_id: <span class="prelude-val">None</span>,
- partition_spec_id: <span class="number">0
- </span>},
- },
- ManifestEntry {
- status: ManifestStatus::Deleted,
- snapshot_id: <span class="prelude-val">Some</span>(<span class="number">1</span>),
- sequence_number: <span class="prelude-val">Some</span>(<span class="number">1</span>),
- file_sequence_number: <span class="prelude-val">Some</span>(<span class="number">1</span>),
- data_file: DataFile {
- content: DataContentType::Data,
- file_path: <span class="string">"s3a://icebergdata/demo/s1/t1/data/00000-0-ba56fbfa-f2ff-40c9-bb27-565ad6dc2be8-00000.parquet"</span>.to_string(),
- file_format: DataFileFormat::Parquet,
- partition: Struct::empty(),
- record_count: <span class="number">1</span>,
- file_size_in_bytes: <span class="number">5442</span>,
- column_sizes: HashMap::from([(<span class="number">1</span>, <span class="number">61</span>), (<span class="number">2</span>, <span class="number">73</span>)]),
- value_counts: HashMap::from([(<span class="number">1</span>, <span class="number">1</span>), (<span class="number">2</span>, <span class="number">1</span>)]),
- null_value_counts: HashMap::from([(<span class="number">1</span>, <span class="number">0</span>), (<span class="number">2</span>, <span class="number">0</span>)]),
- nan_value_counts: HashMap::new(),
- lower_bounds: HashMap::new(),
- upper_bounds: HashMap::new(),
- key_metadata: <span class="prelude-val">Some</span>(Vec::new()),
- split_offsets: <span class="macro">vec!</span>[<span class="number">4</span>],
- equality_ids: Vec::new(),
- sort_order_id: <span class="prelude-val">None</span>,
- partition_spec_id: <span class="number">0
- </span>},
- },
- ManifestEntry {
- status: ManifestStatus::Existing,
- snapshot_id: <span class="prelude-val">Some</span>(<span class="number">1</span>),
- sequence_number: <span class="prelude-val">Some</span>(<span class="number">1</span>),
- file_sequence_number: <span class="prelude-val">Some</span>(<span class="number">1</span>),
- data_file: DataFile {
- content: DataContentType::Data,
- file_path: <span class="string">"s3a://icebergdata/demo/s1/t1/data/00000-0-ba56fbfa-f2ff-40c9-bb27-565ad6dc2be8-00000.parquet"</span>.to_string(),
- file_format: DataFileFormat::Parquet,
- partition: Struct::empty(),
- record_count: <span class="number">1</span>,
- file_size_in_bytes: <span class="number">5442</span>,
- column_sizes: HashMap::from([(<span class="number">1</span>, <span class="number">61</span>), (<span class="number">2</span>, <span class="number">73</span>)]),
- value_counts: HashMap::from([(<span class="number">1</span>, <span class="number">1</span>), (<span class="number">2</span>, <span class="number">1</span>)]),
- null_value_counts: HashMap::from([(<span class="number">1</span>, <span class="number">0</span>), (<span class="number">2</span>, <span class="number">0</span>)]),
- nan_value_counts: HashMap::new(),
- lower_bounds: HashMap::new(),
- upper_bounds: HashMap::new(),
- key_metadata: <span class="prelude-val">Some</span>(Vec::new()),
- split_offsets: <span class="macro">vec!</span>[<span class="number">4</span>],
- equality_ids: Vec::new(),
- sort_order_id: <span class="prelude-val">None</span>,
- partition_spec_id: <span class="number">0
- </span>},
- },
- ];
-
- <span class="comment">// write manifest to file
- </span><span class="kw">let </span>tmp_dir = TempDir::new().unwrap();
- <span class="kw">let </span>path = tmp_dir.path().join(<span class="string">"test_manifest.avro"</span>);
- <span class="kw">let </span>io = FileIOBuilder::new_fs_io().build().unwrap();
- <span class="kw">let </span>output_file = io.new_output(path.to_str().unwrap()).unwrap();
- <span class="kw">let </span><span class="kw-2">mut </span>writer = ManifestWriterBuilder::new(
- output_file,
- <span class="prelude-val">Some</span>(<span class="number">3</span>),
- <span class="macro">vec!</span>[],
- metadata.schema.clone(),
- metadata.partition_spec.clone(),
- )
- .build_v2_data();
- writer.add_entry(entries[<span class="number">0</span>].clone()).unwrap();
- writer.add_delete_entry(entries[<span class="number">1</span>].clone()).unwrap();
- writer.add_existing_entry(entries[<span class="number">2</span>].clone()).unwrap();
- writer.write_manifest_file().<span class="kw">await</span>.unwrap();
-
- <span class="comment">// read back the manifest file and check the content
- </span><span class="kw">let </span>actual_manifest =
- Manifest::parse_avro(fs::read(path).expect(<span class="string">"read_file must succeed"</span>).as_slice())
- .unwrap();
-
- <span class="comment">// The snapshot id is assigned when the entry is added and delete to the manifest. Existing entries are keep original.
- </span>entries[<span class="number">0</span>].snapshot_id = <span class="prelude-val">Some</span>(<span class="number">3</span>);
- entries[<span class="number">1</span>].snapshot_id = <span class="prelude-val">Some</span>(<span class="number">3</span>);
- <span class="comment">// file sequence number is assigned to None when the entry is added and delete to the manifest.
- </span>entries[<span class="number">0</span>].file_sequence_number = <span class="prelude-val">None</span>;
- <span class="macro">assert_eq!</span>(actual_manifest, Manifest::new(metadata, entries));
- }
-
- <span class="attr">#[tokio::test]
- </span><span class="kw">async fn </span>test_data_file_serialize_deserialize() {
- <span class="kw">let </span>schema = Arc::new(
- Schema::builder()
- .with_fields(<span class="macro">vec!</span>[
- Arc::new(NestedField::optional(
- <span class="number">1</span>,
- <span class="string">"v1"</span>,
- Type::Primitive(PrimitiveType::Int),
- )),
- Arc::new(NestedField::optional(
- <span class="number">2</span>,
- <span class="string">"v2"</span>,
- Type::Primitive(PrimitiveType::String),
- )),
- Arc::new(NestedField::optional(
- <span class="number">3</span>,
- <span class="string">"v3"</span>,
- Type::Primitive(PrimitiveType::String),
- )),
- ])
- .build()
- .unwrap(),
- );
- <span class="kw">let </span>data_files = <span class="macro">vec!</span>[DataFile {
- content: DataContentType::Data,
- file_path: <span class="string">"s3://testbucket/iceberg_data/iceberg_ctl/iceberg_db/iceberg_tbl/data/00000-7-45268d71-54eb-476c-b42c-942d880c04a1-00001.parquet"</span>.to_string(),
- file_format: DataFileFormat::Parquet,
- partition: Struct::empty(),
- record_count: <span class="number">1</span>,
- file_size_in_bytes: <span class="number">875</span>,
- column_sizes: HashMap::from([(<span class="number">1</span>,<span class="number">47</span>),(<span class="number">2</span>,<span class="number">48</span>),(<span class="number">3</span>,<span class="number">52</span>)]),
- value_counts: HashMap::from([(<span class="number">1</span>,<span class="number">1</span>),(<span class="number">2</span>,<span class="number">1</span>),(<span class="number">3</span>,<span class="number">1</span>)]),
- null_value_counts: HashMap::from([(<span class="number">1</span>,<span class="number">0</span>),(<span class="number">2</span>,<span class="number">0</span>),(<span class="number">3</span>,<span class="number">0</span>)]),
- nan_value_counts: HashMap::new(),
- lower_bounds: HashMap::from([(<span class="number">1</span>,Datum::int(<span class="number">1</span>)),(<span class="number">2</span>,Datum::string(<span class="string">"a"</span>)),(<span class="number">3</span>,Datum::string(<span class="string">"AC/DC"</span>))]),
- upper_bounds: HashMap::from([(<span class="number">1</span>,Datum::int(<span class="number">1</span>)),(<span class="number">2</span>,Datum::string(<span class="string">"a"</span>)),(<span class="number">3</span>,Datum::string(<span class="string">"AC/DC"</span>))]),
- key_metadata: <span class="prelude-val">None</span>,
- split_offsets: <span class="macro">vec!</span>[<span class="number">4</span>],
- equality_ids: <span class="macro">vec!</span>[],
- sort_order_id: <span class="prelude-val">Some</span>(<span class="number">0</span>),
- partition_spec_id: <span class="number">0
- </span>}];
-
- <span class="kw">let </span><span class="kw-2">mut </span>buffer = Vec::new();
- <span class="kw">let _ </span>= write_data_files_to_avro(
- <span class="kw-2">&mut </span>buffer,
- data_files.clone().into_iter(),
- <span class="kw-2">&</span>StructType::new(<span class="macro">vec!</span>[]),
- FormatVersion::V2,
- )
- .unwrap();
-
- <span class="kw">let </span>actual_data_file = read_data_files_from_avro(
- <span class="kw-2">&mut </span>Cursor::new(buffer),
- <span class="kw-2">&</span>schema,
- <span class="number">0</span>,
- <span class="kw-2">&</span>StructType::new(<span class="macro">vec!</span>[]),
- FormatVersion::V2,
- )
- .unwrap();
-
- <span class="macro">assert_eq!</span>(data_files, actual_data_file);
- }
-}
-</code></pre></div></section></main></body></html>
\ No newline at end of file
diff --git a/api/src/iceberg/spec/manifest/_serde.rs.html b/api/src/iceberg/spec/manifest/_serde.rs.html
new file mode 100644
index 00000000..65620fb6
--- /dev/null
+++ b/api/src/iceberg/spec/manifest/_serde.rs.html
@@ -0,0 +1,771 @@
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `crates/iceberg/src/spec/manifest/_serde.rs`."><title>_serde.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff2,Fira [...]
+<a href="#2" id="2">2</a>
+<a href="#3" id="3">3</a>
+<a href="#4" id="4">4</a>
+<a href="#5" id="5">5</a>
+<a href="#6" id="6">6</a>
+<a href="#7" id="7">7</a>
+<a href="#8" id="8">8</a>
+<a href="#9" id="9">9</a>
+<a href="#10" id="10">10</a>
+<a href="#11" id="11">11</a>
+<a href="#12" id="12">12</a>
+<a href="#13" id="13">13</a>
+<a href="#14" id="14">14</a>
+<a href="#15" id="15">15</a>
+<a href="#16" id="16">16</a>
+<a href="#17" id="17">17</a>
+<a href="#18" id="18">18</a>
+<a href="#19" id="19">19</a>
+<a href="#20" id="20">20</a>
+<a href="#21" id="21">21</a>
+<a href="#22" id="22">22</a>
+<a href="#23" id="23">23</a>
+<a href="#24" id="24">24</a>
+<a href="#25" id="25">25</a>
+<a href="#26" id="26">26</a>
+<a href="#27" id="27">27</a>
+<a href="#28" id="28">28</a>
+<a href="#29" id="29">29</a>
+<a href="#30" id="30">30</a>
+<a href="#31" id="31">31</a>
+<a href="#32" id="32">32</a>
+<a href="#33" id="33">33</a>
+<a href="#34" id="34">34</a>
+<a href="#35" id="35">35</a>
+<a href="#36" id="36">36</a>
+<a href="#37" id="37">37</a>
+<a href="#38" id="38">38</a>
+<a href="#39" id="39">39</a>
+<a href="#40" id="40">40</a>
+<a href="#41" id="41">41</a>
+<a href="#42" id="42">42</a>
+<a href="#43" id="43">43</a>
+<a href="#44" id="44">44</a>
+<a href="#45" id="45">45</a>
+<a href="#46" id="46">46</a>
+<a href="#47" id="47">47</a>
+<a href="#48" id="48">48</a>
+<a href="#49" id="49">49</a>
+<a href="#50" id="50">50</a>
+<a href="#51" id="51">51</a>
+<a href="#52" id="52">52</a>
+<a href="#53" id="53">53</a>
+<a href="#54" id="54">54</a>
+<a href="#55" id="55">55</a>
+<a href="#56" id="56">56</a>
+<a href="#57" id="57">57</a>
+<a href="#58" id="58">58</a>
+<a href="#59" id="59">59</a>
+<a href="#60" id="60">60</a>
+<a href="#61" id="61">61</a>
+<a href="#62" id="62">62</a>
+<a href="#63" id="63">63</a>
+<a href="#64" id="64">64</a>
+<a href="#65" id="65">65</a>
+<a href="#66" id="66">66</a>
+<a href="#67" id="67">67</a>
+<a href="#68" id="68">68</a>
+<a href="#69" id="69">69</a>
+<a href="#70" id="70">70</a>
+<a href="#71" id="71">71</a>
+<a href="#72" id="72">72</a>
+<a href="#73" id="73">73</a>
+<a href="#74" id="74">74</a>
+<a href="#75" id="75">75</a>
+<a href="#76" id="76">76</a>
+<a href="#77" id="77">77</a>
+<a href="#78" id="78">78</a>
+<a href="#79" id="79">79</a>
+<a href="#80" id="80">80</a>
+<a href="#81" id="81">81</a>
+<a href="#82" id="82">82</a>
+<a href="#83" id="83">83</a>
+<a href="#84" id="84">84</a>
+<a href="#85" id="85">85</a>
+<a href="#86" id="86">86</a>
+<a href="#87" id="87">87</a>
+<a href="#88" id="88">88</a>
+<a href="#89" id="89">89</a>
+<a href="#90" id="90">90</a>
+<a href="#91" id="91">91</a>
+<a href="#92" id="92">92</a>
+<a href="#93" id="93">93</a>
+<a href="#94" id="94">94</a>
+<a href="#95" id="95">95</a>
+<a href="#96" id="96">96</a>
+<a href="#97" id="97">97</a>
+<a href="#98" id="98">98</a>
+<a href="#99" id="99">99</a>
+<a href="#100" id="100">100</a>
+<a href="#101" id="101">101</a>
+<a href="#102" id="102">102</a>
+<a href="#103" id="103">103</a>
+<a href="#104" id="104">104</a>
+<a href="#105" id="105">105</a>
+<a href="#106" id="106">106</a>
+<a href="#107" id="107">107</a>
+<a href="#108" id="108">108</a>
+<a href="#109" id="109">109</a>
+<a href="#110" id="110">110</a>
+<a href="#111" id="111">111</a>
+<a href="#112" id="112">112</a>
+<a href="#113" id="113">113</a>
+<a href="#114" id="114">114</a>
+<a href="#115" id="115">115</a>
+<a href="#116" id="116">116</a>
+<a href="#117" id="117">117</a>
+<a href="#118" id="118">118</a>
+<a href="#119" id="119">119</a>
+<a href="#120" id="120">120</a>
+<a href="#121" id="121">121</a>
+<a href="#122" id="122">122</a>
+<a href="#123" id="123">123</a>
+<a href="#124" id="124">124</a>
+<a href="#125" id="125">125</a>
+<a href="#126" id="126">126</a>
+<a href="#127" id="127">127</a>
+<a href="#128" id="128">128</a>
+<a href="#129" id="129">129</a>
+<a href="#130" id="130">130</a>
+<a href="#131" id="131">131</a>
+<a href="#132" id="132">132</a>
+<a href="#133" id="133">133</a>
+<a href="#134" id="134">134</a>
+<a href="#135" id="135">135</a>
+<a href="#136" id="136">136</a>
+<a href="#137" id="137">137</a>
+<a href="#138" id="138">138</a>
+<a href="#139" id="139">139</a>
+<a href="#140" id="140">140</a>
+<a href="#141" id="141">141</a>
+<a href="#142" id="142">142</a>
+<a href="#143" id="143">143</a>
+<a href="#144" id="144">144</a>
+<a href="#145" id="145">145</a>
+<a href="#146" id="146">146</a>
+<a href="#147" id="147">147</a>
+<a href="#148" id="148">148</a>
+<a href="#149" id="149">149</a>
+<a href="#150" id="150">150</a>
+<a href="#151" id="151">151</a>
+<a href="#152" id="152">152</a>
+<a href="#153" id="153">153</a>
+<a href="#154" id="154">154</a>
+<a href="#155" id="155">155</a>
+<a href="#156" id="156">156</a>
+<a href="#157" id="157">157</a>
+<a href="#158" id="158">158</a>
+<a href="#159" id="159">159</a>
+<a href="#160" id="160">160</a>
+<a href="#161" id="161">161</a>
+<a href="#162" id="162">162</a>
+<a href="#163" id="163">163</a>
+<a href="#164" id="164">164</a>
+<a href="#165" id="165">165</a>
+<a href="#166" id="166">166</a>
+<a href="#167" id="167">167</a>
+<a href="#168" id="168">168</a>
+<a href="#169" id="169">169</a>
+<a href="#170" id="170">170</a>
+<a href="#171" id="171">171</a>
+<a href="#172" id="172">172</a>
+<a href="#173" id="173">173</a>
+<a href="#174" id="174">174</a>
+<a href="#175" id="175">175</a>
+<a href="#176" id="176">176</a>
+<a href="#177" id="177">177</a>
+<a href="#178" id="178">178</a>
+<a href="#179" id="179">179</a>
+<a href="#180" id="180">180</a>
+<a href="#181" id="181">181</a>
+<a href="#182" id="182">182</a>
+<a href="#183" id="183">183</a>
+<a href="#184" id="184">184</a>
+<a href="#185" id="185">185</a>
+<a href="#186" id="186">186</a>
+<a href="#187" id="187">187</a>
+<a href="#188" id="188">188</a>
+<a href="#189" id="189">189</a>
+<a href="#190" id="190">190</a>
+<a href="#191" id="191">191</a>
+<a href="#192" id="192">192</a>
+<a href="#193" id="193">193</a>
+<a href="#194" id="194">194</a>
+<a href="#195" id="195">195</a>
+<a href="#196" id="196">196</a>
+<a href="#197" id="197">197</a>
+<a href="#198" id="198">198</a>
+<a href="#199" id="199">199</a>
+<a href="#200" id="200">200</a>
+<a href="#201" id="201">201</a>
+<a href="#202" id="202">202</a>
+<a href="#203" id="203">203</a>
+<a href="#204" id="204">204</a>
+<a href="#205" id="205">205</a>
+<a href="#206" id="206">206</a>
+<a href="#207" id="207">207</a>
+<a href="#208" id="208">208</a>
+<a href="#209" id="209">209</a>
+<a href="#210" id="210">210</a>
+<a href="#211" id="211">211</a>
+<a href="#212" id="212">212</a>
+<a href="#213" id="213">213</a>
+<a href="#214" id="214">214</a>
+<a href="#215" id="215">215</a>
+<a href="#216" id="216">216</a>
+<a href="#217" id="217">217</a>
+<a href="#218" id="218">218</a>
+<a href="#219" id="219">219</a>
+<a href="#220" id="220">220</a>
+<a href="#221" id="221">221</a>
+<a href="#222" id="222">222</a>
+<a href="#223" id="223">223</a>
+<a href="#224" id="224">224</a>
+<a href="#225" id="225">225</a>
+<a href="#226" id="226">226</a>
+<a href="#227" id="227">227</a>
+<a href="#228" id="228">228</a>
+<a href="#229" id="229">229</a>
+<a href="#230" id="230">230</a>
+<a href="#231" id="231">231</a>
+<a href="#232" id="232">232</a>
+<a href="#233" id="233">233</a>
+<a href="#234" id="234">234</a>
+<a href="#235" id="235">235</a>
+<a href="#236" id="236">236</a>
+<a href="#237" id="237">237</a>
+<a href="#238" id="238">238</a>
+<a href="#239" id="239">239</a>
+<a href="#240" id="240">240</a>
+<a href="#241" id="241">241</a>
+<a href="#242" id="242">242</a>
+<a href="#243" id="243">243</a>
+<a href="#244" id="244">244</a>
+<a href="#245" id="245">245</a>
+<a href="#246" id="246">246</a>
+<a href="#247" id="247">247</a>
+<a href="#248" id="248">248</a>
+<a href="#249" id="249">249</a>
+<a href="#250" id="250">250</a>
+<a href="#251" id="251">251</a>
+<a href="#252" id="252">252</a>
+<a href="#253" id="253">253</a>
+<a href="#254" id="254">254</a>
+<a href="#255" id="255">255</a>
+<a href="#256" id="256">256</a>
+<a href="#257" id="257">257</a>
+<a href="#258" id="258">258</a>
+<a href="#259" id="259">259</a>
+<a href="#260" id="260">260</a>
+<a href="#261" id="261">261</a>
+<a href="#262" id="262">262</a>
+<a href="#263" id="263">263</a>
+<a href="#264" id="264">264</a>
+<a href="#265" id="265">265</a>
+<a href="#266" id="266">266</a>
+<a href="#267" id="267">267</a>
+<a href="#268" id="268">268</a>
+<a href="#269" id="269">269</a>
+<a href="#270" id="270">270</a>
+<a href="#271" id="271">271</a>
+<a href="#272" id="272">272</a>
+<a href="#273" id="273">273</a>
+<a href="#274" id="274">274</a>
+<a href="#275" id="275">275</a>
+<a href="#276" id="276">276</a>
+<a href="#277" id="277">277</a>
+<a href="#278" id="278">278</a>
+<a href="#279" id="279">279</a>
+<a href="#280" id="280">280</a>
+<a href="#281" id="281">281</a>
+<a href="#282" id="282">282</a>
+<a href="#283" id="283">283</a>
+<a href="#284" id="284">284</a>
+<a href="#285" id="285">285</a>
+<a href="#286" id="286">286</a>
+<a href="#287" id="287">287</a>
+<a href="#288" id="288">288</a>
+<a href="#289" id="289">289</a>
+<a href="#290" id="290">290</a>
+<a href="#291" id="291">291</a>
+<a href="#292" id="292">292</a>
+<a href="#293" id="293">293</a>
+<a href="#294" id="294">294</a>
+<a href="#295" id="295">295</a>
+<a href="#296" id="296">296</a>
+<a href="#297" id="297">297</a>
+<a href="#298" id="298">298</a>
+<a href="#299" id="299">299</a>
+<a href="#300" id="300">300</a>
+<a href="#301" id="301">301</a>
+<a href="#302" id="302">302</a>
+<a href="#303" id="303">303</a>
+<a href="#304" id="304">304</a>
+<a href="#305" id="305">305</a>
+<a href="#306" id="306">306</a>
+<a href="#307" id="307">307</a>
+<a href="#308" id="308">308</a>
+<a href="#309" id="309">309</a>
+<a href="#310" id="310">310</a>
+<a href="#311" id="311">311</a>
+<a href="#312" id="312">312</a>
+<a href="#313" id="313">313</a>
+<a href="#314" id="314">314</a>
+<a href="#315" id="315">315</a>
+<a href="#316" id="316">316</a>
+<a href="#317" id="317">317</a>
+<a href="#318" id="318">318</a>
+<a href="#319" id="319">319</a>
+<a href="#320" id="320">320</a>
+<a href="#321" id="321">321</a>
+<a href="#322" id="322">322</a>
+<a href="#323" id="323">323</a>
+<a href="#324" id="324">324</a>
+<a href="#325" id="325">325</a>
+<a href="#326" id="326">326</a>
+<a href="#327" id="327">327</a>
+<a href="#328" id="328">328</a>
+<a href="#329" id="329">329</a>
+<a href="#330" id="330">330</a>
+<a href="#331" id="331">331</a>
+<a href="#332" id="332">332</a>
+<a href="#333" id="333">333</a>
+<a href="#334" id="334">334</a>
+<a href="#335" id="335">335</a>
+<a href="#336" id="336">336</a>
+<a href="#337" id="337">337</a>
+<a href="#338" id="338">338</a>
+<a href="#339" id="339">339</a>
+<a href="#340" id="340">340</a>
+<a href="#341" id="341">341</a>
+<a href="#342" id="342">342</a>
+<a href="#343" id="343">343</a>
+<a href="#344" id="344">344</a>
+<a href="#345" id="345">345</a>
+<a href="#346" id="346">346</a>
+<a href="#347" id="347">347</a>
+<a href="#348" id="348">348</a>
+<a href="#349" id="349">349</a>
+<a href="#350" id="350">350</a>
+<a href="#351" id="351">351</a>
+<a href="#352" id="352">352</a>
+<a href="#353" id="353">353</a>
+<a href="#354" id="354">354</a>
+<a href="#355" id="355">355</a>
+<a href="#356" id="356">356</a>
+<a href="#357" id="357">357</a>
+<a href="#358" id="358">358</a>
+<a href="#359" id="359">359</a>
+<a href="#360" id="360">360</a>
+<a href="#361" id="361">361</a>
+<a href="#362" id="362">362</a>
+<a href="#363" id="363">363</a>
+<a href="#364" id="364">364</a>
+<a href="#365" id="365">365</a>
+<a href="#366" id="366">366</a>
+<a href="#367" id="367">367</a>
+<a href="#368" id="368">368</a>
+<a href="#369" id="369">369</a>
+<a href="#370" id="370">370</a>
+<a href="#371" id="371">371</a>
+<a href="#372" id="372">372</a>
+<a href="#373" id="373">373</a>
+<a href="#374" id="374">374</a>
+<a href="#375" id="375">375</a>
+<a href="#376" id="376">376</a>
+<a href="#377" id="377">377</a>
+<a href="#378" id="378">378</a>
+<a href="#379" id="379">379</a>
+<a href="#380" id="380">380</a>
+<a href="#381" id="381">381</a>
+<a href="#382" id="382">382</a>
+<a href="#383" id="383">383</a>
+<a href="#384" id="384">384</a>
+<a href="#385" id="385">385</a>
+</pre></div><pre class="rust"><code><span class="comment">// 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.
+
+</span><span class="kw">use </span>std::collections::HashMap;
+
+<span class="kw">use </span>serde_derive::{Deserialize, Serialize};
+<span class="kw">use </span>serde_with::serde_as;
+
+<span class="kw">use super</span>::{Datum, ManifestEntry, Schema, Struct};
+<span class="kw">use </span><span class="kw">crate</span>::spec::{Literal, RawLiteral, StructType, Type};
+<span class="kw">use crate</span>::{Error, ErrorKind};
+
+<span class="attr">#[derive(Serialize, Deserialize)]
+</span><span class="kw">pub</span>(<span class="kw">super</span>) <span class="kw">struct </span>ManifestEntryV2 {
+ status: i32,
+ snapshot_id: <span class="prelude-ty">Option</span><i64>,
+ sequence_number: <span class="prelude-ty">Option</span><i64>,
+ file_sequence_number: <span class="prelude-ty">Option</span><i64>,
+ data_file: DataFileSerde,
+}
+
+<span class="kw">impl </span>ManifestEntryV2 {
+ <span class="kw">pub fn </span>try_from(value: ManifestEntry, partition_type: <span class="kw-2">&</span>StructType) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>, Error> {
+ <span class="prelude-val">Ok</span>(<span class="self">Self </span>{
+ status: value.status <span class="kw">as </span>i32,
+ snapshot_id: value.snapshot_id,
+ sequence_number: value.sequence_number,
+ file_sequence_number: value.file_sequence_number,
+ data_file: DataFileSerde::try_from(value.data_file, partition_type, <span class="bool-val">false</span>)<span class="question-mark">?</span>,
+ })
+ }
+
+ <span class="kw">pub fn </span>try_into(
+ <span class="self">self</span>,
+ partition_spec_id: i32,
+ partition_type: <span class="kw-2">&</span>StructType,
+ schema: <span class="kw-2">&</span>Schema,
+ ) -> <span class="prelude-ty">Result</span><ManifestEntry, Error> {
+ <span class="prelude-val">Ok</span>(ManifestEntry {
+ status: <span class="self">self</span>.status.try_into()<span class="question-mark">?</span>,
+ snapshot_id: <span class="self">self</span>.snapshot_id,
+ sequence_number: <span class="self">self</span>.sequence_number,
+ file_sequence_number: <span class="self">self</span>.file_sequence_number,
+ data_file: <span class="self">self
+ </span>.data_file
+ .try_into(partition_spec_id, partition_type, schema)<span class="question-mark">?</span>,
+ })
+ }
+}
+
+<span class="attr">#[derive(Serialize, Deserialize)]
+</span><span class="kw">pub</span>(<span class="kw">super</span>) <span class="kw">struct </span>ManifestEntryV1 {
+ status: i32,
+ <span class="kw">pub </span>snapshot_id: i64,
+ data_file: DataFileSerde,
+}
+
+<span class="kw">impl </span>ManifestEntryV1 {
+ <span class="kw">pub fn </span>try_from(value: ManifestEntry, partition_type: <span class="kw-2">&</span>StructType) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>, Error> {
+ <span class="prelude-val">Ok</span>(<span class="self">Self </span>{
+ status: value.status <span class="kw">as </span>i32,
+ snapshot_id: value.snapshot_id.unwrap_or_default(),
+ data_file: DataFileSerde::try_from(value.data_file, partition_type, <span class="bool-val">true</span>)<span class="question-mark">?</span>,
+ })
+ }
+
+ <span class="kw">pub fn </span>try_into(
+ <span class="self">self</span>,
+ partition_spec_id: i32,
+ partition_type: <span class="kw-2">&</span>StructType,
+ schema: <span class="kw-2">&</span>Schema,
+ ) -> <span class="prelude-ty">Result</span><ManifestEntry, Error> {
+ <span class="prelude-val">Ok</span>(ManifestEntry {
+ status: <span class="self">self</span>.status.try_into()<span class="question-mark">?</span>,
+ snapshot_id: <span class="prelude-val">Some</span>(<span class="self">self</span>.snapshot_id),
+ sequence_number: <span class="prelude-val">Some</span>(<span class="number">0</span>),
+ file_sequence_number: <span class="prelude-val">Some</span>(<span class="number">0</span>),
+ data_file: <span class="self">self
+ </span>.data_file
+ .try_into(partition_spec_id, partition_type, schema)<span class="question-mark">?</span>,
+ })
+ }
+}
+
+<span class="attr">#[serde_as]
+#[derive(Serialize, Deserialize)]
+</span><span class="kw">pub</span>(<span class="kw">super</span>) <span class="kw">struct </span>DataFileSerde {
+ <span class="attr">#[serde(default)]
+ </span>content: i32,
+ file_path: String,
+ file_format: String,
+ partition: RawLiteral,
+ record_count: i64,
+ file_size_in_bytes: i64,
+ <span class="attr">#[serde(skip_deserializing, skip_serializing_if = <span class="string">"Option::is_none"</span>)]
+ </span>block_size_in_bytes: <span class="prelude-ty">Option</span><i64>,
+ column_sizes: <span class="prelude-ty">Option</span><Vec<I64Entry>>,
+ value_counts: <span class="prelude-ty">Option</span><Vec<I64Entry>>,
+ null_value_counts: <span class="prelude-ty">Option</span><Vec<I64Entry>>,
+ nan_value_counts: <span class="prelude-ty">Option</span><Vec<I64Entry>>,
+ lower_bounds: <span class="prelude-ty">Option</span><Vec<BytesEntry>>,
+ upper_bounds: <span class="prelude-ty">Option</span><Vec<BytesEntry>>,
+ key_metadata: <span class="prelude-ty">Option</span><serde_bytes::ByteBuf>,
+ split_offsets: <span class="prelude-ty">Option</span><Vec<i64>>,
+ <span class="attr">#[serde(default)]
+ </span>equality_ids: <span class="prelude-ty">Option</span><Vec<i32>>,
+ sort_order_id: <span class="prelude-ty">Option</span><i32>,
+}
+
+<span class="kw">impl </span>DataFileSerde {
+ <span class="kw">pub fn </span>try_from(
+ value: <span class="kw">super</span>::DataFile,
+ partition_type: <span class="kw-2">&</span>StructType,
+ is_version_1: bool,
+ ) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>, Error> {
+ <span class="kw">let </span>block_size_in_bytes = <span class="kw">if </span>is_version_1 { <span class="prelude-val">Some</span>(<span class="number">0</span>) } <span class="kw">else </span>{ <span class="prelude-val">None </span>};
+ <span class="prelude-val">Ok</span>(<span class="self">Self </span>{
+ content: value.content <span class="kw">as </span>i32,
+ file_path: value.file_path,
+ file_format: value.file_format.to_string().to_ascii_uppercase(),
+ partition: RawLiteral::try_from(
+ Literal::Struct(value.partition),
+ <span class="kw-2">&</span>Type::Struct(partition_type.clone()),
+ )<span class="question-mark">?</span>,
+ record_count: value.record_count.try_into()<span class="question-mark">?</span>,
+ file_size_in_bytes: value.file_size_in_bytes.try_into()<span class="question-mark">?</span>,
+ block_size_in_bytes,
+ column_sizes: <span class="prelude-val">Some</span>(to_i64_entry(value.column_sizes)<span class="question-mark">?</span>),
+ value_counts: <span class="prelude-val">Some</span>(to_i64_entry(value.value_counts)<span class="question-mark">?</span>),
+ null_value_counts: <span class="prelude-val">Some</span>(to_i64_entry(value.null_value_counts)<span class="question-mark">?</span>),
+ nan_value_counts: <span class="prelude-val">Some</span>(to_i64_entry(value.nan_value_counts)<span class="question-mark">?</span>),
+ lower_bounds: <span class="prelude-val">Some</span>(to_bytes_entry(value.lower_bounds)<span class="question-mark">?</span>),
+ upper_bounds: <span class="prelude-val">Some</span>(to_bytes_entry(value.upper_bounds)<span class="question-mark">?</span>),
+ key_metadata: value.key_metadata.map(serde_bytes::ByteBuf::from),
+ split_offsets: <span class="prelude-val">Some</span>(value.split_offsets),
+ equality_ids: <span class="prelude-val">Some</span>(value.equality_ids),
+ sort_order_id: value.sort_order_id,
+ })
+ }
+
+ <span class="kw">pub fn </span>try_into(
+ <span class="self">self</span>,
+ partition_spec_id: i32,
+ partition_type: <span class="kw-2">&</span>StructType,
+ schema: <span class="kw-2">&</span>Schema,
+ ) -> <span class="prelude-ty">Result</span><<span class="kw">super</span>::DataFile, Error> {
+ <span class="kw">let </span>partition = <span class="self">self
+ </span>.partition
+ .try_into(<span class="kw-2">&</span>Type::Struct(partition_type.clone()))<span class="question-mark">?
+ </span>.map(|v| {
+ <span class="kw">if let </span>Literal::Struct(v) = v {
+ <span class="prelude-val">Ok</span>(v)
+ } <span class="kw">else </span>{
+ <span class="prelude-val">Err</span>(Error::new(
+ ErrorKind::DataInvalid,
+ <span class="string">"partition value is not a struct"</span>,
+ ))
+ }
+ })
+ .transpose()<span class="question-mark">?
+ </span>.unwrap_or(Struct::empty());
+ <span class="prelude-val">Ok</span>(<span class="kw">super</span>::DataFile {
+ content: <span class="self">self</span>.content.try_into()<span class="question-mark">?</span>,
+ file_path: <span class="self">self</span>.file_path,
+ file_format: <span class="self">self</span>.file_format.parse()<span class="question-mark">?</span>,
+ partition,
+ record_count: <span class="self">self</span>.record_count.try_into()<span class="question-mark">?</span>,
+ file_size_in_bytes: <span class="self">self</span>.file_size_in_bytes.try_into()<span class="question-mark">?</span>,
+ column_sizes: <span class="self">self
+ </span>.column_sizes
+ .map(parse_i64_entry)
+ .transpose()<span class="question-mark">?
+ </span>.unwrap_or_default(),
+ value_counts: <span class="self">self
+ </span>.value_counts
+ .map(parse_i64_entry)
+ .transpose()<span class="question-mark">?
+ </span>.unwrap_or_default(),
+ null_value_counts: <span class="self">self
+ </span>.null_value_counts
+ .map(parse_i64_entry)
+ .transpose()<span class="question-mark">?
+ </span>.unwrap_or_default(),
+ nan_value_counts: <span class="self">self
+ </span>.nan_value_counts
+ .map(parse_i64_entry)
+ .transpose()<span class="question-mark">?
+ </span>.unwrap_or_default(),
+ lower_bounds: <span class="self">self
+ </span>.lower_bounds
+ .map(|v| parse_bytes_entry(v, schema))
+ .transpose()<span class="question-mark">?
+ </span>.unwrap_or_default(),
+ upper_bounds: <span class="self">self
+ </span>.upper_bounds
+ .map(|v| parse_bytes_entry(v, schema))
+ .transpose()<span class="question-mark">?
+ </span>.unwrap_or_default(),
+ key_metadata: <span class="self">self</span>.key_metadata.map(|v| v.to_vec()),
+ split_offsets: <span class="self">self</span>.split_offsets.unwrap_or_default(),
+ equality_ids: <span class="self">self</span>.equality_ids.unwrap_or_default(),
+ sort_order_id: <span class="self">self</span>.sort_order_id,
+ partition_spec_id,
+ })
+ }
+}
+
+<span class="attr">#[serde_as]
+#[derive(Serialize, Deserialize)]
+#[cfg_attr(test, derive(Debug, PartialEq, Eq))]
+</span><span class="kw">struct </span>BytesEntry {
+ key: i32,
+ value: serde_bytes::ByteBuf,
+}
+
+<span class="kw">fn </span>parse_bytes_entry(v: Vec<BytesEntry>, schema: <span class="kw-2">&</span>Schema) -> <span class="prelude-ty">Result</span><HashMap<i32, Datum>, Error> {
+ <span class="kw">let </span><span class="kw-2">mut </span>m = HashMap::with_capacity(v.len());
+ <span class="kw">for </span>entry <span class="kw">in </span>v {
+ <span class="comment">// We ignore the entry if the field is not found in the schema, due to schema evolution.
+ </span><span class="kw">if let </span><span class="prelude-val">Some</span>(field) = schema.field_by_id(entry.key) {
+ <span class="kw">let </span>data_type = field
+ .field_type
+ .as_primitive_type()
+ .ok_or_else(|| {
+ Error::new(
+ ErrorKind::DataInvalid,
+ <span class="macro">format!</span>(<span class="string">"field {} is not a primitive type"</span>, field.name),
+ )
+ })<span class="question-mark">?
+ </span>.clone();
+ m.insert(entry.key, Datum::try_from_bytes(<span class="kw-2">&</span>entry.value, data_type)<span class="question-mark">?</span>);
+ }
+ }
+ <span class="prelude-val">Ok</span>(m)
+}
+
+<span class="kw">fn </span>to_bytes_entry(v: <span class="kw">impl </span>IntoIterator<Item = (i32, Datum)>) -> <span class="prelude-ty">Result</span><Vec<BytesEntry>, Error> {
+ <span class="kw">let </span>iter = v.into_iter();
+ <span class="comment">// Reserve the capacity to the lower bound.
+ </span><span class="kw">let </span><span class="kw-2">mut </span>bs = Vec::with_capacity(iter.size_hint().<span class="number">0</span>);
+ <span class="kw">for </span>(k, d) <span class="kw">in </span>iter {
+ bs.push(BytesEntry {
+ key: k,
+ value: d.to_bytes()<span class="question-mark">?</span>,
+ });
+ }
+ <span class="prelude-val">Ok</span>(bs)
+}
+
+<span class="attr">#[derive(Serialize, Deserialize)]
+#[cfg_attr(test, derive(Debug, PartialEq, Eq))]
+</span><span class="kw">struct </span>I64Entry {
+ key: i32,
+ value: i64,
+}
+
+<span class="kw">fn </span>parse_i64_entry(v: Vec<I64Entry>) -> <span class="prelude-ty">Result</span><HashMap<i32, u64>, Error> {
+ <span class="kw">let </span><span class="kw-2">mut </span>m = HashMap::with_capacity(v.len());
+ <span class="kw">for </span>entry <span class="kw">in </span>v {
+ <span class="comment">// We ignore the entry if it's value is negative since these entries are supposed to be used for
+ // counting, which should never be negative.
+ </span><span class="kw">if let </span><span class="prelude-val">Ok</span>(v) = entry.value.try_into() {
+ m.insert(entry.key, v);
+ }
+ }
+ <span class="prelude-val">Ok</span>(m)
+}
+
+<span class="kw">fn </span>to_i64_entry(entries: HashMap<i32, u64>) -> <span class="prelude-ty">Result</span><Vec<I64Entry>, Error> {
+ entries
+ .iter()
+ .map(|e| {
+ <span class="prelude-val">Ok</span>(I64Entry {
+ key: <span class="kw-2">*</span>e.<span class="number">0</span>,
+ value: (<span class="kw-2">*</span>e.<span class="number">1</span>).try_into()<span class="question-mark">?</span>,
+ })
+ })
+ .collect()
+}
+
+<span class="attr">#[cfg(test)]
+</span><span class="kw">mod </span>tests {
+ <span class="kw">use </span>std::collections::HashMap;
+ <span class="kw">use </span>std::io::Cursor;
+ <span class="kw">use </span>std::sync::Arc;
+
+ <span class="kw">use </span><span class="kw">crate</span>::spec::manifest::_serde::{parse_i64_entry, I64Entry};
+ <span class="kw">use </span><span class="kw">crate</span>::spec::{
+ read_data_files_from_avro, write_data_files_to_avro, DataContentType, DataFile,
+ DataFileFormat, Datum, FormatVersion, NestedField, PrimitiveType, Schema, Struct,
+ StructType, Type,
+ };
+
+ <span class="attr">#[test]
+ </span><span class="kw">fn </span>test_parse_negative_manifest_entry() {
+ <span class="kw">let </span>entries = <span class="macro">vec!</span>[I64Entry { key: <span class="number">1</span>, value: -<span class="number">1 </span>}, I64Entry {
+ key: <span class="number">2</span>,
+ value: <span class="number">3</span>,
+ }];
+
+ <span class="kw">let </span>ret = parse_i64_entry(entries).unwrap();
+
+ <span class="kw">let </span>expected_ret = HashMap::from([(<span class="number">2</span>, <span class="number">3</span>)]);
+ <span class="macro">assert_eq!</span>(ret, expected_ret, <span class="string">"Negative i64 entry should be ignored!"</span>);
+ }
+
+ <span class="attr">#[tokio::test]
+ </span><span class="kw">async fn </span>test_data_file_serialize_deserialize() {
+ <span class="kw">let </span>schema = Arc::new(
+ Schema::builder()
+ .with_fields(<span class="macro">vec!</span>[
+ Arc::new(NestedField::optional(
+ <span class="number">1</span>,
+ <span class="string">"v1"</span>,
+ Type::Primitive(PrimitiveType::Int),
+ )),
+ Arc::new(NestedField::optional(
+ <span class="number">2</span>,
+ <span class="string">"v2"</span>,
+ Type::Primitive(PrimitiveType::String),
+ )),
+ Arc::new(NestedField::optional(
+ <span class="number">3</span>,
+ <span class="string">"v3"</span>,
+ Type::Primitive(PrimitiveType::String),
+ )),
+ ])
+ .build()
+ .unwrap(),
+ );
+ <span class="kw">let </span>data_files = <span class="macro">vec!</span>[DataFile {
+ content: DataContentType::Data,
+ file_path: <span class="string">"s3://testbucket/iceberg_data/iceberg_ctl/iceberg_db/iceberg_tbl/data/00000-7-45268d71-54eb-476c-b42c-942d880c04a1-00001.parquet"</span>.to_string(),
+ file_format: DataFileFormat::Parquet,
+ partition: Struct::empty(),
+ record_count: <span class="number">1</span>,
+ file_size_in_bytes: <span class="number">875</span>,
+ column_sizes: HashMap::from([(<span class="number">1</span>,<span class="number">47</span>),(<span class="number">2</span>,<span class="number">48</span>),(<span class="number">3</span>,<span class="number">52</span>)]),
+ value_counts: HashMap::from([(<span class="number">1</span>,<span class="number">1</span>),(<span class="number">2</span>,<span class="number">1</span>),(<span class="number">3</span>,<span class="number">1</span>)]),
+ null_value_counts: HashMap::from([(<span class="number">1</span>,<span class="number">0</span>),(<span class="number">2</span>,<span class="number">0</span>),(<span class="number">3</span>,<span class="number">0</span>)]),
+ nan_value_counts: HashMap::new(),
+ lower_bounds: HashMap::from([(<span class="number">1</span>,Datum::int(<span class="number">1</span>)),(<span class="number">2</span>,Datum::string(<span class="string">"a"</span>)),(<span class="number">3</span>,Datum::string(<span class="string">"AC/DC"</span>))]),
+ upper_bounds: HashMap::from([(<span class="number">1</span>,Datum::int(<span class="number">1</span>)),(<span class="number">2</span>,Datum::string(<span class="string">"a"</span>)),(<span class="number">3</span>,Datum::string(<span class="string">"AC/DC"</span>))]),
+ key_metadata: <span class="prelude-val">None</span>,
+ split_offsets: <span class="macro">vec!</span>[<span class="number">4</span>],
+ equality_ids: <span class="macro">vec!</span>[],
+ sort_order_id: <span class="prelude-val">Some</span>(<span class="number">0</span>),
+ partition_spec_id: <span class="number">0
+ </span>}];
+
+ <span class="kw">let </span><span class="kw-2">mut </span>buffer = Vec::new();
+ <span class="kw">let _ </span>= write_data_files_to_avro(
+ <span class="kw-2">&mut </span>buffer,
+ data_files.clone().into_iter(),
+ <span class="kw-2">&</span>StructType::new(<span class="macro">vec!</span>[]),
+ FormatVersion::V2,
+ )
+ .unwrap();
+
+ <span class="kw">let </span>actual_data_file = read_data_files_from_avro(
+ <span class="kw-2">&mut </span>Cursor::new(buffer),
+ <span class="kw-2">&</span>schema,
+ <span class="number">0</span>,
+ <span class="kw-2">&</span>StructType::new(<span class="macro">vec!</span>[]),
+ FormatVersion::V2,
+ )
+ .unwrap();
+
+ <span class="macro">assert_eq!</span>(data_files, actual_data_file);
+ }
+}
+</code></pre></div></section></main></body></html>
\ No newline at end of file
diff --git a/api/src/iceberg/spec/manifest/data_file.rs.html b/api/src/iceberg/spec/manifest/data_file.rs.html
new file mode 100644
index 00000000..ded6ccf1
--- /dev/null
+++ b/api/src/iceberg/spec/manifest/data_file.rs.html
@@ -0,0 +1,705 @@
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `crates/iceberg/src/spec/manifest/data_file.rs`."><title>data_file.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff [...]
+<a href="#2" id="2">2</a>
+<a href="#3" id="3">3</a>
+<a href="#4" id="4">4</a>
+<a href="#5" id="5">5</a>
+<a href="#6" id="6">6</a>
+<a href="#7" id="7">7</a>
+<a href="#8" id="8">8</a>
+<a href="#9" id="9">9</a>
+<a href="#10" id="10">10</a>
+<a href="#11" id="11">11</a>
+<a href="#12" id="12">12</a>
+<a href="#13" id="13">13</a>
+<a href="#14" id="14">14</a>
+<a href="#15" id="15">15</a>
+<a href="#16" id="16">16</a>
+<a href="#17" id="17">17</a>
+<a href="#18" id="18">18</a>
+<a href="#19" id="19">19</a>
+<a href="#20" id="20">20</a>
+<a href="#21" id="21">21</a>
+<a href="#22" id="22">22</a>
+<a href="#23" id="23">23</a>
+<a href="#24" id="24">24</a>
+<a href="#25" id="25">25</a>
+<a href="#26" id="26">26</a>
+<a href="#27" id="27">27</a>
+<a href="#28" id="28">28</a>
+<a href="#29" id="29">29</a>
+<a href="#30" id="30">30</a>
+<a href="#31" id="31">31</a>
+<a href="#32" id="32">32</a>
+<a href="#33" id="33">33</a>
+<a href="#34" id="34">34</a>
+<a href="#35" id="35">35</a>
+<a href="#36" id="36">36</a>
+<a href="#37" id="37">37</a>
+<a href="#38" id="38">38</a>
+<a href="#39" id="39">39</a>
+<a href="#40" id="40">40</a>
+<a href="#41" id="41">41</a>
+<a href="#42" id="42">42</a>
+<a href="#43" id="43">43</a>
+<a href="#44" id="44">44</a>
+<a href="#45" id="45">45</a>
+<a href="#46" id="46">46</a>
+<a href="#47" id="47">47</a>
+<a href="#48" id="48">48</a>
+<a href="#49" id="49">49</a>
+<a href="#50" id="50">50</a>
+<a href="#51" id="51">51</a>
+<a href="#52" id="52">52</a>
+<a href="#53" id="53">53</a>
+<a href="#54" id="54">54</a>
+<a href="#55" id="55">55</a>
+<a href="#56" id="56">56</a>
+<a href="#57" id="57">57</a>
+<a href="#58" id="58">58</a>
+<a href="#59" id="59">59</a>
+<a href="#60" id="60">60</a>
+<a href="#61" id="61">61</a>
+<a href="#62" id="62">62</a>
+<a href="#63" id="63">63</a>
+<a href="#64" id="64">64</a>
+<a href="#65" id="65">65</a>
+<a href="#66" id="66">66</a>
+<a href="#67" id="67">67</a>
+<a href="#68" id="68">68</a>
+<a href="#69" id="69">69</a>
+<a href="#70" id="70">70</a>
+<a href="#71" id="71">71</a>
+<a href="#72" id="72">72</a>
+<a href="#73" id="73">73</a>
+<a href="#74" id="74">74</a>
+<a href="#75" id="75">75</a>
+<a href="#76" id="76">76</a>
+<a href="#77" id="77">77</a>
+<a href="#78" id="78">78</a>
+<a href="#79" id="79">79</a>
+<a href="#80" id="80">80</a>
+<a href="#81" id="81">81</a>
+<a href="#82" id="82">82</a>
+<a href="#83" id="83">83</a>
+<a href="#84" id="84">84</a>
+<a href="#85" id="85">85</a>
+<a href="#86" id="86">86</a>
+<a href="#87" id="87">87</a>
+<a href="#88" id="88">88</a>
+<a href="#89" id="89">89</a>
+<a href="#90" id="90">90</a>
+<a href="#91" id="91">91</a>
+<a href="#92" id="92">92</a>
+<a href="#93" id="93">93</a>
+<a href="#94" id="94">94</a>
+<a href="#95" id="95">95</a>
+<a href="#96" id="96">96</a>
+<a href="#97" id="97">97</a>
+<a href="#98" id="98">98</a>
+<a href="#99" id="99">99</a>
+<a href="#100" id="100">100</a>
+<a href="#101" id="101">101</a>
+<a href="#102" id="102">102</a>
+<a href="#103" id="103">103</a>
+<a href="#104" id="104">104</a>
+<a href="#105" id="105">105</a>
+<a href="#106" id="106">106</a>
+<a href="#107" id="107">107</a>
+<a href="#108" id="108">108</a>
+<a href="#109" id="109">109</a>
+<a href="#110" id="110">110</a>
+<a href="#111" id="111">111</a>
+<a href="#112" id="112">112</a>
+<a href="#113" id="113">113</a>
+<a href="#114" id="114">114</a>
+<a href="#115" id="115">115</a>
+<a href="#116" id="116">116</a>
+<a href="#117" id="117">117</a>
+<a href="#118" id="118">118</a>
+<a href="#119" id="119">119</a>
+<a href="#120" id="120">120</a>
+<a href="#121" id="121">121</a>
+<a href="#122" id="122">122</a>
+<a href="#123" id="123">123</a>
+<a href="#124" id="124">124</a>
+<a href="#125" id="125">125</a>
+<a href="#126" id="126">126</a>
+<a href="#127" id="127">127</a>
+<a href="#128" id="128">128</a>
+<a href="#129" id="129">129</a>
+<a href="#130" id="130">130</a>
+<a href="#131" id="131">131</a>
+<a href="#132" id="132">132</a>
+<a href="#133" id="133">133</a>
+<a href="#134" id="134">134</a>
+<a href="#135" id="135">135</a>
+<a href="#136" id="136">136</a>
+<a href="#137" id="137">137</a>
+<a href="#138" id="138">138</a>
+<a href="#139" id="139">139</a>
+<a href="#140" id="140">140</a>
+<a href="#141" id="141">141</a>
+<a href="#142" id="142">142</a>
+<a href="#143" id="143">143</a>
+<a href="#144" id="144">144</a>
+<a href="#145" id="145">145</a>
+<a href="#146" id="146">146</a>
+<a href="#147" id="147">147</a>
+<a href="#148" id="148">148</a>
+<a href="#149" id="149">149</a>
+<a href="#150" id="150">150</a>
+<a href="#151" id="151">151</a>
+<a href="#152" id="152">152</a>
+<a href="#153" id="153">153</a>
+<a href="#154" id="154">154</a>
+<a href="#155" id="155">155</a>
+<a href="#156" id="156">156</a>
+<a href="#157" id="157">157</a>
+<a href="#158" id="158">158</a>
+<a href="#159" id="159">159</a>
+<a href="#160" id="160">160</a>
+<a href="#161" id="161">161</a>
+<a href="#162" id="162">162</a>
+<a href="#163" id="163">163</a>
+<a href="#164" id="164">164</a>
+<a href="#165" id="165">165</a>
+<a href="#166" id="166">166</a>
+<a href="#167" id="167">167</a>
+<a href="#168" id="168">168</a>
+<a href="#169" id="169">169</a>
+<a href="#170" id="170">170</a>
+<a href="#171" id="171">171</a>
+<a href="#172" id="172">172</a>
+<a href="#173" id="173">173</a>
+<a href="#174" id="174">174</a>
+<a href="#175" id="175">175</a>
+<a href="#176" id="176">176</a>
+<a href="#177" id="177">177</a>
+<a href="#178" id="178">178</a>
+<a href="#179" id="179">179</a>
+<a href="#180" id="180">180</a>
+<a href="#181" id="181">181</a>
+<a href="#182" id="182">182</a>
+<a href="#183" id="183">183</a>
+<a href="#184" id="184">184</a>
+<a href="#185" id="185">185</a>
+<a href="#186" id="186">186</a>
+<a href="#187" id="187">187</a>
+<a href="#188" id="188">188</a>
+<a href="#189" id="189">189</a>
+<a href="#190" id="190">190</a>
+<a href="#191" id="191">191</a>
+<a href="#192" id="192">192</a>
+<a href="#193" id="193">193</a>
+<a href="#194" id="194">194</a>
+<a href="#195" id="195">195</a>
+<a href="#196" id="196">196</a>
+<a href="#197" id="197">197</a>
+<a href="#198" id="198">198</a>
+<a href="#199" id="199">199</a>
+<a href="#200" id="200">200</a>
+<a href="#201" id="201">201</a>
+<a href="#202" id="202">202</a>
+<a href="#203" id="203">203</a>
+<a href="#204" id="204">204</a>
+<a href="#205" id="205">205</a>
+<a href="#206" id="206">206</a>
+<a href="#207" id="207">207</a>
+<a href="#208" id="208">208</a>
+<a href="#209" id="209">209</a>
+<a href="#210" id="210">210</a>
+<a href="#211" id="211">211</a>
+<a href="#212" id="212">212</a>
+<a href="#213" id="213">213</a>
+<a href="#214" id="214">214</a>
+<a href="#215" id="215">215</a>
+<a href="#216" id="216">216</a>
+<a href="#217" id="217">217</a>
+<a href="#218" id="218">218</a>
+<a href="#219" id="219">219</a>
+<a href="#220" id="220">220</a>
+<a href="#221" id="221">221</a>
+<a href="#222" id="222">222</a>
+<a href="#223" id="223">223</a>
+<a href="#224" id="224">224</a>
+<a href="#225" id="225">225</a>
+<a href="#226" id="226">226</a>
+<a href="#227" id="227">227</a>
+<a href="#228" id="228">228</a>
+<a href="#229" id="229">229</a>
+<a href="#230" id="230">230</a>
+<a href="#231" id="231">231</a>
+<a href="#232" id="232">232</a>
+<a href="#233" id="233">233</a>
+<a href="#234" id="234">234</a>
+<a href="#235" id="235">235</a>
+<a href="#236" id="236">236</a>
+<a href="#237" id="237">237</a>
+<a href="#238" id="238">238</a>
+<a href="#239" id="239">239</a>
+<a href="#240" id="240">240</a>
+<a href="#241" id="241">241</a>
+<a href="#242" id="242">242</a>
+<a href="#243" id="243">243</a>
+<a href="#244" id="244">244</a>
+<a href="#245" id="245">245</a>
+<a href="#246" id="246">246</a>
+<a href="#247" id="247">247</a>
+<a href="#248" id="248">248</a>
+<a href="#249" id="249">249</a>
+<a href="#250" id="250">250</a>
+<a href="#251" id="251">251</a>
+<a href="#252" id="252">252</a>
+<a href="#253" id="253">253</a>
+<a href="#254" id="254">254</a>
+<a href="#255" id="255">255</a>
+<a href="#256" id="256">256</a>
+<a href="#257" id="257">257</a>
+<a href="#258" id="258">258</a>
+<a href="#259" id="259">259</a>
+<a href="#260" id="260">260</a>
+<a href="#261" id="261">261</a>
+<a href="#262" id="262">262</a>
+<a href="#263" id="263">263</a>
+<a href="#264" id="264">264</a>
+<a href="#265" id="265">265</a>
+<a href="#266" id="266">266</a>
+<a href="#267" id="267">267</a>
+<a href="#268" id="268">268</a>
+<a href="#269" id="269">269</a>
+<a href="#270" id="270">270</a>
+<a href="#271" id="271">271</a>
+<a href="#272" id="272">272</a>
+<a href="#273" id="273">273</a>
+<a href="#274" id="274">274</a>
+<a href="#275" id="275">275</a>
+<a href="#276" id="276">276</a>
+<a href="#277" id="277">277</a>
+<a href="#278" id="278">278</a>
+<a href="#279" id="279">279</a>
+<a href="#280" id="280">280</a>
+<a href="#281" id="281">281</a>
+<a href="#282" id="282">282</a>
+<a href="#283" id="283">283</a>
+<a href="#284" id="284">284</a>
+<a href="#285" id="285">285</a>
+<a href="#286" id="286">286</a>
+<a href="#287" id="287">287</a>
+<a href="#288" id="288">288</a>
+<a href="#289" id="289">289</a>
+<a href="#290" id="290">290</a>
+<a href="#291" id="291">291</a>
+<a href="#292" id="292">292</a>
+<a href="#293" id="293">293</a>
+<a href="#294" id="294">294</a>
+<a href="#295" id="295">295</a>
+<a href="#296" id="296">296</a>
+<a href="#297" id="297">297</a>
+<a href="#298" id="298">298</a>
+<a href="#299" id="299">299</a>
+<a href="#300" id="300">300</a>
+<a href="#301" id="301">301</a>
+<a href="#302" id="302">302</a>
+<a href="#303" id="303">303</a>
+<a href="#304" id="304">304</a>
+<a href="#305" id="305">305</a>
+<a href="#306" id="306">306</a>
+<a href="#307" id="307">307</a>
+<a href="#308" id="308">308</a>
+<a href="#309" id="309">309</a>
+<a href="#310" id="310">310</a>
+<a href="#311" id="311">311</a>
+<a href="#312" id="312">312</a>
+<a href="#313" id="313">313</a>
+<a href="#314" id="314">314</a>
+<a href="#315" id="315">315</a>
+<a href="#316" id="316">316</a>
+<a href="#317" id="317">317</a>
+<a href="#318" id="318">318</a>
+<a href="#319" id="319">319</a>
+<a href="#320" id="320">320</a>
+<a href="#321" id="321">321</a>
+<a href="#322" id="322">322</a>
+<a href="#323" id="323">323</a>
+<a href="#324" id="324">324</a>
+<a href="#325" id="325">325</a>
+<a href="#326" id="326">326</a>
+<a href="#327" id="327">327</a>
+<a href="#328" id="328">328</a>
+<a href="#329" id="329">329</a>
+<a href="#330" id="330">330</a>
+<a href="#331" id="331">331</a>
+<a href="#332" id="332">332</a>
+<a href="#333" id="333">333</a>
+<a href="#334" id="334">334</a>
+<a href="#335" id="335">335</a>
+<a href="#336" id="336">336</a>
+<a href="#337" id="337">337</a>
+<a href="#338" id="338">338</a>
+<a href="#339" id="339">339</a>
+<a href="#340" id="340">340</a>
+<a href="#341" id="341">341</a>
+<a href="#342" id="342">342</a>
+<a href="#343" id="343">343</a>
+<a href="#344" id="344">344</a>
+<a href="#345" id="345">345</a>
+<a href="#346" id="346">346</a>
+<a href="#347" id="347">347</a>
+<a href="#348" id="348">348</a>
+<a href="#349" id="349">349</a>
+<a href="#350" id="350">350</a>
+<a href="#351" id="351">351</a>
+<a href="#352" id="352">352</a>
+</pre></div><pre class="rust"><code><span class="comment">// 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.
+
+</span><span class="kw">use </span>std::collections::HashMap;
+<span class="kw">use </span>std::io::{Read, Write};
+<span class="kw">use </span>std::str::FromStr;
+
+<span class="kw">use </span>apache_avro::{from_value, to_value, Reader <span class="kw">as </span>AvroReader, Writer <span class="kw">as </span>AvroWriter};
+<span class="kw">use </span>serde_derive::{Deserialize, Serialize};
+<span class="kw">use </span>serde_with::{DeserializeFromStr, SerializeDisplay};
+
+<span class="kw">use </span><span class="kw">super</span>::_serde::DataFileSerde;
+<span class="kw">use super</span>::{data_file_schema_v1, data_file_schema_v2, Datum, FormatVersion, Schema};
+<span class="kw">use </span><span class="kw">crate</span>::error::Result;
+<span class="kw">use </span><span class="kw">crate</span>::spec::{Struct, StructType};
+<span class="kw">use crate</span>::{Error, ErrorKind};
+
+<span class="doccomment">/// Data file carries data file path, partition tuple, metrics, …
+</span><span class="attr">#[derive(Debug, PartialEq, Clone, Eq, Builder)]
+</span><span class="kw">pub struct </span>DataFile {
+ <span class="doccomment">/// field id: 134
+ ///
+ /// Type of content stored by the data file: data, equality deletes,
+ /// or position deletes (all v1 files are data files)
+ </span><span class="kw">pub</span>(<span class="kw">crate</span>) content: DataContentType,
+ <span class="doccomment">/// field id: 100
+ ///
+ /// Full URI for the file with FS scheme
+ </span><span class="kw">pub</span>(<span class="kw">crate</span>) file_path: String,
+ <span class="doccomment">/// field id: 101
+ ///
+ /// String file format name, avro, orc or parquet
+ </span><span class="kw">pub</span>(<span class="kw">crate</span>) file_format: DataFileFormat,
+ <span class="doccomment">/// field id: 102
+ ///
+ /// Partition data tuple, schema based on the partition spec output using
+ /// partition field ids for the struct field ids
+ </span><span class="kw">pub</span>(<span class="kw">crate</span>) partition: Struct,
+ <span class="doccomment">/// field id: 103
+ ///
+ /// Number of records in this file
+ </span><span class="kw">pub</span>(<span class="kw">crate</span>) record_count: u64,
+ <span class="doccomment">/// field id: 104
+ ///
+ /// Total file size in bytes
+ </span><span class="kw">pub</span>(<span class="kw">crate</span>) file_size_in_bytes: u64,
+ <span class="doccomment">/// field id: 108
+ /// key field id: 117
+ /// value field id: 118
+ ///
+ /// Map from column id to the total size on disk of all regions that
+ /// store the column. Does not include bytes necessary to read other
+ /// columns, like footers. Leave null for row-oriented formats (Avro)
+ </span><span class="attr">#[builder(default)]
+ </span><span class="kw">pub</span>(<span class="kw">crate</span>) column_sizes: HashMap<i32, u64>,
+ <span class="doccomment">/// field id: 109
+ /// key field id: 119
+ /// value field id: 120
+ ///
+ /// Map from column id to number of values in the column (including null
+ /// and NaN values)
+ </span><span class="attr">#[builder(default)]
+ </span><span class="kw">pub</span>(<span class="kw">crate</span>) value_counts: HashMap<i32, u64>,
+ <span class="doccomment">/// field id: 110
+ /// key field id: 121
+ /// value field id: 122
+ ///
+ /// Map from column id to number of null values in the column
+ </span><span class="attr">#[builder(default)]
+ </span><span class="kw">pub</span>(<span class="kw">crate</span>) null_value_counts: HashMap<i32, u64>,
+ <span class="doccomment">/// field id: 137
+ /// key field id: 138
+ /// value field id: 139
+ ///
+ /// Map from column id to number of NaN values in the column
+ </span><span class="attr">#[builder(default)]
+ </span><span class="kw">pub</span>(<span class="kw">crate</span>) nan_value_counts: HashMap<i32, u64>,
+ <span class="doccomment">/// field id: 125
+ /// key field id: 126
+ /// value field id: 127
+ ///
+ /// Map from column id to lower bound in the column serialized as binary.
+ /// Each value must be less than or equal to all non-null, non-NaN values
+ /// in the column for the file.
+ ///
+ /// Reference:
+ ///
+ /// - [Binary single-value serialization](https://iceberg.apache.org/spec/#binary-single-value-serialization)
+ </span><span class="attr">#[builder(default)]
+ </span><span class="kw">pub</span>(<span class="kw">crate</span>) lower_bounds: HashMap<i32, Datum>,
+ <span class="doccomment">/// field id: 128
+ /// key field id: 129
+ /// value field id: 130
+ ///
+ /// Map from column id to upper bound in the column serialized as binary.
+ /// Each value must be greater than or equal to all non-null, non-Nan
+ /// values in the column for the file.
+ ///
+ /// Reference:
+ ///
+ /// - [Binary single-value serialization](https://iceberg.apache.org/spec/#binary-single-value-serialization)
+ </span><span class="attr">#[builder(default)]
+ </span><span class="kw">pub</span>(<span class="kw">crate</span>) upper_bounds: HashMap<i32, Datum>,
+ <span class="doccomment">/// field id: 131
+ ///
+ /// Implementation-specific key metadata for encryption
+ </span><span class="attr">#[builder(default)]
+ </span><span class="kw">pub</span>(<span class="kw">crate</span>) key_metadata: <span class="prelude-ty">Option</span><Vec<u8>>,
+ <span class="doccomment">/// field id: 132
+ /// element field id: 133
+ ///
+ /// Split offsets for the data file. For example, all row group offsets
+ /// in a Parquet file. Must be sorted ascending
+ </span><span class="attr">#[builder(default)]
+ </span><span class="kw">pub</span>(<span class="kw">crate</span>) split_offsets: Vec<i64>,
+ <span class="doccomment">/// field id: 135
+ /// element field id: 136
+ ///
+ /// Field ids used to determine row equality in equality delete files.
+ /// Required when content is EqualityDeletes and should be null
+ /// otherwise. Fields with ids listed in this column must be present
+ /// in the delete file
+ </span><span class="attr">#[builder(default)]
+ </span><span class="kw">pub</span>(<span class="kw">crate</span>) equality_ids: Vec<i32>,
+ <span class="doccomment">/// field id: 140
+ ///
+ /// ID representing sort order for this file.
+ ///
+ /// If sort order ID is missing or unknown, then the order is assumed to
+ /// be unsorted. Only data files and equality delete files should be
+ /// written with a non-null order id. Position deletes are required to be
+ /// sorted by file and position, not a table order, and should set sort
+ /// order id to null. Readers must ignore sort order id for position
+ /// delete files.
+ </span><span class="attr">#[builder(default, setter(strip_option))]
+ </span><span class="kw">pub</span>(<span class="kw">crate</span>) sort_order_id: <span class="prelude-ty">Option</span><i32>,
+ <span class="doccomment">/// This field is not included in spec. It is just store in memory representation used
+ /// in process.
+ </span><span class="kw">pub</span>(<span class="kw">crate</span>) partition_spec_id: i32,
+}
+
+<span class="kw">impl </span>DataFile {
+ <span class="doccomment">/// Get the content type of the data file (data, equality deletes, or position deletes)
+ </span><span class="kw">pub fn </span>content_type(<span class="kw-2">&</span><span class="self">self</span>) -> DataContentType {
+ <span class="self">self</span>.content
+ }
+ <span class="doccomment">/// Get the file path as full URI with FS scheme
+ </span><span class="kw">pub fn </span>file_path(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>str {
+ <span class="kw-2">&</span><span class="self">self</span>.file_path
+ }
+ <span class="doccomment">/// Get the file format of the file (avro, orc or parquet).
+ </span><span class="kw">pub fn </span>file_format(<span class="kw-2">&</span><span class="self">self</span>) -> DataFileFormat {
+ <span class="self">self</span>.file_format
+ }
+ <span class="doccomment">/// Get the partition values of the file.
+ </span><span class="kw">pub fn </span>partition(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>Struct {
+ <span class="kw-2">&</span><span class="self">self</span>.partition
+ }
+ <span class="doccomment">/// Get the record count in the data file.
+ </span><span class="kw">pub fn </span>record_count(<span class="kw-2">&</span><span class="self">self</span>) -> u64 {
+ <span class="self">self</span>.record_count
+ }
+ <span class="doccomment">/// Get the file size in bytes.
+ </span><span class="kw">pub fn </span>file_size_in_bytes(<span class="kw-2">&</span><span class="self">self</span>) -> u64 {
+ <span class="self">self</span>.file_size_in_bytes
+ }
+ <span class="doccomment">/// Get the column sizes.
+ /// Map from column id to the total size on disk of all regions that
+ /// store the column. Does not include bytes necessary to read other
+ /// columns, like footers. Null for row-oriented formats (Avro)
+ </span><span class="kw">pub fn </span>column_sizes(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>HashMap<i32, u64> {
+ <span class="kw-2">&</span><span class="self">self</span>.column_sizes
+ }
+ <span class="doccomment">/// Get the columns value counts for the data file.
+ /// Map from column id to number of values in the column (including null
+ /// and NaN values)
+ </span><span class="kw">pub fn </span>value_counts(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>HashMap<i32, u64> {
+ <span class="kw-2">&</span><span class="self">self</span>.value_counts
+ }
+ <span class="doccomment">/// Get the null value counts of the data file.
+ /// Map from column id to number of null values in the column
+ </span><span class="kw">pub fn </span>null_value_counts(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>HashMap<i32, u64> {
+ <span class="kw-2">&</span><span class="self">self</span>.null_value_counts
+ }
+ <span class="doccomment">/// Get the nan value counts of the data file.
+ /// Map from column id to number of NaN values in the column
+ </span><span class="kw">pub fn </span>nan_value_counts(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>HashMap<i32, u64> {
+ <span class="kw-2">&</span><span class="self">self</span>.nan_value_counts
+ }
+ <span class="doccomment">/// Get the lower bounds of the data file values per column.
+ /// Map from column id to lower bound in the column serialized as binary.
+ </span><span class="kw">pub fn </span>lower_bounds(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>HashMap<i32, Datum> {
+ <span class="kw-2">&</span><span class="self">self</span>.lower_bounds
+ }
+ <span class="doccomment">/// Get the upper bounds of the data file values per column.
+ /// Map from column id to upper bound in the column serialized as binary.
+ </span><span class="kw">pub fn </span>upper_bounds(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>HashMap<i32, Datum> {
+ <span class="kw-2">&</span><span class="self">self</span>.upper_bounds
+ }
+ <span class="doccomment">/// Get the Implementation-specific key metadata for the data file.
+ </span><span class="kw">pub fn </span>key_metadata(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="prelude-ty">Option</span><<span class="kw-2">&</span>[u8]> {
+ <span class="self">self</span>.key_metadata.as_deref()
+ }
+ <span class="doccomment">/// Get the split offsets of the data file.
+ /// For example, all row group offsets in a Parquet file.
+ </span><span class="kw">pub fn </span>split_offsets(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>[i64] {
+ <span class="kw-2">&</span><span class="self">self</span>.split_offsets
+ }
+ <span class="doccomment">/// Get the equality ids of the data file.
+ /// Field ids used to determine row equality in equality delete files.
+ /// null when content is not EqualityDeletes.
+ </span><span class="kw">pub fn </span>equality_ids(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>[i32] {
+ <span class="kw-2">&</span><span class="self">self</span>.equality_ids
+ }
+ <span class="doccomment">/// Get the sort order id of the data file.
+ /// Only data files and equality delete files should be
+ /// written with a non-null order id. Position deletes are required to be
+ /// sorted by file and position, not a table order, and should set sort
+ /// order id to null. Readers must ignore sort order id for position
+ /// delete files.
+ </span><span class="kw">pub fn </span>sort_order_id(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="prelude-ty">Option</span><i32> {
+ <span class="self">self</span>.sort_order_id
+ }
+}
+
+<span class="doccomment">/// Convert data files to avro bytes and write to writer.
+/// Return the bytes written.
+</span><span class="kw">pub fn </span>write_data_files_to_avro<W: Write>(
+ writer: <span class="kw-2">&mut </span>W,
+ data_files: <span class="kw">impl </span>IntoIterator<Item = DataFile>,
+ partition_type: <span class="kw-2">&</span>StructType,
+ version: FormatVersion,
+) -> <span class="prelude-ty">Result</span><usize> {
+ <span class="kw">let </span>avro_schema = <span class="kw">match </span>version {
+ FormatVersion::V1 => data_file_schema_v1(partition_type).unwrap(),
+ FormatVersion::V2 => data_file_schema_v2(partition_type).unwrap(),
+ };
+ <span class="kw">let </span><span class="kw-2">mut </span>writer = AvroWriter::new(<span class="kw-2">&</span>avro_schema, writer);
+
+ <span class="kw">for </span>data_file <span class="kw">in </span>data_files {
+ <span class="kw">let </span>value = to_value(DataFileSerde::try_from(data_file, partition_type, <span class="bool-val">true</span>)<span class="question-mark">?</span>)<span class="question-mark">?
+ </span>.resolve(<span class="kw-2">&</span>avro_schema)<span class="question-mark">?</span>;
+ writer.append(value)<span class="question-mark">?</span>;
+ }
+
+ <span class="prelude-val">Ok</span>(writer.flush()<span class="question-mark">?</span>)
+}
+
+<span class="doccomment">/// Parse data files from avro bytes.
+</span><span class="kw">pub fn </span>read_data_files_from_avro<R: Read>(
+ reader: <span class="kw-2">&mut </span>R,
+ schema: <span class="kw-2">&</span>Schema,
+ partition_spec_id: i32,
+ partition_type: <span class="kw-2">&</span>StructType,
+ version: FormatVersion,
+) -> <span class="prelude-ty">Result</span><Vec<DataFile>> {
+ <span class="kw">let </span>avro_schema = <span class="kw">match </span>version {
+ FormatVersion::V1 => data_file_schema_v1(partition_type).unwrap(),
+ FormatVersion::V2 => data_file_schema_v2(partition_type).unwrap(),
+ };
+
+ <span class="kw">let </span>reader = AvroReader::with_schema(<span class="kw-2">&</span>avro_schema, reader)<span class="question-mark">?</span>;
+ reader
+ .into_iter()
+ .map(|value| {
+ from_value::<DataFileSerde>(<span class="kw-2">&</span>value<span class="question-mark">?</span>)<span class="question-mark">?</span>.try_into(
+ partition_spec_id,
+ partition_type,
+ schema,
+ )
+ })
+ .collect::<<span class="prelude-ty">Result</span><Vec<<span class="kw">_</span>>>>()
+}
+
+<span class="doccomment">/// Type of content stored by the data file: data, equality deletes, or
+/// position deletes (all v1 files are data files)
+</span><span class="attr">#[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize, Deserialize)]
+</span><span class="kw">pub enum </span>DataContentType {
+ <span class="doccomment">/// value: 0
+ </span>Data = <span class="number">0</span>,
+ <span class="doccomment">/// value: 1
+ </span>PositionDeletes = <span class="number">1</span>,
+ <span class="doccomment">/// value: 2
+ </span>EqualityDeletes = <span class="number">2</span>,
+}
+
+<span class="kw">impl </span>TryFrom<i32> <span class="kw">for </span>DataContentType {
+ <span class="kw">type </span>Error = Error;
+
+ <span class="kw">fn </span>try_from(v: i32) -> <span class="prelude-ty">Result</span><DataContentType> {
+ <span class="kw">match </span>v {
+ <span class="number">0 </span>=> <span class="prelude-val">Ok</span>(DataContentType::Data),
+ <span class="number">1 </span>=> <span class="prelude-val">Ok</span>(DataContentType::PositionDeletes),
+ <span class="number">2 </span>=> <span class="prelude-val">Ok</span>(DataContentType::EqualityDeletes),
+ <span class="kw">_ </span>=> <span class="prelude-val">Err</span>(Error::new(
+ ErrorKind::DataInvalid,
+ <span class="macro">format!</span>(<span class="string">"data content type {} is invalid"</span>, v),
+ )),
+ }
+ }
+}
+
+<span class="doccomment">/// Format of this data.
+</span><span class="attr">#[derive(Debug, PartialEq, Eq, Clone, Copy, SerializeDisplay, DeserializeFromStr)]
+</span><span class="kw">pub enum </span>DataFileFormat {
+ <span class="doccomment">/// Avro file format: <https://avro.apache.org/>
+ </span>Avro,
+ <span class="doccomment">/// Orc file format: <https://orc.apache.org/>
+ </span>Orc,
+ <span class="doccomment">/// Parquet file format: <https://parquet.apache.org/>
+ </span>Parquet,
+}
+
+<span class="kw">impl </span>FromStr <span class="kw">for </span>DataFileFormat {
+ <span class="kw">type </span><span class="prelude-val">Err </span>= Error;
+
+ <span class="kw">fn </span>from_str(s: <span class="kw-2">&</span>str) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
+ <span class="kw">match </span>s.to_lowercase().as_str() {
+ <span class="string">"avro" </span>=> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::Avro),
+ <span class="string">"orc" </span>=> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::Orc),
+ <span class="string">"parquet" </span>=> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::Parquet),
+ <span class="kw">_ </span>=> <span class="prelude-val">Err</span>(Error::new(
+ ErrorKind::DataInvalid,
+ <span class="macro">format!</span>(<span class="string">"Unsupported data file format: {}"</span>, s),
+ )),
+ }
+ }
+}
+
+<span class="kw">impl </span>std::fmt::Display <span class="kw">for </span>DataFileFormat {
+ <span class="kw">fn </span>fmt(<span class="kw-2">&</span><span class="self">self</span>, f: <span class="kw-2">&mut </span>std::fmt::Formatter<<span class="lifetime">'_</span>>) -> std::fmt::Result {
+ <span class="kw">match </span><span class="self">self </span>{
+ DataFileFormat::Avro => <span class="macro">write!</span>(f, <span class="string">"avro"</span>),
+ DataFileFormat::Orc => <span class="macro">write!</span>(f, <span class="string">"orc"</span>),
+ DataFileFormat::Parquet => <span class="macro">write!</span>(f, <span class="string">"parquet"</span>),
+ }
+ }
+}
+</code></pre></div></section></main></body></html>
\ No newline at end of file
diff --git a/api/src/iceberg/spec/manifest/entry.rs.html b/api/src/iceberg/spec/manifest/entry.rs.html
new file mode 100644
index 00000000..e0fd9170
--- /dev/null
+++ b/api/src/iceberg/spec/manifest/entry.rs.html
@@ -0,0 +1,1127 @@
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `crates/iceberg/src/spec/manifest/entry.rs`."><title>entry.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff2,FiraSa [...]
+<a href="#2" id="2">2</a>
+<a href="#3" id="3">3</a>
+<a href="#4" id="4">4</a>
+<a href="#5" id="5">5</a>
+<a href="#6" id="6">6</a>
+<a href="#7" id="7">7</a>
+<a href="#8" id="8">8</a>
+<a href="#9" id="9">9</a>
+<a href="#10" id="10">10</a>
+<a href="#11" id="11">11</a>
+<a href="#12" id="12">12</a>
+<a href="#13" id="13">13</a>
+<a href="#14" id="14">14</a>
+<a href="#15" id="15">15</a>
+<a href="#16" id="16">16</a>
+<a href="#17" id="17">17</a>
+<a href="#18" id="18">18</a>
+<a href="#19" id="19">19</a>
+<a href="#20" id="20">20</a>
+<a href="#21" id="21">21</a>
+<a href="#22" id="22">22</a>
+<a href="#23" id="23">23</a>
+<a href="#24" id="24">24</a>
+<a href="#25" id="25">25</a>
+<a href="#26" id="26">26</a>
+<a href="#27" id="27">27</a>
+<a href="#28" id="28">28</a>
+<a href="#29" id="29">29</a>
+<a href="#30" id="30">30</a>
+<a href="#31" id="31">31</a>
+<a href="#32" id="32">32</a>
+<a href="#33" id="33">33</a>
+<a href="#34" id="34">34</a>
+<a href="#35" id="35">35</a>
+<a href="#36" id="36">36</a>
+<a href="#37" id="37">37</a>
+<a href="#38" id="38">38</a>
+<a href="#39" id="39">39</a>
+<a href="#40" id="40">40</a>
+<a href="#41" id="41">41</a>
+<a href="#42" id="42">42</a>
+<a href="#43" id="43">43</a>
+<a href="#44" id="44">44</a>
+<a href="#45" id="45">45</a>
+<a href="#46" id="46">46</a>
+<a href="#47" id="47">47</a>
+<a href="#48" id="48">48</a>
+<a href="#49" id="49">49</a>
+<a href="#50" id="50">50</a>
+<a href="#51" id="51">51</a>
+<a href="#52" id="52">52</a>
+<a href="#53" id="53">53</a>
+<a href="#54" id="54">54</a>
+<a href="#55" id="55">55</a>
+<a href="#56" id="56">56</a>
+<a href="#57" id="57">57</a>
+<a href="#58" id="58">58</a>
+<a href="#59" id="59">59</a>
+<a href="#60" id="60">60</a>
+<a href="#61" id="61">61</a>
+<a href="#62" id="62">62</a>
+<a href="#63" id="63">63</a>
+<a href="#64" id="64">64</a>
+<a href="#65" id="65">65</a>
+<a href="#66" id="66">66</a>
+<a href="#67" id="67">67</a>
+<a href="#68" id="68">68</a>
+<a href="#69" id="69">69</a>
+<a href="#70" id="70">70</a>
+<a href="#71" id="71">71</a>
+<a href="#72" id="72">72</a>
+<a href="#73" id="73">73</a>
+<a href="#74" id="74">74</a>
+<a href="#75" id="75">75</a>
+<a href="#76" id="76">76</a>
+<a href="#77" id="77">77</a>
+<a href="#78" id="78">78</a>
+<a href="#79" id="79">79</a>
+<a href="#80" id="80">80</a>
+<a href="#81" id="81">81</a>
+<a href="#82" id="82">82</a>
+<a href="#83" id="83">83</a>
+<a href="#84" id="84">84</a>
+<a href="#85" id="85">85</a>
+<a href="#86" id="86">86</a>
+<a href="#87" id="87">87</a>
+<a href="#88" id="88">88</a>
+<a href="#89" id="89">89</a>
+<a href="#90" id="90">90</a>
+<a href="#91" id="91">91</a>
+<a href="#92" id="92">92</a>
+<a href="#93" id="93">93</a>
+<a href="#94" id="94">94</a>
+<a href="#95" id="95">95</a>
+<a href="#96" id="96">96</a>
+<a href="#97" id="97">97</a>
+<a href="#98" id="98">98</a>
+<a href="#99" id="99">99</a>
+<a href="#100" id="100">100</a>
+<a href="#101" id="101">101</a>
+<a href="#102" id="102">102</a>
+<a href="#103" id="103">103</a>
+<a href="#104" id="104">104</a>
+<a href="#105" id="105">105</a>
+<a href="#106" id="106">106</a>
+<a href="#107" id="107">107</a>
+<a href="#108" id="108">108</a>
+<a href="#109" id="109">109</a>
+<a href="#110" id="110">110</a>
+<a href="#111" id="111">111</a>
+<a href="#112" id="112">112</a>
+<a href="#113" id="113">113</a>
+<a href="#114" id="114">114</a>
+<a href="#115" id="115">115</a>
+<a href="#116" id="116">116</a>
+<a href="#117" id="117">117</a>
+<a href="#118" id="118">118</a>
+<a href="#119" id="119">119</a>
+<a href="#120" id="120">120</a>
+<a href="#121" id="121">121</a>
+<a href="#122" id="122">122</a>
+<a href="#123" id="123">123</a>
+<a href="#124" id="124">124</a>
+<a href="#125" id="125">125</a>
+<a href="#126" id="126">126</a>
+<a href="#127" id="127">127</a>
+<a href="#128" id="128">128</a>
+<a href="#129" id="129">129</a>
+<a href="#130" id="130">130</a>
+<a href="#131" id="131">131</a>
+<a href="#132" id="132">132</a>
+<a href="#133" id="133">133</a>
+<a href="#134" id="134">134</a>
+<a href="#135" id="135">135</a>
+<a href="#136" id="136">136</a>
+<a href="#137" id="137">137</a>
+<a href="#138" id="138">138</a>
+<a href="#139" id="139">139</a>
+<a href="#140" id="140">140</a>
+<a href="#141" id="141">141</a>
+<a href="#142" id="142">142</a>
+<a href="#143" id="143">143</a>
+<a href="#144" id="144">144</a>
+<a href="#145" id="145">145</a>
+<a href="#146" id="146">146</a>
+<a href="#147" id="147">147</a>
+<a href="#148" id="148">148</a>
+<a href="#149" id="149">149</a>
+<a href="#150" id="150">150</a>
+<a href="#151" id="151">151</a>
+<a href="#152" id="152">152</a>
+<a href="#153" id="153">153</a>
+<a href="#154" id="154">154</a>
+<a href="#155" id="155">155</a>
+<a href="#156" id="156">156</a>
+<a href="#157" id="157">157</a>
+<a href="#158" id="158">158</a>
+<a href="#159" id="159">159</a>
+<a href="#160" id="160">160</a>
+<a href="#161" id="161">161</a>
+<a href="#162" id="162">162</a>
+<a href="#163" id="163">163</a>
+<a href="#164" id="164">164</a>
+<a href="#165" id="165">165</a>
+<a href="#166" id="166">166</a>
+<a href="#167" id="167">167</a>
+<a href="#168" id="168">168</a>
+<a href="#169" id="169">169</a>
+<a href="#170" id="170">170</a>
+<a href="#171" id="171">171</a>
+<a href="#172" id="172">172</a>
+<a href="#173" id="173">173</a>
+<a href="#174" id="174">174</a>
+<a href="#175" id="175">175</a>
+<a href="#176" id="176">176</a>
+<a href="#177" id="177">177</a>
+<a href="#178" id="178">178</a>
+<a href="#179" id="179">179</a>
+<a href="#180" id="180">180</a>
+<a href="#181" id="181">181</a>
+<a href="#182" id="182">182</a>
+<a href="#183" id="183">183</a>
+<a href="#184" id="184">184</a>
+<a href="#185" id="185">185</a>
+<a href="#186" id="186">186</a>
+<a href="#187" id="187">187</a>
+<a href="#188" id="188">188</a>
+<a href="#189" id="189">189</a>
+<a href="#190" id="190">190</a>
+<a href="#191" id="191">191</a>
+<a href="#192" id="192">192</a>
+<a href="#193" id="193">193</a>
+<a href="#194" id="194">194</a>
+<a href="#195" id="195">195</a>
+<a href="#196" id="196">196</a>
+<a href="#197" id="197">197</a>
+<a href="#198" id="198">198</a>
+<a href="#199" id="199">199</a>
+<a href="#200" id="200">200</a>
+<a href="#201" id="201">201</a>
+<a href="#202" id="202">202</a>
+<a href="#203" id="203">203</a>
+<a href="#204" id="204">204</a>
+<a href="#205" id="205">205</a>
+<a href="#206" id="206">206</a>
+<a href="#207" id="207">207</a>
+<a href="#208" id="208">208</a>
+<a href="#209" id="209">209</a>
+<a href="#210" id="210">210</a>
+<a href="#211" id="211">211</a>
+<a href="#212" id="212">212</a>
+<a href="#213" id="213">213</a>
+<a href="#214" id="214">214</a>
+<a href="#215" id="215">215</a>
+<a href="#216" id="216">216</a>
+<a href="#217" id="217">217</a>
+<a href="#218" id="218">218</a>
+<a href="#219" id="219">219</a>
+<a href="#220" id="220">220</a>
+<a href="#221" id="221">221</a>
+<a href="#222" id="222">222</a>
+<a href="#223" id="223">223</a>
+<a href="#224" id="224">224</a>
+<a href="#225" id="225">225</a>
+<a href="#226" id="226">226</a>
+<a href="#227" id="227">227</a>
+<a href="#228" id="228">228</a>
+<a href="#229" id="229">229</a>
+<a href="#230" id="230">230</a>
+<a href="#231" id="231">231</a>
+<a href="#232" id="232">232</a>
+<a href="#233" id="233">233</a>
+<a href="#234" id="234">234</a>
+<a href="#235" id="235">235</a>
+<a href="#236" id="236">236</a>
+<a href="#237" id="237">237</a>
+<a href="#238" id="238">238</a>
+<a href="#239" id="239">239</a>
+<a href="#240" id="240">240</a>
+<a href="#241" id="241">241</a>
+<a href="#242" id="242">242</a>
+<a href="#243" id="243">243</a>
+<a href="#244" id="244">244</a>
+<a href="#245" id="245">245</a>
+<a href="#246" id="246">246</a>
+<a href="#247" id="247">247</a>
+<a href="#248" id="248">248</a>
+<a href="#249" id="249">249</a>
+<a href="#250" id="250">250</a>
+<a href="#251" id="251">251</a>
+<a href="#252" id="252">252</a>
+<a href="#253" id="253">253</a>
+<a href="#254" id="254">254</a>
+<a href="#255" id="255">255</a>
+<a href="#256" id="256">256</a>
+<a href="#257" id="257">257</a>
+<a href="#258" id="258">258</a>
+<a href="#259" id="259">259</a>
+<a href="#260" id="260">260</a>
+<a href="#261" id="261">261</a>
+<a href="#262" id="262">262</a>
+<a href="#263" id="263">263</a>
+<a href="#264" id="264">264</a>
+<a href="#265" id="265">265</a>
+<a href="#266" id="266">266</a>
+<a href="#267" id="267">267</a>
+<a href="#268" id="268">268</a>
+<a href="#269" id="269">269</a>
+<a href="#270" id="270">270</a>
+<a href="#271" id="271">271</a>
+<a href="#272" id="272">272</a>
+<a href="#273" id="273">273</a>
+<a href="#274" id="274">274</a>
+<a href="#275" id="275">275</a>
+<a href="#276" id="276">276</a>
+<a href="#277" id="277">277</a>
+<a href="#278" id="278">278</a>
+<a href="#279" id="279">279</a>
+<a href="#280" id="280">280</a>
+<a href="#281" id="281">281</a>
+<a href="#282" id="282">282</a>
+<a href="#283" id="283">283</a>
+<a href="#284" id="284">284</a>
+<a href="#285" id="285">285</a>
+<a href="#286" id="286">286</a>
+<a href="#287" id="287">287</a>
+<a href="#288" id="288">288</a>
+<a href="#289" id="289">289</a>
+<a href="#290" id="290">290</a>
+<a href="#291" id="291">291</a>
+<a href="#292" id="292">292</a>
+<a href="#293" id="293">293</a>
+<a href="#294" id="294">294</a>
+<a href="#295" id="295">295</a>
+<a href="#296" id="296">296</a>
+<a href="#297" id="297">297</a>
+<a href="#298" id="298">298</a>
+<a href="#299" id="299">299</a>
+<a href="#300" id="300">300</a>
+<a href="#301" id="301">301</a>
+<a href="#302" id="302">302</a>
+<a href="#303" id="303">303</a>
+<a href="#304" id="304">304</a>
+<a href="#305" id="305">305</a>
+<a href="#306" id="306">306</a>
+<a href="#307" id="307">307</a>
+<a href="#308" id="308">308</a>
+<a href="#309" id="309">309</a>
+<a href="#310" id="310">310</a>
+<a href="#311" id="311">311</a>
+<a href="#312" id="312">312</a>
+<a href="#313" id="313">313</a>
+<a href="#314" id="314">314</a>
+<a href="#315" id="315">315</a>
+<a href="#316" id="316">316</a>
+<a href="#317" id="317">317</a>
+<a href="#318" id="318">318</a>
+<a href="#319" id="319">319</a>
+<a href="#320" id="320">320</a>
+<a href="#321" id="321">321</a>
+<a href="#322" id="322">322</a>
+<a href="#323" id="323">323</a>
+<a href="#324" id="324">324</a>
+<a href="#325" id="325">325</a>
+<a href="#326" id="326">326</a>
+<a href="#327" id="327">327</a>
+<a href="#328" id="328">328</a>
+<a href="#329" id="329">329</a>
+<a href="#330" id="330">330</a>
+<a href="#331" id="331">331</a>
+<a href="#332" id="332">332</a>
+<a href="#333" id="333">333</a>
+<a href="#334" id="334">334</a>
+<a href="#335" id="335">335</a>
+<a href="#336" id="336">336</a>
+<a href="#337" id="337">337</a>
+<a href="#338" id="338">338</a>
+<a href="#339" id="339">339</a>
+<a href="#340" id="340">340</a>
+<a href="#341" id="341">341</a>
+<a href="#342" id="342">342</a>
+<a href="#343" id="343">343</a>
+<a href="#344" id="344">344</a>
+<a href="#345" id="345">345</a>
+<a href="#346" id="346">346</a>
+<a href="#347" id="347">347</a>
+<a href="#348" id="348">348</a>
+<a href="#349" id="349">349</a>
+<a href="#350" id="350">350</a>
+<a href="#351" id="351">351</a>
+<a href="#352" id="352">352</a>
+<a href="#353" id="353">353</a>
+<a href="#354" id="354">354</a>
+<a href="#355" id="355">355</a>
+<a href="#356" id="356">356</a>
+<a href="#357" id="357">357</a>
+<a href="#358" id="358">358</a>
+<a href="#359" id="359">359</a>
+<a href="#360" id="360">360</a>
+<a href="#361" id="361">361</a>
+<a href="#362" id="362">362</a>
+<a href="#363" id="363">363</a>
+<a href="#364" id="364">364</a>
+<a href="#365" id="365">365</a>
+<a href="#366" id="366">366</a>
+<a href="#367" id="367">367</a>
+<a href="#368" id="368">368</a>
+<a href="#369" id="369">369</a>
+<a href="#370" id="370">370</a>
+<a href="#371" id="371">371</a>
+<a href="#372" id="372">372</a>
+<a href="#373" id="373">373</a>
+<a href="#374" id="374">374</a>
+<a href="#375" id="375">375</a>
+<a href="#376" id="376">376</a>
+<a href="#377" id="377">377</a>
+<a href="#378" id="378">378</a>
+<a href="#379" id="379">379</a>
+<a href="#380" id="380">380</a>
+<a href="#381" id="381">381</a>
+<a href="#382" id="382">382</a>
+<a href="#383" id="383">383</a>
+<a href="#384" id="384">384</a>
+<a href="#385" id="385">385</a>
+<a href="#386" id="386">386</a>
+<a href="#387" id="387">387</a>
+<a href="#388" id="388">388</a>
+<a href="#389" id="389">389</a>
+<a href="#390" id="390">390</a>
+<a href="#391" id="391">391</a>
+<a href="#392" id="392">392</a>
+<a href="#393" id="393">393</a>
+<a href="#394" id="394">394</a>
+<a href="#395" id="395">395</a>
+<a href="#396" id="396">396</a>
+<a href="#397" id="397">397</a>
+<a href="#398" id="398">398</a>
+<a href="#399" id="399">399</a>
+<a href="#400" id="400">400</a>
+<a href="#401" id="401">401</a>
+<a href="#402" id="402">402</a>
+<a href="#403" id="403">403</a>
+<a href="#404" id="404">404</a>
+<a href="#405" id="405">405</a>
+<a href="#406" id="406">406</a>
+<a href="#407" id="407">407</a>
+<a href="#408" id="408">408</a>
+<a href="#409" id="409">409</a>
+<a href="#410" id="410">410</a>
+<a href="#411" id="411">411</a>
+<a href="#412" id="412">412</a>
+<a href="#413" id="413">413</a>
+<a href="#414" id="414">414</a>
+<a href="#415" id="415">415</a>
+<a href="#416" id="416">416</a>
+<a href="#417" id="417">417</a>
+<a href="#418" id="418">418</a>
+<a href="#419" id="419">419</a>
+<a href="#420" id="420">420</a>
+<a href="#421" id="421">421</a>
+<a href="#422" id="422">422</a>
+<a href="#423" id="423">423</a>
+<a href="#424" id="424">424</a>
+<a href="#425" id="425">425</a>
+<a href="#426" id="426">426</a>
+<a href="#427" id="427">427</a>
+<a href="#428" id="428">428</a>
+<a href="#429" id="429">429</a>
+<a href="#430" id="430">430</a>
+<a href="#431" id="431">431</a>
+<a href="#432" id="432">432</a>
+<a href="#433" id="433">433</a>
+<a href="#434" id="434">434</a>
+<a href="#435" id="435">435</a>
+<a href="#436" id="436">436</a>
+<a href="#437" id="437">437</a>
+<a href="#438" id="438">438</a>
+<a href="#439" id="439">439</a>
+<a href="#440" id="440">440</a>
+<a href="#441" id="441">441</a>
+<a href="#442" id="442">442</a>
+<a href="#443" id="443">443</a>
+<a href="#444" id="444">444</a>
+<a href="#445" id="445">445</a>
+<a href="#446" id="446">446</a>
+<a href="#447" id="447">447</a>
+<a href="#448" id="448">448</a>
+<a href="#449" id="449">449</a>
+<a href="#450" id="450">450</a>
+<a href="#451" id="451">451</a>
+<a href="#452" id="452">452</a>
+<a href="#453" id="453">453</a>
+<a href="#454" id="454">454</a>
+<a href="#455" id="455">455</a>
+<a href="#456" id="456">456</a>
+<a href="#457" id="457">457</a>
+<a href="#458" id="458">458</a>
+<a href="#459" id="459">459</a>
+<a href="#460" id="460">460</a>
+<a href="#461" id="461">461</a>
+<a href="#462" id="462">462</a>
+<a href="#463" id="463">463</a>
+<a href="#464" id="464">464</a>
+<a href="#465" id="465">465</a>
+<a href="#466" id="466">466</a>
+<a href="#467" id="467">467</a>
+<a href="#468" id="468">468</a>
+<a href="#469" id="469">469</a>
+<a href="#470" id="470">470</a>
+<a href="#471" id="471">471</a>
+<a href="#472" id="472">472</a>
+<a href="#473" id="473">473</a>
+<a href="#474" id="474">474</a>
+<a href="#475" id="475">475</a>
+<a href="#476" id="476">476</a>
+<a href="#477" id="477">477</a>
+<a href="#478" id="478">478</a>
+<a href="#479" id="479">479</a>
+<a href="#480" id="480">480</a>
+<a href="#481" id="481">481</a>
+<a href="#482" id="482">482</a>
+<a href="#483" id="483">483</a>
+<a href="#484" id="484">484</a>
+<a href="#485" id="485">485</a>
+<a href="#486" id="486">486</a>
+<a href="#487" id="487">487</a>
+<a href="#488" id="488">488</a>
+<a href="#489" id="489">489</a>
+<a href="#490" id="490">490</a>
+<a href="#491" id="491">491</a>
+<a href="#492" id="492">492</a>
+<a href="#493" id="493">493</a>
+<a href="#494" id="494">494</a>
+<a href="#495" id="495">495</a>
+<a href="#496" id="496">496</a>
+<a href="#497" id="497">497</a>
+<a href="#498" id="498">498</a>
+<a href="#499" id="499">499</a>
+<a href="#500" id="500">500</a>
+<a href="#501" id="501">501</a>
+<a href="#502" id="502">502</a>
+<a href="#503" id="503">503</a>
+<a href="#504" id="504">504</a>
+<a href="#505" id="505">505</a>
+<a href="#506" id="506">506</a>
+<a href="#507" id="507">507</a>
+<a href="#508" id="508">508</a>
+<a href="#509" id="509">509</a>
+<a href="#510" id="510">510</a>
+<a href="#511" id="511">511</a>
+<a href="#512" id="512">512</a>
+<a href="#513" id="513">513</a>
+<a href="#514" id="514">514</a>
+<a href="#515" id="515">515</a>
+<a href="#516" id="516">516</a>
+<a href="#517" id="517">517</a>
+<a href="#518" id="518">518</a>
+<a href="#519" id="519">519</a>
+<a href="#520" id="520">520</a>
+<a href="#521" id="521">521</a>
+<a href="#522" id="522">522</a>
+<a href="#523" id="523">523</a>
+<a href="#524" id="524">524</a>
+<a href="#525" id="525">525</a>
+<a href="#526" id="526">526</a>
+<a href="#527" id="527">527</a>
+<a href="#528" id="528">528</a>
+<a href="#529" id="529">529</a>
+<a href="#530" id="530">530</a>
+<a href="#531" id="531">531</a>
+<a href="#532" id="532">532</a>
+<a href="#533" id="533">533</a>
+<a href="#534" id="534">534</a>
+<a href="#535" id="535">535</a>
+<a href="#536" id="536">536</a>
+<a href="#537" id="537">537</a>
+<a href="#538" id="538">538</a>
+<a href="#539" id="539">539</a>
+<a href="#540" id="540">540</a>
+<a href="#541" id="541">541</a>
+<a href="#542" id="542">542</a>
+<a href="#543" id="543">543</a>
+<a href="#544" id="544">544</a>
+<a href="#545" id="545">545</a>
+<a href="#546" id="546">546</a>
+<a href="#547" id="547">547</a>
+<a href="#548" id="548">548</a>
+<a href="#549" id="549">549</a>
+<a href="#550" id="550">550</a>
+<a href="#551" id="551">551</a>
+<a href="#552" id="552">552</a>
+<a href="#553" id="553">553</a>
+<a href="#554" id="554">554</a>
+<a href="#555" id="555">555</a>
+<a href="#556" id="556">556</a>
+<a href="#557" id="557">557</a>
+<a href="#558" id="558">558</a>
+<a href="#559" id="559">559</a>
+<a href="#560" id="560">560</a>
+<a href="#561" id="561">561</a>
+<a href="#562" id="562">562</a>
+<a href="#563" id="563">563</a>
+</pre></div><pre class="rust"><code><span class="comment">// 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.
+
+</span><span class="kw">use </span>std::sync::Arc;
+
+<span class="kw">use </span>apache_avro::Schema <span class="kw">as </span>AvroSchema;
+<span class="kw">use </span>once_cell::sync::Lazy;
+<span class="kw">use </span>typed_builder::TypedBuilder;
+
+<span class="kw">use </span><span class="kw">crate</span>::avro::schema_to_avro_schema;
+<span class="kw">use </span><span class="kw">crate</span>::error::Result;
+<span class="kw">use </span><span class="kw">crate</span>::spec::{
+ DataContentType, DataFile, ListType, ManifestFile, MapType, NestedField, NestedFieldRef,
+ PrimitiveType, Schema, StructType, Type, INITIAL_SEQUENCE_NUMBER,
+};
+<span class="kw">use crate</span>::{Error, ErrorKind};
+
+<span class="doccomment">/// Reference to [`ManifestEntry`].
+</span><span class="kw">pub type </span>ManifestEntryRef = Arc<ManifestEntry>;
+
+<span class="doccomment">/// A manifest is an immutable Avro file that lists data files or delete
+/// files, along with each file’s partition data tuple, metrics, and tracking
+/// information.
+</span><span class="attr">#[derive(Debug, PartialEq, Eq, Clone, TypedBuilder)]
+</span><span class="kw">pub struct </span>ManifestEntry {
+ <span class="doccomment">/// field: 0
+ ///
+ /// Used to track additions and deletions.
+ </span><span class="kw">pub </span>status: ManifestStatus,
+ <span class="doccomment">/// field id: 1
+ ///
+ /// Snapshot id where the file was added, or deleted if status is 2.
+ /// Inherited when null.
+ </span><span class="attr">#[builder(default, setter(strip_option(fallback = snapshot_id_opt)))]
+ </span><span class="kw">pub </span>snapshot_id: <span class="prelude-ty">Option</span><i64>,
+ <span class="doccomment">/// field id: 3
+ ///
+ /// Data sequence number of the file.
+ /// Inherited when null and status is 1 (added).
+ </span><span class="attr">#[builder(default, setter(strip_option(fallback = sequence_number_opt)))]
+ </span><span class="kw">pub </span>sequence_number: <span class="prelude-ty">Option</span><i64>,
+ <span class="doccomment">/// field id: 4
+ ///
+ /// File sequence number indicating when the file was added.
+ /// Inherited when null and status is 1 (added).
+ </span><span class="attr">#[builder(default, setter(strip_option(fallback = file_sequence_number_opt)))]
+ </span><span class="kw">pub </span>file_sequence_number: <span class="prelude-ty">Option</span><i64>,
+ <span class="doccomment">/// field id: 2
+ ///
+ /// File path, partition tuple, metrics, …
+ </span><span class="kw">pub </span>data_file: DataFile,
+}
+
+<span class="kw">impl </span>ManifestEntry {
+ <span class="doccomment">/// Check if this manifest entry is deleted.
+ </span><span class="kw">pub fn </span>is_alive(<span class="kw-2">&</span><span class="self">self</span>) -> bool {
+ <span class="macro">matches!</span>(
+ <span class="self">self</span>.status,
+ ManifestStatus::Added | ManifestStatus::Existing
+ )
+ }
+
+ <span class="doccomment">/// Status of this manifest entry
+ </span><span class="kw">pub fn </span>status(<span class="kw-2">&</span><span class="self">self</span>) -> ManifestStatus {
+ <span class="self">self</span>.status
+ }
+
+ <span class="doccomment">/// Content type of this manifest entry.
+ </span><span class="attr">#[inline]
+ </span><span class="kw">pub fn </span>content_type(<span class="kw-2">&</span><span class="self">self</span>) -> DataContentType {
+ <span class="self">self</span>.data_file.content
+ }
+
+ <span class="doccomment">/// File format of this manifest entry.
+ </span><span class="attr">#[inline]
+ </span><span class="kw">pub fn </span>file_format(<span class="kw-2">&</span><span class="self">self</span>) -> DataFileFormat {
+ <span class="self">self</span>.data_file.file_format
+ }
+
+ <span class="doccomment">/// Data file path of this manifest entry.
+ </span><span class="attr">#[inline]
+ </span><span class="kw">pub fn </span>file_path(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>str {
+ <span class="kw-2">&</span><span class="self">self</span>.data_file.file_path
+ }
+
+ <span class="doccomment">/// Data file record count of the manifest entry.
+ </span><span class="attr">#[inline]
+ </span><span class="kw">pub fn </span>record_count(<span class="kw-2">&</span><span class="self">self</span>) -> u64 {
+ <span class="self">self</span>.data_file.record_count
+ }
+
+ <span class="doccomment">/// Inherit data from manifest list, such as snapshot id, sequence number.
+ </span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>inherit_data(<span class="kw-2">&mut </span><span class="self">self</span>, snapshot_entry: <span class="kw-2">&</span>ManifestFile) {
+ <span class="kw">if </span><span class="self">self</span>.snapshot_id.is_none() {
+ <span class="self">self</span>.snapshot_id = <span class="prelude-val">Some</span>(snapshot_entry.added_snapshot_id);
+ }
+
+ <span class="kw">if </span><span class="self">self</span>.sequence_number.is_none()
+ && (<span class="self">self</span>.status == ManifestStatus::Added
+ || snapshot_entry.sequence_number == INITIAL_SEQUENCE_NUMBER)
+ {
+ <span class="self">self</span>.sequence_number = <span class="prelude-val">Some</span>(snapshot_entry.sequence_number);
+ }
+
+ <span class="kw">if </span><span class="self">self</span>.file_sequence_number.is_none()
+ && (<span class="self">self</span>.status == ManifestStatus::Added
+ || snapshot_entry.sequence_number == INITIAL_SEQUENCE_NUMBER)
+ {
+ <span class="self">self</span>.file_sequence_number = <span class="prelude-val">Some</span>(snapshot_entry.sequence_number);
+ }
+ }
+
+ <span class="doccomment">/// Snapshot id
+ </span><span class="attr">#[inline]
+ </span><span class="kw">pub fn </span>snapshot_id(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="prelude-ty">Option</span><i64> {
+ <span class="self">self</span>.snapshot_id
+ }
+
+ <span class="doccomment">/// Data sequence number.
+ </span><span class="attr">#[inline]
+ </span><span class="kw">pub fn </span>sequence_number(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="prelude-ty">Option</span><i64> {
+ <span class="self">self</span>.sequence_number
+ }
+
+ <span class="doccomment">/// File size in bytes.
+ </span><span class="attr">#[inline]
+ </span><span class="kw">pub fn </span>file_size_in_bytes(<span class="kw-2">&</span><span class="self">self</span>) -> u64 {
+ <span class="self">self</span>.data_file.file_size_in_bytes
+ }
+
+ <span class="doccomment">/// get a reference to the actual data file
+ </span><span class="attr">#[inline]
+ </span><span class="kw">pub fn </span>data_file(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>DataFile {
+ <span class="kw-2">&</span><span class="self">self</span>.data_file
+ }
+}
+
+<span class="doccomment">/// Used to track additions and deletions in ManifestEntry.
+</span><span class="attr">#[derive(Debug, PartialEq, Eq, Clone, Copy)]
+</span><span class="kw">pub enum </span>ManifestStatus {
+ <span class="doccomment">/// Value: 0
+ </span>Existing = <span class="number">0</span>,
+ <span class="doccomment">/// Value: 1
+ </span>Added = <span class="number">1</span>,
+ <span class="doccomment">/// Value: 2
+ ///
+ /// Deletes are informational only and not used in scans.
+ </span>Deleted = <span class="number">2</span>,
+}
+
+<span class="kw">impl </span>TryFrom<i32> <span class="kw">for </span>ManifestStatus {
+ <span class="kw">type </span>Error = Error;
+
+ <span class="kw">fn </span>try_from(v: i32) -> <span class="prelude-ty">Result</span><ManifestStatus> {
+ <span class="kw">match </span>v {
+ <span class="number">0 </span>=> <span class="prelude-val">Ok</span>(ManifestStatus::Existing),
+ <span class="number">1 </span>=> <span class="prelude-val">Ok</span>(ManifestStatus::Added),
+ <span class="number">2 </span>=> <span class="prelude-val">Ok</span>(ManifestStatus::Deleted),
+ <span class="kw">_ </span>=> <span class="prelude-val">Err</span>(Error::new(
+ ErrorKind::DataInvalid,
+ <span class="macro">format!</span>(<span class="string">"manifest status {} is invalid"</span>, v),
+ )),
+ }
+ }
+}
+
+<span class="kw">use </span><span class="kw">super</span>::DataFileFormat;
+
+<span class="kw">static </span>STATUS: Lazy<NestedFieldRef> = {
+ Lazy::new(|| {
+ Arc::new(NestedField::required(
+ <span class="number">0</span>,
+ <span class="string">"status"</span>,
+ Type::Primitive(PrimitiveType::Int),
+ ))
+ })
+};
+
+<span class="kw">static </span>SNAPSHOT_ID_V1: Lazy<NestedFieldRef> = {
+ Lazy::new(|| {
+ Arc::new(NestedField::required(
+ <span class="number">1</span>,
+ <span class="string">"snapshot_id"</span>,
+ Type::Primitive(PrimitiveType::Long),
+ ))
+ })
+};
+
+<span class="kw">static </span>SNAPSHOT_ID_V2: Lazy<NestedFieldRef> = {
+ Lazy::new(|| {
+ Arc::new(NestedField::optional(
+ <span class="number">1</span>,
+ <span class="string">"snapshot_id"</span>,
+ Type::Primitive(PrimitiveType::Long),
+ ))
+ })
+};
+
+<span class="kw">static </span>SEQUENCE_NUMBER: Lazy<NestedFieldRef> = {
+ Lazy::new(|| {
+ Arc::new(NestedField::optional(
+ <span class="number">3</span>,
+ <span class="string">"sequence_number"</span>,
+ Type::Primitive(PrimitiveType::Long),
+ ))
+ })
+};
+
+<span class="kw">static </span>FILE_SEQUENCE_NUMBER: Lazy<NestedFieldRef> = {
+ Lazy::new(|| {
+ Arc::new(NestedField::optional(
+ <span class="number">4</span>,
+ <span class="string">"file_sequence_number"</span>,
+ Type::Primitive(PrimitiveType::Long),
+ ))
+ })
+};
+
+<span class="kw">static </span>CONTENT: Lazy<NestedFieldRef> = {
+ Lazy::new(|| {
+ Arc::new(NestedField::required(
+ <span class="number">134</span>,
+ <span class="string">"content"</span>,
+ Type::Primitive(PrimitiveType::Int),
+ ))
+ })
+};
+
+<span class="kw">static </span>FILE_PATH: Lazy<NestedFieldRef> = {
+ Lazy::new(|| {
+ Arc::new(NestedField::required(
+ <span class="number">100</span>,
+ <span class="string">"file_path"</span>,
+ Type::Primitive(PrimitiveType::String),
+ ))
+ })
+};
+
+<span class="kw">static </span>FILE_FORMAT: Lazy<NestedFieldRef> = {
+ Lazy::new(|| {
+ Arc::new(NestedField::required(
+ <span class="number">101</span>,
+ <span class="string">"file_format"</span>,
+ Type::Primitive(PrimitiveType::String),
+ ))
+ })
+};
+
+<span class="kw">static </span>RECORD_COUNT: Lazy<NestedFieldRef> = {
+ Lazy::new(|| {
+ Arc::new(NestedField::required(
+ <span class="number">103</span>,
+ <span class="string">"record_count"</span>,
+ Type::Primitive(PrimitiveType::Long),
+ ))
+ })
+};
+
+<span class="kw">static </span>FILE_SIZE_IN_BYTES: Lazy<NestedFieldRef> = {
+ Lazy::new(|| {
+ Arc::new(NestedField::required(
+ <span class="number">104</span>,
+ <span class="string">"file_size_in_bytes"</span>,
+ Type::Primitive(PrimitiveType::Long),
+ ))
+ })
+};
+
+<span class="comment">// Deprecated. Always write a default in v1. Do not write in v2.
+</span><span class="kw">static </span>BLOCK_SIZE_IN_BYTES: Lazy<NestedFieldRef> = {
+ Lazy::new(|| {
+ Arc::new(NestedField::required(
+ <span class="number">105</span>,
+ <span class="string">"block_size_in_bytes"</span>,
+ Type::Primitive(PrimitiveType::Long),
+ ))
+ })
+};
+
+<span class="kw">static </span>COLUMN_SIZES: Lazy<NestedFieldRef> = {
+ Lazy::new(|| {
+ Arc::new(NestedField::optional(
+ <span class="number">108</span>,
+ <span class="string">"column_sizes"</span>,
+ Type::Map(MapType {
+ key_field: Arc::new(NestedField::required(
+ <span class="number">117</span>,
+ <span class="string">"key"</span>,
+ Type::Primitive(PrimitiveType::Int),
+ )),
+ value_field: Arc::new(NestedField::required(
+ <span class="number">118</span>,
+ <span class="string">"value"</span>,
+ Type::Primitive(PrimitiveType::Long),
+ )),
+ }),
+ ))
+ })
+};
+
+<span class="kw">static </span>VALUE_COUNTS: Lazy<NestedFieldRef> = {
+ Lazy::new(|| {
+ Arc::new(NestedField::optional(
+ <span class="number">109</span>,
+ <span class="string">"value_counts"</span>,
+ Type::Map(MapType {
+ key_field: Arc::new(NestedField::required(
+ <span class="number">119</span>,
+ <span class="string">"key"</span>,
+ Type::Primitive(PrimitiveType::Int),
+ )),
+ value_field: Arc::new(NestedField::required(
+ <span class="number">120</span>,
+ <span class="string">"value"</span>,
+ Type::Primitive(PrimitiveType::Long),
+ )),
+ }),
+ ))
+ })
+};
+
+<span class="kw">static </span>NULL_VALUE_COUNTS: Lazy<NestedFieldRef> = {
+ Lazy::new(|| {
+ Arc::new(NestedField::optional(
+ <span class="number">110</span>,
+ <span class="string">"null_value_counts"</span>,
+ Type::Map(MapType {
+ key_field: Arc::new(NestedField::required(
+ <span class="number">121</span>,
+ <span class="string">"key"</span>,
+ Type::Primitive(PrimitiveType::Int),
+ )),
+ value_field: Arc::new(NestedField::required(
+ <span class="number">122</span>,
+ <span class="string">"value"</span>,
+ Type::Primitive(PrimitiveType::Long),
+ )),
+ }),
+ ))
+ })
+};
+
+<span class="kw">static </span>NAN_VALUE_COUNTS: Lazy<NestedFieldRef> = {
+ Lazy::new(|| {
+ Arc::new(NestedField::optional(
+ <span class="number">137</span>,
+ <span class="string">"nan_value_counts"</span>,
+ Type::Map(MapType {
+ key_field: Arc::new(NestedField::required(
+ <span class="number">138</span>,
+ <span class="string">"key"</span>,
+ Type::Primitive(PrimitiveType::Int),
+ )),
+ value_field: Arc::new(NestedField::required(
+ <span class="number">139</span>,
+ <span class="string">"value"</span>,
+ Type::Primitive(PrimitiveType::Long),
+ )),
+ }),
+ ))
+ })
+};
+
+<span class="kw">static </span>LOWER_BOUNDS: Lazy<NestedFieldRef> = {
+ Lazy::new(|| {
+ Arc::new(NestedField::optional(
+ <span class="number">125</span>,
+ <span class="string">"lower_bounds"</span>,
+ Type::Map(MapType {
+ key_field: Arc::new(NestedField::required(
+ <span class="number">126</span>,
+ <span class="string">"key"</span>,
+ Type::Primitive(PrimitiveType::Int),
+ )),
+ value_field: Arc::new(NestedField::required(
+ <span class="number">127</span>,
+ <span class="string">"value"</span>,
+ Type::Primitive(PrimitiveType::Binary),
+ )),
+ }),
+ ))
+ })
+};
+
+<span class="kw">static </span>UPPER_BOUNDS: Lazy<NestedFieldRef> = {
+ Lazy::new(|| {
+ Arc::new(NestedField::optional(
+ <span class="number">128</span>,
+ <span class="string">"upper_bounds"</span>,
+ Type::Map(MapType {
+ key_field: Arc::new(NestedField::required(
+ <span class="number">129</span>,
+ <span class="string">"key"</span>,
+ Type::Primitive(PrimitiveType::Int),
+ )),
+ value_field: Arc::new(NestedField::required(
+ <span class="number">130</span>,
+ <span class="string">"value"</span>,
+ Type::Primitive(PrimitiveType::Binary),
+ )),
+ }),
+ ))
+ })
+};
+
+<span class="kw">static </span>KEY_METADATA: Lazy<NestedFieldRef> = {
+ Lazy::new(|| {
+ Arc::new(NestedField::optional(
+ <span class="number">131</span>,
+ <span class="string">"key_metadata"</span>,
+ Type::Primitive(PrimitiveType::Binary),
+ ))
+ })
+};
+
+<span class="kw">static </span>SPLIT_OFFSETS: Lazy<NestedFieldRef> = {
+ Lazy::new(|| {
+ Arc::new(NestedField::optional(
+ <span class="number">132</span>,
+ <span class="string">"split_offsets"</span>,
+ Type::List(ListType {
+ element_field: Arc::new(NestedField::required(
+ <span class="number">133</span>,
+ <span class="string">"element"</span>,
+ Type::Primitive(PrimitiveType::Long),
+ )),
+ }),
+ ))
+ })
+};
+
+<span class="kw">static </span>EQUALITY_IDS: Lazy<NestedFieldRef> = {
+ Lazy::new(|| {
+ Arc::new(NestedField::optional(
+ <span class="number">135</span>,
+ <span class="string">"equality_ids"</span>,
+ Type::List(ListType {
+ element_field: Arc::new(NestedField::required(
+ <span class="number">136</span>,
+ <span class="string">"element"</span>,
+ Type::Primitive(PrimitiveType::Int),
+ )),
+ }),
+ ))
+ })
+};
+
+<span class="kw">static </span>SORT_ORDER_ID: Lazy<NestedFieldRef> = {
+ Lazy::new(|| {
+ Arc::new(NestedField::optional(
+ <span class="number">140</span>,
+ <span class="string">"sort_order_id"</span>,
+ Type::Primitive(PrimitiveType::Int),
+ ))
+ })
+};
+
+<span class="kw">fn </span>data_file_fields_v2(partition_type: <span class="kw-2">&</span>StructType) -> Vec<NestedFieldRef> {
+ <span class="macro">vec!</span>[
+ CONTENT.clone(),
+ FILE_PATH.clone(),
+ FILE_FORMAT.clone(),
+ Arc::new(NestedField::required(
+ <span class="number">102</span>,
+ <span class="string">"partition"</span>,
+ Type::Struct(partition_type.clone()),
+ )),
+ RECORD_COUNT.clone(),
+ FILE_SIZE_IN_BYTES.clone(),
+ COLUMN_SIZES.clone(),
+ VALUE_COUNTS.clone(),
+ NULL_VALUE_COUNTS.clone(),
+ NAN_VALUE_COUNTS.clone(),
+ LOWER_BOUNDS.clone(),
+ UPPER_BOUNDS.clone(),
+ KEY_METADATA.clone(),
+ SPLIT_OFFSETS.clone(),
+ EQUALITY_IDS.clone(),
+ SORT_ORDER_ID.clone(),
+ ]
+}
+
+<span class="kw">pub</span>(<span class="kw">super</span>) <span class="kw">fn </span>data_file_schema_v2(partition_type: <span class="kw-2">&</span>StructType) -> <span class="prelude-ty">Result</span><AvroSchema> {
+ <span class="kw">let </span>schema = Schema::builder()
+ .with_fields(data_file_fields_v2(partition_type))
+ .build()<span class="question-mark">?</span>;
+ schema_to_avro_schema(<span class="string">"data_file"</span>, <span class="kw-2">&</span>schema)
+}
+
+<span class="kw">pub</span>(<span class="kw">super</span>) <span class="kw">fn </span>manifest_schema_v2(partition_type: <span class="kw-2">&</span>StructType) -> <span class="prelude-ty">Result</span><AvroSchema> {
+ <span class="kw">let </span>fields = <span class="macro">vec!</span>[
+ STATUS.clone(),
+ SNAPSHOT_ID_V2.clone(),
+ SEQUENCE_NUMBER.clone(),
+ FILE_SEQUENCE_NUMBER.clone(),
+ Arc::new(NestedField::required(
+ <span class="number">2</span>,
+ <span class="string">"data_file"</span>,
+ Type::Struct(StructType::new(data_file_fields_v2(partition_type))),
+ )),
+ ];
+ <span class="kw">let </span>schema = Schema::builder().with_fields(fields).build()<span class="question-mark">?</span>;
+ schema_to_avro_schema(<span class="string">"manifest_entry"</span>, <span class="kw-2">&</span>schema)
+}
+
+<span class="kw">fn </span>data_file_fields_v1(partition_type: <span class="kw-2">&</span>StructType) -> Vec<NestedFieldRef> {
+ <span class="macro">vec!</span>[
+ FILE_PATH.clone(),
+ FILE_FORMAT.clone(),
+ Arc::new(NestedField::required(
+ <span class="number">102</span>,
+ <span class="string">"partition"</span>,
+ Type::Struct(partition_type.clone()),
+ )),
+ RECORD_COUNT.clone(),
+ FILE_SIZE_IN_BYTES.clone(),
+ BLOCK_SIZE_IN_BYTES.clone(),
+ COLUMN_SIZES.clone(),
+ VALUE_COUNTS.clone(),
+ NULL_VALUE_COUNTS.clone(),
+ NAN_VALUE_COUNTS.clone(),
+ LOWER_BOUNDS.clone(),
+ UPPER_BOUNDS.clone(),
+ KEY_METADATA.clone(),
+ SPLIT_OFFSETS.clone(),
+ SORT_ORDER_ID.clone(),
+ ]
+}
+
+<span class="kw">pub</span>(<span class="kw">super</span>) <span class="kw">fn </span>data_file_schema_v1(partition_type: <span class="kw-2">&</span>StructType) -> <span class="prelude-ty">Result</span><AvroSchema> {
+ <span class="kw">let </span>schema = Schema::builder()
+ .with_fields(data_file_fields_v1(partition_type))
+ .build()<span class="question-mark">?</span>;
+ schema_to_avro_schema(<span class="string">"data_file"</span>, <span class="kw-2">&</span>schema)
+}
+
+<span class="kw">pub</span>(<span class="kw">super</span>) <span class="kw">fn </span>manifest_schema_v1(partition_type: <span class="kw-2">&</span>StructType) -> <span class="prelude-ty">Result</span><AvroSchema> {
+ <span class="kw">let </span>fields = <span class="macro">vec!</span>[
+ STATUS.clone(),
+ SNAPSHOT_ID_V1.clone(),
+ Arc::new(NestedField::required(
+ <span class="number">2</span>,
+ <span class="string">"data_file"</span>,
+ Type::Struct(StructType::new(data_file_fields_v1(partition_type))),
+ )),
+ ];
+ <span class="kw">let </span>schema = Schema::builder().with_fields(fields).build()<span class="question-mark">?</span>;
+ schema_to_avro_schema(<span class="string">"manifest_entry"</span>, <span class="kw-2">&</span>schema)
+}
+</code></pre></div></section></main></body></html>
\ No newline at end of file
diff --git a/api/src/iceberg/spec/manifest/metadata.rs.html b/api/src/iceberg/spec/manifest/metadata.rs.html
new file mode 100644
index 00000000..6e397a8b
--- /dev/null
+++ b/api/src/iceberg/spec/manifest/metadata.rs.html
@@ -0,0 +1,319 @@
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `crates/iceberg/src/spec/manifest/metadata.rs`."><title>metadata.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff2, [...]
+<a href="#2" id="2">2</a>
+<a href="#3" id="3">3</a>
+<a href="#4" id="4">4</a>
+<a href="#5" id="5">5</a>
+<a href="#6" id="6">6</a>
+<a href="#7" id="7">7</a>
+<a href="#8" id="8">8</a>
+<a href="#9" id="9">9</a>
+<a href="#10" id="10">10</a>
+<a href="#11" id="11">11</a>
+<a href="#12" id="12">12</a>
+<a href="#13" id="13">13</a>
+<a href="#14" id="14">14</a>
+<a href="#15" id="15">15</a>
+<a href="#16" id="16">16</a>
+<a href="#17" id="17">17</a>
+<a href="#18" id="18">18</a>
+<a href="#19" id="19">19</a>
+<a href="#20" id="20">20</a>
+<a href="#21" id="21">21</a>
+<a href="#22" id="22">22</a>
+<a href="#23" id="23">23</a>
+<a href="#24" id="24">24</a>
+<a href="#25" id="25">25</a>
+<a href="#26" id="26">26</a>
+<a href="#27" id="27">27</a>
+<a href="#28" id="28">28</a>
+<a href="#29" id="29">29</a>
+<a href="#30" id="30">30</a>
+<a href="#31" id="31">31</a>
+<a href="#32" id="32">32</a>
+<a href="#33" id="33">33</a>
+<a href="#34" id="34">34</a>
+<a href="#35" id="35">35</a>
+<a href="#36" id="36">36</a>
+<a href="#37" id="37">37</a>
+<a href="#38" id="38">38</a>
+<a href="#39" id="39">39</a>
+<a href="#40" id="40">40</a>
+<a href="#41" id="41">41</a>
+<a href="#42" id="42">42</a>
+<a href="#43" id="43">43</a>
+<a href="#44" id="44">44</a>
+<a href="#45" id="45">45</a>
+<a href="#46" id="46">46</a>
+<a href="#47" id="47">47</a>
+<a href="#48" id="48">48</a>
+<a href="#49" id="49">49</a>
+<a href="#50" id="50">50</a>
+<a href="#51" id="51">51</a>
+<a href="#52" id="52">52</a>
+<a href="#53" id="53">53</a>
+<a href="#54" id="54">54</a>
+<a href="#55" id="55">55</a>
+<a href="#56" id="56">56</a>
+<a href="#57" id="57">57</a>
+<a href="#58" id="58">58</a>
+<a href="#59" id="59">59</a>
+<a href="#60" id="60">60</a>
+<a href="#61" id="61">61</a>
+<a href="#62" id="62">62</a>
+<a href="#63" id="63">63</a>
+<a href="#64" id="64">64</a>
+<a href="#65" id="65">65</a>
+<a href="#66" id="66">66</a>
+<a href="#67" id="67">67</a>
+<a href="#68" id="68">68</a>
+<a href="#69" id="69">69</a>
+<a href="#70" id="70">70</a>
+<a href="#71" id="71">71</a>
+<a href="#72" id="72">72</a>
+<a href="#73" id="73">73</a>
+<a href="#74" id="74">74</a>
+<a href="#75" id="75">75</a>
+<a href="#76" id="76">76</a>
+<a href="#77" id="77">77</a>
+<a href="#78" id="78">78</a>
+<a href="#79" id="79">79</a>
+<a href="#80" id="80">80</a>
+<a href="#81" id="81">81</a>
+<a href="#82" id="82">82</a>
+<a href="#83" id="83">83</a>
+<a href="#84" id="84">84</a>
+<a href="#85" id="85">85</a>
+<a href="#86" id="86">86</a>
+<a href="#87" id="87">87</a>
+<a href="#88" id="88">88</a>
+<a href="#89" id="89">89</a>
+<a href="#90" id="90">90</a>
+<a href="#91" id="91">91</a>
+<a href="#92" id="92">92</a>
+<a href="#93" id="93">93</a>
+<a href="#94" id="94">94</a>
+<a href="#95" id="95">95</a>
+<a href="#96" id="96">96</a>
+<a href="#97" id="97">97</a>
+<a href="#98" id="98">98</a>
+<a href="#99" id="99">99</a>
+<a href="#100" id="100">100</a>
+<a href="#101" id="101">101</a>
+<a href="#102" id="102">102</a>
+<a href="#103" id="103">103</a>
+<a href="#104" id="104">104</a>
+<a href="#105" id="105">105</a>
+<a href="#106" id="106">106</a>
+<a href="#107" id="107">107</a>
+<a href="#108" id="108">108</a>
+<a href="#109" id="109">109</a>
+<a href="#110" id="110">110</a>
+<a href="#111" id="111">111</a>
+<a href="#112" id="112">112</a>
+<a href="#113" id="113">113</a>
+<a href="#114" id="114">114</a>
+<a href="#115" id="115">115</a>
+<a href="#116" id="116">116</a>
+<a href="#117" id="117">117</a>
+<a href="#118" id="118">118</a>
+<a href="#119" id="119">119</a>
+<a href="#120" id="120">120</a>
+<a href="#121" id="121">121</a>
+<a href="#122" id="122">122</a>
+<a href="#123" id="123">123</a>
+<a href="#124" id="124">124</a>
+<a href="#125" id="125">125</a>
+<a href="#126" id="126">126</a>
+<a href="#127" id="127">127</a>
+<a href="#128" id="128">128</a>
+<a href="#129" id="129">129</a>
+<a href="#130" id="130">130</a>
+<a href="#131" id="131">131</a>
+<a href="#132" id="132">132</a>
+<a href="#133" id="133">133</a>
+<a href="#134" id="134">134</a>
+<a href="#135" id="135">135</a>
+<a href="#136" id="136">136</a>
+<a href="#137" id="137">137</a>
+<a href="#138" id="138">138</a>
+<a href="#139" id="139">139</a>
+<a href="#140" id="140">140</a>
+<a href="#141" id="141">141</a>
+<a href="#142" id="142">142</a>
+<a href="#143" id="143">143</a>
+<a href="#144" id="144">144</a>
+<a href="#145" id="145">145</a>
+<a href="#146" id="146">146</a>
+<a href="#147" id="147">147</a>
+<a href="#148" id="148">148</a>
+<a href="#149" id="149">149</a>
+<a href="#150" id="150">150</a>
+<a href="#151" id="151">151</a>
+<a href="#152" id="152">152</a>
+<a href="#153" id="153">153</a>
+<a href="#154" id="154">154</a>
+<a href="#155" id="155">155</a>
+<a href="#156" id="156">156</a>
+<a href="#157" id="157">157</a>
+<a href="#158" id="158">158</a>
+<a href="#159" id="159">159</a>
+</pre></div><pre class="rust"><code><span class="comment">// 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.
+
+</span><span class="kw">use </span>std::collections::HashMap;
+<span class="kw">use </span>std::sync::Arc;
+
+<span class="kw">use </span>typed_builder::TypedBuilder;
+
+<span class="kw">use super</span>::{FormatVersion, ManifestContentType, PartitionSpec, Schema};
+<span class="kw">use </span><span class="kw">crate</span>::error::Result;
+<span class="kw">use </span><span class="kw">crate</span>::spec::{PartitionField, SchemaId, SchemaRef};
+<span class="kw">use crate</span>::{Error, ErrorKind};
+
+<span class="doccomment">/// Meta data of a manifest that is stored in the key-value metadata of the Avro file
+</span><span class="attr">#[derive(Debug, PartialEq, Clone, Eq, TypedBuilder)]
+</span><span class="kw">pub struct </span>ManifestMetadata {
+ <span class="doccomment">/// The table schema at the time the manifest
+ /// was written
+ </span><span class="kw">pub </span>schema: SchemaRef,
+ <span class="doccomment">/// ID of the schema used to write the manifest as a string
+ </span><span class="kw">pub </span>schema_id: SchemaId,
+ <span class="doccomment">/// The partition spec used to write the manifest
+ </span><span class="kw">pub </span>partition_spec: PartitionSpec,
+ <span class="doccomment">/// Table format version number of the manifest as a string
+ </span><span class="kw">pub </span>format_version: FormatVersion,
+ <span class="doccomment">/// Type of content files tracked by the manifest: “data” or “deletes”
+ </span><span class="kw">pub </span>content: ManifestContentType,
+}
+
+<span class="kw">impl </span>ManifestMetadata {
+ <span class="doccomment">/// Parse from metadata in avro file.
+ </span><span class="kw">pub fn </span>parse(meta: <span class="kw-2">&</span>HashMap<String, Vec<u8>>) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
+ <span class="kw">let </span>schema = Arc::new({
+ <span class="kw">let </span>bs = meta.get(<span class="string">"schema"</span>).ok_or_else(|| {
+ Error::new(
+ ErrorKind::DataInvalid,
+ <span class="string">"schema is required in manifest metadata but not found"</span>,
+ )
+ })<span class="question-mark">?</span>;
+ serde_json::from_slice::<Schema>(bs).map_err(|err| {
+ Error::new(
+ ErrorKind::DataInvalid,
+ <span class="string">"Fail to parse schema in manifest metadata"</span>,
+ )
+ .with_source(err)
+ })<span class="question-mark">?
+ </span>});
+ <span class="kw">let </span>schema_id: i32 = meta
+ .get(<span class="string">"schema-id"</span>)
+ .map(|bs| {
+ String::from_utf8_lossy(bs).parse().map_err(|err| {
+ Error::new(
+ ErrorKind::DataInvalid,
+ <span class="string">"Fail to parse schema id in manifest metadata"</span>,
+ )
+ .with_source(err)
+ })
+ })
+ .transpose()<span class="question-mark">?
+ </span>.unwrap_or(<span class="number">0</span>);
+ <span class="kw">let </span>partition_spec = {
+ <span class="kw">let </span>fields = {
+ <span class="kw">let </span>bs = meta.get(<span class="string">"partition-spec"</span>).ok_or_else(|| {
+ Error::new(
+ ErrorKind::DataInvalid,
+ <span class="string">"partition-spec is required in manifest metadata but not found"</span>,
+ )
+ })<span class="question-mark">?</span>;
+ serde_json::from_slice::<Vec<PartitionField>>(bs).map_err(|err| {
+ Error::new(
+ ErrorKind::DataInvalid,
+ <span class="string">"Fail to parse partition spec in manifest metadata"</span>,
+ )
+ .with_source(err)
+ })<span class="question-mark">?
+ </span>};
+ <span class="kw">let </span>spec_id = meta
+ .get(<span class="string">"partition-spec-id"</span>)
+ .map(|bs| {
+ String::from_utf8_lossy(bs).parse().map_err(|err| {
+ Error::new(
+ ErrorKind::DataInvalid,
+ <span class="string">"Fail to parse partition spec id in manifest metadata"</span>,
+ )
+ .with_source(err)
+ })
+ })
+ .transpose()<span class="question-mark">?
+ </span>.unwrap_or(<span class="number">0</span>);
+ PartitionSpec::builder(schema.clone())
+ .with_spec_id(spec_id)
+ .add_unbound_fields(fields.into_iter().map(|f| f.into_unbound()))<span class="question-mark">?
+ </span>.build()<span class="question-mark">?
+ </span>};
+ <span class="kw">let </span>format_version = <span class="kw">if let </span><span class="prelude-val">Some</span>(bs) = meta.get(<span class="string">"format-version"</span>) {
+ serde_json::from_slice::<FormatVersion>(bs).map_err(|err| {
+ Error::new(
+ ErrorKind::DataInvalid,
+ <span class="string">"Fail to parse format version in manifest metadata"</span>,
+ )
+ .with_source(err)
+ })<span class="question-mark">?
+ </span>} <span class="kw">else </span>{
+ FormatVersion::V1
+ };
+ <span class="kw">let </span>content = <span class="kw">if let </span><span class="prelude-val">Some</span>(v) = meta.get(<span class="string">"content"</span>) {
+ <span class="kw">let </span>v = String::from_utf8_lossy(v);
+ v.parse()<span class="question-mark">?
+ </span>} <span class="kw">else </span>{
+ ManifestContentType::Data
+ };
+ <span class="prelude-val">Ok</span>(ManifestMetadata {
+ schema,
+ schema_id,
+ partition_spec,
+ format_version,
+ content,
+ })
+ }
+
+ <span class="doccomment">/// Get the schema of table at the time manifest was written
+ </span><span class="kw">pub fn </span>schema(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>SchemaRef {
+ <span class="kw-2">&</span><span class="self">self</span>.schema
+ }
+
+ <span class="doccomment">/// Get the ID of schema used to write the manifest
+ </span><span class="kw">pub fn </span>schema_id(<span class="kw-2">&</span><span class="self">self</span>) -> SchemaId {
+ <span class="self">self</span>.schema_id
+ }
+
+ <span class="doccomment">/// Get the partition spec used to write manifest
+ </span><span class="kw">pub fn </span>partition_spec(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>PartitionSpec {
+ <span class="kw-2">&</span><span class="self">self</span>.partition_spec
+ }
+
+ <span class="doccomment">/// Get the table format version
+ </span><span class="kw">pub fn </span>format_version(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>FormatVersion {
+ <span class="kw-2">&</span><span class="self">self</span>.format_version
+ }
+
+ <span class="doccomment">/// Get the type of content files tracked by manifest
+ </span><span class="kw">pub fn </span>content(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>ManifestContentType {
+ <span class="kw-2">&</span><span class="self">self</span>.content
+ }
+}
+</code></pre></div></section></main></body></html>
\ No newline at end of file
diff --git a/api/src/iceberg/spec/manifest/mod.rs.html b/api/src/iceberg/spec/manifest/mod.rs.html
new file mode 100644
index 00000000..de764f14
--- /dev/null
+++ b/api/src/iceberg/spec/manifest/mod.rs.html
@@ -0,0 +1,1995 @@
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `crates/iceberg/src/spec/manifest/mod.rs`."><title>mod.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff2,FiraSans-M [...]
+<a href="#2" id="2">2</a>
+<a href="#3" id="3">3</a>
+<a href="#4" id="4">4</a>
+<a href="#5" id="5">5</a>
+<a href="#6" id="6">6</a>
+<a href="#7" id="7">7</a>
+<a href="#8" id="8">8</a>
+<a href="#9" id="9">9</a>
+<a href="#10" id="10">10</a>
+<a href="#11" id="11">11</a>
+<a href="#12" id="12">12</a>
+<a href="#13" id="13">13</a>
+<a href="#14" id="14">14</a>
+<a href="#15" id="15">15</a>
+<a href="#16" id="16">16</a>
+<a href="#17" id="17">17</a>
+<a href="#18" id="18">18</a>
+<a href="#19" id="19">19</a>
+<a href="#20" id="20">20</a>
+<a href="#21" id="21">21</a>
+<a href="#22" id="22">22</a>
+<a href="#23" id="23">23</a>
+<a href="#24" id="24">24</a>
+<a href="#25" id="25">25</a>
+<a href="#26" id="26">26</a>
+<a href="#27" id="27">27</a>
+<a href="#28" id="28">28</a>
+<a href="#29" id="29">29</a>
+<a href="#30" id="30">30</a>
+<a href="#31" id="31">31</a>
+<a href="#32" id="32">32</a>
+<a href="#33" id="33">33</a>
+<a href="#34" id="34">34</a>
+<a href="#35" id="35">35</a>
+<a href="#36" id="36">36</a>
+<a href="#37" id="37">37</a>
+<a href="#38" id="38">38</a>
+<a href="#39" id="39">39</a>
+<a href="#40" id="40">40</a>
+<a href="#41" id="41">41</a>
+<a href="#42" id="42">42</a>
+<a href="#43" id="43">43</a>
+<a href="#44" id="44">44</a>
+<a href="#45" id="45">45</a>
+<a href="#46" id="46">46</a>
+<a href="#47" id="47">47</a>
+<a href="#48" id="48">48</a>
+<a href="#49" id="49">49</a>
+<a href="#50" id="50">50</a>
+<a href="#51" id="51">51</a>
+<a href="#52" id="52">52</a>
+<a href="#53" id="53">53</a>
+<a href="#54" id="54">54</a>
+<a href="#55" id="55">55</a>
+<a href="#56" id="56">56</a>
+<a href="#57" id="57">57</a>
+<a href="#58" id="58">58</a>
+<a href="#59" id="59">59</a>
+<a href="#60" id="60">60</a>
+<a href="#61" id="61">61</a>
+<a href="#62" id="62">62</a>
+<a href="#63" id="63">63</a>
+<a href="#64" id="64">64</a>
+<a href="#65" id="65">65</a>
+<a href="#66" id="66">66</a>
+<a href="#67" id="67">67</a>
+<a href="#68" id="68">68</a>
+<a href="#69" id="69">69</a>
+<a href="#70" id="70">70</a>
+<a href="#71" id="71">71</a>
+<a href="#72" id="72">72</a>
+<a href="#73" id="73">73</a>
+<a href="#74" id="74">74</a>
+<a href="#75" id="75">75</a>
+<a href="#76" id="76">76</a>
+<a href="#77" id="77">77</a>
... 3263 lines suppressed ...