Skip to content

Commit 75fa29e

Browse files
committed
Add unit test
1 parent 2d9184b commit 75fa29e

File tree

1 file changed

+44
-9
lines changed

1 file changed

+44
-9
lines changed

rust/sedona-geoparquet/src/format.rs

Lines changed: 44 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -679,7 +679,7 @@ mod test {
679679

680680
#[rstest]
681681
#[tokio::test]
682-
async fn pruning_geoparquet_metadata(#[values("st_intersects", "st_within")] udf_name: &str) {
682+
async fn pruning_geoparquet_metadata(#[values("st_intersects", "st_contains")] udf_name: &str) {
683683
let data_dir = geoarrow_data_dir().unwrap();
684684
let ctx = setup_context();
685685

@@ -691,10 +691,8 @@ mod test {
691691
)
692692
.into();
693693

694-
let definitely_non_intersecting_scalar = create_scalar(
695-
Some("POLYGON ((100 200), (100 300), (200 300), (100 200))"),
696-
&WKB_GEOMETRY,
697-
);
694+
let definitely_non_intersecting_scalar =
695+
create_scalar(Some("POINT (100 200)"), &WKB_GEOMETRY);
698696
let storage_field = WKB_GEOMETRY.to_storage_field("", true).unwrap();
699697

700698
let df = ctx
@@ -713,10 +711,7 @@ mod test {
713711
let batches_out = df.collect().await.unwrap();
714712
assert!(batches_out.is_empty());
715713

716-
let definitely_intersecting_scalar = create_scalar(
717-
Some("POLYGON ((30 10), (30 20), (40 20), (40 10), (30 10))"),
718-
&WKB_GEOMETRY,
719-
);
714+
let definitely_intersecting_scalar = create_scalar(Some("POINT (30 10)"), &WKB_GEOMETRY);
720715
let df = ctx
721716
.table(format!("{data_dir}/example/files/*_geo.parquet"))
722717
.await
@@ -734,6 +729,46 @@ mod test {
734729
assert!(!batches_out.is_empty());
735730
}
736731

732+
#[tokio::test]
733+
async fn should_not_prune_geoparquet_metadata_after_disabling_pruning() {
734+
let data_dir = geoarrow_data_dir().unwrap();
735+
let ctx = setup_context();
736+
ctx.sql("SET datafusion.execution.parquet.pruning TO false")
737+
.await
738+
.expect("Disabling parquet pruning failed");
739+
740+
let udf: ScalarUDF = SimpleScalarUDF::new_with_signature(
741+
"st_intersects",
742+
Signature::any(2, Volatility::Immutable),
743+
DataType::Boolean,
744+
Arc::new(|_args| Ok(ScalarValue::Boolean(Some(true)).into())),
745+
)
746+
.into();
747+
748+
let definitely_non_intersecting_scalar =
749+
create_scalar(Some("POINT (100 200)"), &WKB_GEOMETRY);
750+
let storage_field = WKB_GEOMETRY.to_storage_field("", true).unwrap();
751+
752+
let df = ctx
753+
.table(format!("{data_dir}/example/files/*_geo.parquet"))
754+
.await
755+
.unwrap()
756+
.filter(udf.call(vec![
757+
col("geometry"),
758+
Expr::Literal(
759+
definitely_non_intersecting_scalar,
760+
Some(storage_field.metadata().into()),
761+
),
762+
]))
763+
.unwrap();
764+
765+
// Even if the query window does not intersect with the data, we should not prune
766+
// any files because pruning has been disabled. We can retrieve the data here
767+
// because the dummy UDF always returns true.
768+
let batches_out = df.collect().await.unwrap();
769+
assert!(!batches_out.is_empty());
770+
}
771+
737772
#[tokio::test]
738773
async fn geoparquet_format_factory() {
739774
let ctx = SessionContext::new();

0 commit comments

Comments
 (0)