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

JingsongLi pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/paimon-rust.git


The following commit(s) were added to refs/heads/main by this push:
     new 85c9127f perf(parquet): prune IN predicates with page stats (#704)
85c9127f is described below

commit 85c9127f66c69a2986389bbfa1422a9b53cc9358
Author: QuakeWang <[email protected]>
AuthorDate: Wed Aug 12 12:03:57 2026 +0800

    perf(parquet): prune IN predicates with page stats (#704)
---
 crates/paimon/src/arrow/format/parquet.rs | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/crates/paimon/src/arrow/format/parquet.rs 
b/crates/paimon/src/arrow/format/parquet.rs
index c039074d..960828ec 100644
--- a/crates/paimon/src/arrow/format/parquet.rs
+++ b/crates/paimon/src/arrow/format/parquet.rs
@@ -1395,6 +1395,10 @@ impl StatsAccessor for ParquetPageStats<'_> {
         }
         page_index_value_to_datum(self.column_index, self.page_idx, data_type, 
false)
     }
+
+    fn supports_in_min_max_pruning(&self) -> bool {
+        true
+    }
 }
 
 /// Decode a per-page min/max from a [`ColumnIndexMetaData`] into a [`Datum`].
@@ -3486,6 +3490,22 @@ mod tests {
         assert_eq!(sel.row_count(), 0);
     }
 
+    #[tokio::test]
+    async fn test_page_selection_in_keeps_only_matching_page() {
+        let bytes = write_multi_page_parquet(10, 80).await;
+        let metadata = load_metadata_with_page_index(&bytes, true);
+        let fields = vec![int_field("id"), int_field("value")];
+
+        let predicates = vec![id_leaf(
+            PredicateOperator::In,
+            vec![Datum::Int(35), Datum::Int(1000)],
+        )];
+        let sel = super::build_predicate_page_selection(&metadata, 
&predicates, &fields)
+            .unwrap()
+            .expect("non-matching pages should be skipped");
+        assert_eq!(sel.row_count(), 10);
+    }
+
     #[tokio::test]
     async fn test_page_selection_range_keeps_overlapping_pages() {
         let bytes = write_multi_page_parquet(10, 80).await;

Reply via email to