This is an automated email from the ASF dual-hosted git repository. imbruced pushed a commit to branch add-sedona-serializer in repository https://gitbox.apache.org/repos/asf/sedona-db.git
commit fd739ab31b933fc459bad3c13465b92e2eec9322 Author: pawelkocinski <[email protected]> AuthorDate: Fri Dec 19 00:27:29 2025 +0100 restructure files --- rust/sedona-functions/src/st_to_sedona_spark.rs | 31 +++++++++++++++++++++++-- rust/sedona-serde/src/serialize.rs | 6 ++--- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/rust/sedona-functions/src/st_to_sedona_spark.rs b/rust/sedona-functions/src/st_to_sedona_spark.rs index ceac7446..e5a77e41 100644 --- a/rust/sedona-functions/src/st_to_sedona_spark.rs +++ b/rust/sedona-functions/src/st_to_sedona_spark.rs @@ -38,8 +38,15 @@ impl SedonaScalarKernel for STGeomToSedonaSpark { SedonaType::Wkb(_, crs) => { match crs { Some(_crs) => { - Ok(Some(4326)) - }, + let crs_id = _crs.srid()?; + + match crs_id { + Some(srid) => Ok(Some(srid)), + None => Err(datafusion_common::DataFusionError::Internal( + "ST_GeomToSedonaSpark: Unsupported CRS without SRID".to_string(), + )), + } + } None => Ok(None), } // @@ -93,6 +100,7 @@ mod tests { use crate::st_to_sedona_spark::st_geomtosedona_udf; use datafusion_common::ScalarValue; use rstest::rstest; + use sedona_schema::crs::{deserialize_crs, lnglat}; use sedona_schema::datatypes::{Edges, SedonaType}; use sedona_testing::create::create_scalar; use sedona_testing::testers::ScalarUdfTester; @@ -206,4 +214,23 @@ mod tests { assert_eq!(result, ScalarValue::Binary(Some(binary_geometry))); } + + #[test] + fn test_serialization_with_crs() { + let crs = deserialize_crs("EPSG:4326").unwrap(); // to ensure Crs can be deserialized to provide + + let tester = ScalarUdfTester::new( + st_geomtosedona_udf().into(), + vec![SedonaType::Wkb(Edges::Planar, crs.clone())], + ); + + let geometry = create_scalar(Some(POINT_WKT), &SedonaType::Wkb(Edges::Planar, crs)); + + let result = tester.invoke_scalar(geometry).unwrap(); + + let expected_fixture = include_str!("fixtures/crs_point.sedona"); + let binary_geometry = fixture_to_bytes(expected_fixture); + + assert_eq!(result, ScalarValue::Binary(Some(binary_geometry))); + } } diff --git a/rust/sedona-serde/src/serialize.rs b/rust/sedona-serde/src/serialize.rs index 0f8a4941..fe73a9c7 100644 --- a/rust/sedona-serde/src/serialize.rs +++ b/rust/sedona-serde/src/serialize.rs @@ -4,14 +4,14 @@ use crate::polygon::{serialize_multipolygon, serialize_polygon}; use arrow_array::builder::BinaryBuilder; use byteorder::{ByteOrder, LittleEndian, ReadBytesExt, WriteBytesExt}; use datafusion_common::DataFusionError; -use std::io::{Cursor}; +use std::io::Cursor; use wkb::reader::Wkb; use wkt::types::Dimension; pub fn serialize( wkb: &Wkb, builder: &mut BinaryBuilder, - epsg_crs: Option<i32>, + epsg_crs: Option<u32>, ) -> datafusion_common::Result<()> { use std::io::Cursor; let mut cursor = Cursor::new(wkb.buf()); @@ -35,7 +35,7 @@ pub fn serialize( pub fn write_geometry<IN: ByteOrder, OUT: ByteOrder>( builder: &mut BinaryBuilder, cursor: &mut Cursor<&[u8]>, - epsg_crs: Option<i32>, + epsg_crs: Option<u32>, ) -> datafusion_common::Result<()> { let geometry_type = cursor.read_u32::<IN>()?; verify_geometry_type(geometry_type)?;
