You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sedona.apache.org by ji...@apache.org on 2022/11/16 03:31:28 UTC

[incubator-sedona] branch master updated: [SEDONA-193] Regression in ST_AsBinary (#713)

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

jiayu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-sedona.git


The following commit(s) were added to refs/heads/master by this push:
     new 5c88ab49 [SEDONA-193] Regression in ST_AsBinary (#713)
5c88ab49 is described below

commit 5c88ab4997de9d09c14b06234d72e384728cd9e0
Author: Martin Andersson <u....@gmail.com>
AuthorDate: Wed Nov 16 04:31:22 2022 +0100

    [SEDONA-193] Regression in ST_AsBinary (#713)
---
 common/src/main/java/org/apache/sedona/common/Functions.java     | 4 ++++
 .../src/main/java/org/apache/sedona/common/utils/GeomUtils.java  | 9 +++++++++
 .../org/apache/spark/sql/sedona_sql/expressions/Functions.scala  | 4 ++--
 sql/src/test/scala/org/apache/sedona/sql/functionTestScala.scala | 9 +++++++++
 4 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/common/src/main/java/org/apache/sedona/common/Functions.java b/common/src/main/java/org/apache/sedona/common/Functions.java
index 7d98bbad..46755855 100644
--- a/common/src/main/java/org/apache/sedona/common/Functions.java
+++ b/common/src/main/java/org/apache/sedona/common/Functions.java
@@ -242,6 +242,10 @@ public class Functions {
         return GeomUtils.getEWKB(geometry);
     }
 
+    public static byte[] asWKB(Geometry geometry) {
+        return GeomUtils.getWKB(geometry);
+    }
+
     public static String asGeoJson(Geometry geometry) {
         if (geometry == null) {
             return null;
diff --git a/common/src/main/java/org/apache/sedona/common/utils/GeomUtils.java b/common/src/main/java/org/apache/sedona/common/utils/GeomUtils.java
index b3d3cc7c..736b5bcc 100644
--- a/common/src/main/java/org/apache/sedona/common/utils/GeomUtils.java
+++ b/common/src/main/java/org/apache/sedona/common/utils/GeomUtils.java
@@ -158,6 +158,15 @@ public class GeomUtils {
         return writer.write(geometry);
     }
 
+    public static byte[] getWKB(Geometry geometry) {
+        if (geometry == null) {
+            return null;
+        }
+        int endian = ByteOrder.nativeOrder() == ByteOrder.BIG_ENDIAN ? ByteOrderValues.BIG_ENDIAN : ByteOrderValues.LITTLE_ENDIAN;
+        WKBWriter writer = new WKBWriter(GeomUtils.getDimension(geometry), endian, false);
+        return writer.write(geometry);
+    }
+
     public static Geometry get2dGeom(Geometry geom) {
         Coordinate[] coordinates = geom.getCoordinates();
         GeometryFactory geometryFactory = new GeometryFactory();
diff --git a/sql/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/Functions.scala b/sql/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/Functions.scala
index a51231c9..298174c2 100644
--- a/sql/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/Functions.scala
+++ b/sql/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/Functions.scala
@@ -298,14 +298,14 @@ case class ST_AsGeoJSON(inputExpressions: Seq[Expression])
 // TODO: sernetcdf is bundled with an ancient version of apache commons-codec, which
 // causes spark sql to throw NoSuchMethodError when folding binary expressions.
 case class ST_AsBinary(inputExpressions: Seq[Expression])
-  extends InferredUnaryExpression(Functions.asEWKB) {
+  extends InferredUnaryExpression(Functions.asWKB) {
 
   protected def withNewChildrenInternal(newChildren: IndexedSeq[Expression]) = {
     copy(inputExpressions = newChildren)
   }
 }
 
-// TODO: ST_AsEWKB is an alias of ST_AsBinary, which is also affected by the sernetcdf
+// TODO: ST_AsEWKB is similar to ST_AsBinary, which is also affected by the sernetcdf
 // problem.
 case class ST_AsEWKB(inputExpressions: Seq[Expression])
   extends InferredUnaryExpression(Functions.asEWKB) {
diff --git a/sql/src/test/scala/org/apache/sedona/sql/functionTestScala.scala b/sql/src/test/scala/org/apache/sedona/sql/functionTestScala.scala
index 99d68d51..a0cd4a33 100644
--- a/sql/src/test/scala/org/apache/sedona/sql/functionTestScala.scala
+++ b/sql/src/test/scala/org/apache/sedona/sql/functionTestScala.scala
@@ -373,6 +373,15 @@ class functionTestScala extends TestBaseScala with Matchers with GeometrySample
       assert(Hex.encodeHexString(df.first().get(0).asInstanceOf[Array[Byte]]) == s)
     }
 
+    it("Passed ST_AsBinary with srid") {
+      // ST_AsBinary should return a WKB.
+      // WKB does not contain any srid.
+      val df = sparkSession.sql("SELECT ST_AsBinary(ST_SetSRID(ST_Point(1.0,1.0), 3021)), ST_AsBinary(ST_Point(1.0,1.0))")
+      val withSrid: Array[Byte] = df.first().getAs(0)
+      val withoutSrid: Array[Byte] = df.first().getAs(1)
+      assert(withSrid.seq == withoutSrid.seq)
+    }
+
     it("Passed ST_AsGML") {
       val df = sparkSession.sql("SELECT ST_GeomFromWKT('POLYGON((1 1, 8 1, 8 8, 1 8, 1 1))') AS polygon")
       df.createOrReplaceTempView("table")