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 2026/09/14 18:18:12 UTC
(iceberg-rust) 01/01: perf(expr): borrow field type in manifest bound decoding instead of cloning (#3214)
This is an automated email from the ASF dual-hosted git repository.
github-merge-queue[bot] pushed a commit to branch gh-readonly-queue/main/pr-3214-f11a20d0ba9b6c168839e234f3817b0e0d75ce4b
in repository https://gitbox.apache.org/repos/asf/iceberg-rust.git
commit f0c9dad705f27f8745a7b8ad92a9768ce1d9548c
Author: Anoop Johnson <an...@apache.org>
AuthorDate: Mon Sep 14 18:00:20 2026 +0000
perf(expr): borrow field type in manifest bound decoding instead of cloning (#3214)
`ManifestFilterVisitor::bytes_to_datum` took the field `Type` by value, so
every comparison-leaf call site cloned the field's boxed `Type` to decode a
bound -- and the two in-predicate sites cloned the entire `NestedField`.
`bytes_to_datum` only borrows the type to reach its `PrimitiveType`, so take
`&Type` and pass `&reference.field().field_type` at the call sites, dropping
the per-leaf clones on the manifest-pruning path.
---
.../src/expr/visitors/manifest_evaluator.rs | 26 +++++++++-------------
1 file changed, 11 insertions(+), 15 deletions(-)
diff --git a/crates/iceberg/src/expr/visitors/manifest_evaluator.rs b/crates/iceberg/src/expr/visitors/manifest_evaluator.rs
index 53dbafc06..61f01cd5e 100644
--- a/crates/iceberg/src/expr/visitors/manifest_evaluator.rs
+++ b/crates/iceberg/src/expr/visitors/manifest_evaluator.rs
@@ -189,7 +189,7 @@ impl BoundPredicateVisitor for ManifestFilterVisitor<'_> {
Some(bound_bytes) => {
let bound = ManifestFilterVisitor::bytes_to_datum(
bound_bytes,
- *reference.field().field_type.clone(),
+ &reference.field().field_type,
);
if datum <= &bound {
ROWS_CANNOT_MATCH
@@ -212,7 +212,7 @@ impl BoundPredicateVisitor for ManifestFilterVisitor<'_> {
Some(bound_bytes) => {
let bound = ManifestFilterVisitor::bytes_to_datum(
bound_bytes,
- *reference.field().field_type.clone(),
+ &reference.field().field_type,
);
if datum < &bound {
ROWS_CANNOT_MATCH
@@ -235,7 +235,7 @@ impl BoundPredicateVisitor for ManifestFilterVisitor<'_> {
Some(bound_bytes) => {
let bound = ManifestFilterVisitor::bytes_to_datum(
bound_bytes,
- *reference.field().field_type.clone(),
+ &reference.field().field_type,
);
if datum >= &bound {
ROWS_CANNOT_MATCH
@@ -258,7 +258,7 @@ impl BoundPredicateVisitor for ManifestFilterVisitor<'_> {
Some(bound_bytes) => {
let bound = ManifestFilterVisitor::bytes_to_datum(
bound_bytes,
- *reference.field().field_type.clone(),
+ &reference.field().field_type,
);
if datum > &bound {
ROWS_CANNOT_MATCH
@@ -285,7 +285,7 @@ impl BoundPredicateVisitor for ManifestFilterVisitor<'_> {
if let Some(lower_bound_bytes) = &field.lower_bound {
let lower_bound = ManifestFilterVisitor::bytes_to_datum(
lower_bound_bytes,
- *reference.field().field_type.clone(),
+ &reference.field().field_type,
);
if &lower_bound > datum {
return ROWS_CANNOT_MATCH;
@@ -295,7 +295,7 @@ impl BoundPredicateVisitor for ManifestFilterVisitor<'_> {
if let Some(upper_bound_bytes) = &field.upper_bound {
let upper_bound = ManifestFilterVisitor::bytes_to_datum(
upper_bound_bytes,
- *reference.field().field_type.clone(),
+ &reference.field().field_type,
);
if &upper_bound < datum {
return ROWS_CANNOT_MATCH;
@@ -410,20 +410,16 @@ impl BoundPredicateVisitor for ManifestFilterVisitor<'_> {
}
if let Some(lower_bound) = &field.lower_bound {
- let lower_bound = ManifestFilterVisitor::bytes_to_datum(
- lower_bound,
- *reference.field().clone().field_type,
- );
+ let lower_bound =
+ ManifestFilterVisitor::bytes_to_datum(lower_bound, &reference.field().field_type);
if literals.iter().all(|datum| &lower_bound > datum) {
return ROWS_CANNOT_MATCH;
}
}
if let Some(upper_bound) = &field.upper_bound {
- let upper_bound = ManifestFilterVisitor::bytes_to_datum(
- upper_bound,
- *reference.field().clone().field_type,
- );
+ let upper_bound =
+ ManifestFilterVisitor::bytes_to_datum(upper_bound, &reference.field().field_type);
if literals.iter().all(|datum| &upper_bound < datum) {
return ROWS_CANNOT_MATCH;
}
@@ -474,7 +470,7 @@ impl ManifestFilterVisitor<'_> {
Ok(bound)
}
- fn bytes_to_datum(bytes: &ByteBuf, t: Type) -> Datum {
+ fn bytes_to_datum(bytes: &ByteBuf, t: &Type) -> Datum {
let p = t.as_primitive_type().unwrap();
Datum::try_from_bytes(bytes, p.clone()).unwrap()
}