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

petern pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/sedona-db.git


The following commit(s) were added to refs/heads/main by this push:
     new 9bf02f47 perf: Use write_geos_geometry() for makevalid, 
minimumclearance_line, polygonize, simplifypreservetopology, and overlays (#502)
9bf02f47 is described below

commit 9bf02f474d475b61a444e561ec74df449413f46b
Author: Peter Nguyen <[email protected]>
AuthorDate: Sat Jan 10 19:46:23 2026 -0800

    perf: Use write_geos_geometry() for makevalid, minimumclearance_line, 
polygonize, simplifypreservetopology, and overlays (#502)
---
 c/sedona-geos/benches/geos-functions.rs          | 23 +++++++++++++++++++++--
 c/sedona-geos/src/overlay.rs                     |  8 +++-----
 c/sedona-geos/src/st_makevalid.rs                |  7 ++-----
 c/sedona-geos/src/st_minimumclearance_line.rs    |  7 ++-----
 c/sedona-geos/src/st_polygonize.rs               |  9 ++-------
 c/sedona-geos/src/st_simplifypreservetopology.rs |  8 ++------
 6 files changed, 32 insertions(+), 30 deletions(-)

diff --git a/c/sedona-geos/benches/geos-functions.rs 
b/c/sedona-geos/benches/geos-functions.rs
index 06da384b..3dca26df 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 c00049e6..62d7e383 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 a96b535c..71011846 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 325142f8..984bdcb7 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 997a6411..71708984 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 f5245d0f..625ce19b 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(())
 }
 

Reply via email to