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(())
}