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()
     }