anoopj commented on code in PR #3328:
URL: https://github.com/apache/iceberg-rust/pull/3328#discussion_r4234070078
##########
crates/iceberg/src/expr/visitors/page_index_evaluator.rs:
##########
@@ -1880,6 +2051,141 @@ mod tests {
Ok(())
}
+ #[test]
+ fn eval_inequality_prunes_fixed_len_byte_array_decimal_pages() ->
Result<()> {
+ // precision 30 -> Parquet FIXED_LEN_BYTE_ARRAY page bounds.
+ let (metadata, _temp_file) = create_decimal_parquet_file(30, 2, &[100,
200, 300, 400])?;
+ let (column_index, offset_index, row_group_metadata) =
get_test_metadata(&metadata);
+ let (iceberg_schema, field_id_map) =
build_decimal_schema_and_field_map(30, 2)?;
+
+ // Pages hold 1.00, 2.00, 3.00, 4.00. `> 2.50` keeps the pages whose
+ // upper bound exceeds 2.50 (3.00 and 4.00).
+ let filter = Reference::new("col_decimal")
+ .greater_than(decimal_datum(250, 2, 30)?)
+ .bind(iceberg_schema.clone(), false)?;
+
+ let result = PageIndexEvaluator::eval(
+ &filter,
+ &column_index,
+ &offset_index,
+ row_group_metadata,
+ &field_id_map,
+ iceberg_schema.as_ref(),
+ )?;
+
+ assert_eq!(result, vec![
+ RowSelector::skip(2048),
+ RowSelector::select(2048)
+ ]);
+
+ Ok(())
+ }
+
+ #[test]
+ fn eval_in_prunes_fixed_len_byte_array_decimal_pages() -> Result<()> {
+ // precision 30 -> Parquet FIXED_LEN_BYTE_ARRAY page bounds.
+ let (metadata, _temp_file) = create_decimal_parquet_file(30, 2, &[100,
200, 300, 400])?;
+ let (column_index, offset_index, row_group_metadata) =
get_test_metadata(&metadata);
+ let (iceberg_schema, field_id_map) =
build_decimal_schema_and_field_map(30, 2)?;
+
+ // Pages hold 1.00, 2.00, 3.00, 4.00. IN (2.00, 4.00) keeps only the
+ // pages whose single value is one of the literals.
+ let filter = Reference::new("col_decimal")
+ .is_in([decimal_datum(200, 2, 30)?, decimal_datum(400, 2, 30)?])
+ .bind(iceberg_schema.clone(), false)?;
+
+ let result = PageIndexEvaluator::eval(
+ &filter,
+ &column_index,
+ &offset_index,
+ row_group_metadata,
+ &field_id_map,
+ iceberg_schema.as_ref(),
+ )?;
+
+ assert_eq!(result, vec![
+ RowSelector::skip(1024),
+ RowSelector::select(1024),
+ RowSelector::skip(1024),
+ RowSelector::select(1024),
+ ]);
+
+ Ok(())
+ }
+
+ #[test]
+ fn eval_inequality_prunes_negative_fixed_len_byte_array_decimal_pages() ->
Result<()> {
+ // precision 30 -> Parquet FIXED_LEN_BYTE_ARRAY page bounds, spanning
+ // negative values. Negative decimals have a 0xff high byte in two's
+ // complement, so this only prunes correctly if the bounds are compared
+ // numerically rather than by raw byte order.
+ let (metadata, _temp_file) = create_decimal_parquet_file(30, 2,
&[-400, -200, 100, 300])?;
+ let (column_index, offset_index, row_group_metadata) =
get_test_metadata(&metadata);
+ let (iceberg_schema, field_id_map) =
build_decimal_schema_and_field_map(30, 2)?;
+
+ // Pages hold -4.00, -2.00, 1.00, 3.00. `>= -2.00` keeps the pages
whose
+ // upper bound is at least -2.00, including page 1 whose bound equals
it.
+ let filter = Reference::new("col_decimal")
+ .greater_than_or_equal_to(decimal_datum(-200, 2, 30)?)
+ .bind(iceberg_schema.clone(), false)?;
+
+ let result = PageIndexEvaluator::eval(
+ &filter,
+ &column_index,
+ &offset_index,
+ row_group_metadata,
+ &field_id_map,
+ iceberg_schema.as_ref(),
+ )?;
+
+ assert_eq!(result, vec![
+ RowSelector::skip(1024),
+ RowSelector::select(3072)
+ ]);
+
+ Ok(())
+ }
+
+ #[test]
+ fn eval_skips_pruning_for_truncated_fixed_len_byte_array_decimal_bound()
-> Result<()> {
Review Comment:
Added both.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]