diff --git a/c/sedona-geos/benches/geos-functions.rs b/c/sedona-geos/benches/geos-functions.rs index b8c0e278c..c31bc3d5e 100644 --- a/c/sedona-geos/benches/geos-functions.rs +++ b/c/sedona-geos/benches/geos-functions.rs @@ -237,13 +237,13 @@ fn criterion_benchmark(c: &mut Criterion) { benchmark::scalar(c, &f, "geos", "st_length", LineString(500)); benchmark::scalar(c, &f, "geos", "st_makevalid", Polygon(10)); - benchmark::scalar(c, &f, "geos", "st_makevalid", Polygon(10)); + benchmark::scalar(c, &f, "geos", "st_makevalid", Polygon(100)); benchmark::scalar(c, &f, "geos", "st_minimumclearance", Polygon(10)); benchmark::scalar(c, &f, "geos", "st_minimumclearance", Polygon(10)); benchmark::scalar(c, &f, "geos", "st_minimumclearanceline", LineString(10)); - benchmark::scalar(c, &f, "geos", "st_minimumclearanceline", LineString(500)); + benchmark::scalar(c, &f, "geos", "st_minimumclearanceline", LineString(50)); benchmark::scalar( c, @@ -263,6 +263,9 @@ fn criterion_benchmark(c: &mut Criterion) { benchmark::scalar(c, &f, "geos", "st_perimeter", Polygon(10)); benchmark::scalar(c, &f, "geos", "st_perimeter", Polygon(500)); + benchmark::scalar(c, &f, "geos", "st_polygonize", LineString(10)); + benchmark::scalar(c, &f, "geos", "st_polygonize", LineString(500)); + benchmark::scalar( c, &f, @@ -278,6 +281,22 @@ fn criterion_benchmark(c: &mut Criterion) { ArrayScalar(Polygon(500), Float64(1.0, 10.0)), ); + benchmark::scalar( + c, + &f, + "geos", + "st_simplifypreservetopology", + ArrayScalar(Polygon(10), Float64(1.0, 10.0)), + ); + + benchmark::scalar( + c, + &f, + "geos", + "st_simplifypreservetopology", + ArrayScalar(Polygon(25), Float64(1.0, 10.0)), + ); + benchmark::scalar( c, &f, diff --git a/c/sedona-geos/src/overlay.rs b/c/sedona-geos/src/overlay.rs index 6ce2c03ea..0b405cf5c 100644 --- a/c/sedona-geos/src/overlay.rs +++ b/c/sedona-geos/src/overlay.rs @@ -28,6 +28,7 @@ use sedona_schema::{ }; use crate::executor::GeosExecutor; +use crate::geos_to_wkb::write_geos_geometry; pub fn st_intersection_impl() -> ScalarKernelRef { Arc::new(BinaryOverlay { @@ -107,11 +108,8 @@ where )) })?; - let wkb = geom.to_wkb().map_err(|e| { - DataFusionError::Execution(format!("Failed to convert to WKB: {e}")) - })?; - - builder.append_value(&wkb); + write_geos_geometry(&geom, &mut builder)?; + builder.append_value(vec![]); } _ => builder.append_null(), }; diff --git a/c/sedona-geos/src/st_makevalid.rs b/c/sedona-geos/src/st_makevalid.rs index 74c63a2b3..fa17df644 100644 --- a/c/sedona-geos/src/st_makevalid.rs +++ b/c/sedona-geos/src/st_makevalid.rs @@ -29,6 +29,7 @@ use sedona_schema::{ }; use crate::executor::GeosExecutor; +use crate::geos_to_wkb::write_geos_geometry; /// ST_MakeValid() implementation using the geos crate pub fn st_make_valid_impl() -> ScalarKernelRef { @@ -77,11 +78,7 @@ fn invoke_scalar(geos_geom: &geos::Geometry, writer: &mut impl std::io::Write) - .make_valid() .map_err(|e| DataFusionError::Execution(format!("Failed to make geometry valid: {e}")))?; - let wkb = geometry - .to_wkb() - .map_err(|e| DataFusionError::Execution(format!("Failed to convert to wkb: {e}")))?; - - writer.write_all(wkb.as_ref())?; + write_geos_geometry(&geometry, writer)?; Ok(()) } diff --git a/c/sedona-geos/src/st_minimumclearance_line.rs b/c/sedona-geos/src/st_minimumclearance_line.rs index 313bf54df..a5fcd9919 100644 --- a/c/sedona-geos/src/st_minimumclearance_line.rs +++ b/c/sedona-geos/src/st_minimumclearance_line.rs @@ -29,6 +29,7 @@ use sedona_schema::{ }; use crate::executor::GeosExecutor; +use crate::geos_to_wkb::write_geos_geometry; /// ST_MinimumClearanceLine() implementation using the geos crate pub fn st_minimum_clearance_line_impl() -> ScalarKernelRef { @@ -79,11 +80,7 @@ fn invoke_scalar(geos_geom: &geos::Geometry, writer: &mut impl std::io::Write) - )) })?; - let wkb = geometry - .to_wkb() - .map_err(|e| DataFusionError::Execution(format!("Failed to convert to wkb: {e}")))?; - - writer.write_all(wkb.as_ref())?; + write_geos_geometry(&geometry, writer)?; Ok(()) } diff --git a/c/sedona-geos/src/st_polygonize.rs b/c/sedona-geos/src/st_polygonize.rs index 9023d7d28..078352b18 100644 --- a/c/sedona-geos/src/st_polygonize.rs +++ b/c/sedona-geos/src/st_polygonize.rs @@ -20,7 +20,6 @@ use std::sync::Arc; use arrow_array::builder::BinaryBuilder; use datafusion_common::{DataFusionError, Result}; use datafusion_expr::ColumnarValue; -use geos::Geom; use sedona_expr::scalar_udf::{ScalarKernelRef, SedonaScalarKernel}; use sedona_geometry::wkb_factory::WKB_MIN_PROBABLE_BYTES; use sedona_schema::{ @@ -29,6 +28,7 @@ use sedona_schema::{ }; use crate::executor::GeosExecutor; +use crate::geos_to_wkb::write_geos_geometry; /// ST_Polygonize() scalar implementation using GEOS pub fn st_polygonize_impl() -> ScalarKernelRef { @@ -74,12 +74,7 @@ fn invoke_scalar(geos_geom: &geos::Geometry, writer: &mut impl std::io::Write) - let result = geos::Geometry::polygonize(&[geos_geom]) .map_err(|e| DataFusionError::Execution(format!("Failed to polygonize: {e}")))?; - let wkb = result - .to_wkb() - .map_err(|e| DataFusionError::Execution(format!("Failed to convert result to WKB: {e}")))?; - writer - .write_all(wkb.as_ref()) - .map_err(|e| DataFusionError::Execution(format!("Failed to write result WKB: {e}")))?; + write_geos_geometry(&result, writer)?; Ok(()) } diff --git a/c/sedona-geos/src/st_simplifypreservetopology.rs b/c/sedona-geos/src/st_simplifypreservetopology.rs index 77e0331a9..43d4b0a11 100644 --- a/c/sedona-geos/src/st_simplifypreservetopology.rs +++ b/c/sedona-geos/src/st_simplifypreservetopology.rs @@ -23,7 +23,6 @@ use datafusion_common::cast::as_float64_array; use datafusion_common::error::Result; use datafusion_common::DataFusionError; use datafusion_expr::ColumnarValue; -use geos::Geom; use sedona_expr::scalar_udf::{ScalarKernelRef, SedonaScalarKernel}; use sedona_geometry::wkb_factory::WKB_MIN_PROBABLE_BYTES; use sedona_schema::{ @@ -32,6 +31,7 @@ use sedona_schema::{ }; use crate::executor::GeosExecutor; +use crate::geos_to_wkb::write_geos_geometry; /// ST_SimplifyPreserveTopology() implementation using the geos crate pub fn st_simplify_preserve_topology_impl() -> ScalarKernelRef { @@ -94,11 +94,7 @@ fn invoke_scalar( .topology_preserve_simplify(tolerance) .map_err(|e| DataFusionError::Execution(format!("Failed to simplify geometry: {e}")))?; - let wkb = geometry - .to_wkb() - .map_err(|e| DataFusionError::Execution(format!("Failed to convert to wkb: {e}")))?; - - writer.write_all(wkb.as_ref())?; + write_geos_geometry(&geometry, writer)?; Ok(()) }