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 74f6d7ea [SEDONA-109] Add ST_OrderingEquals to Apache Sedona (#626)
74f6d7ea is described below

commit 74f6d7eaa470a22ff73237048c7c2071bfa73014
Author: Magdalena <[email protected]>
AuthorDate: Tue May 10 18:44:46 2022 +0200

    [SEDONA-109] Add ST_OrderingEquals to Apache Sedona (#626)
---
 docs/api/flink/Predicate.md                        | 23 +++++++++++++-
 docs/api/sql/Function.md                           |  2 +-
 docs/api/sql/Predicate.md                          | 23 +++++++++++++-
 .../main/java/org/apache/sedona/flink/Catalog.java |  1 +
 .../sedona/flink/expressions/Predicates.java       | 24 ++++++++++++++
 python/tests/sql/test_function.py                  |  2 +-
 python/tests/sql/test_predicate.py                 | 10 ++++++
 .../scala/org/apache/sedona/sql/UDF/Catalog.scala  |  1 +
 .../sql/sedona_sql/expressions/Functions.scala     |  2 +-
 .../sql/sedona_sql/expressions/Predicates.scala    | 37 +++++++++++++++++++++-
 .../org/apache/sedona/sql/predicateTestScala.scala | 11 +++++++
 11 files changed, 130 insertions(+), 6 deletions(-)

diff --git a/docs/api/flink/Predicate.md b/docs/api/flink/Predicate.md
index 78de24a8..6b701bf3 100644
--- a/docs/api/flink/Predicate.md
+++ b/docs/api/flink/Predicate.md
@@ -41,4 +41,25 @@ Spark SQL example:
 SELECT *
 FROM pointdf 
 WHERE ST_Disjoinnt(ST_PolygonFromEnvelope(1.0,100.0,1000.0,1100.0), 
pointdf.arealandmark)
-```
\ No newline at end of file
+```
+
+## ST_OrderingEquals
+Introduction: Returns true if the geometries are equal and the coordinates are 
in the same order
+
+Format: `ST_OrderingEquals(A: geometry, B: geometry)`
+
+Since: `v1.2.1`
+
+SQL example 1:
+```SQL
+SELECT ST_OrderingEquals(ST_GeomFromWKT('POLYGON((2 0, 0 2, -2 0, 2 0))'), 
ST_GeomFromWKT('POLYGON((2 0, 0 2, -2 0, 2 0))'))
+```
+
+Output: `true`
+
+SQL example 2:
+```SQL
+SELECT ST_OrderingEquals(ST_GeomFromWKT('POLYGON((2 0, 0 2, -2 0, 2 0))'), 
ST_GeomFromWKT('POLYGON((0 2, -2 0, 2 0, 0 2))'))
+```
+
+Output: `false`
\ No newline at end of file
diff --git a/docs/api/sql/Function.md b/docs/api/sql/Function.md
index 282b4d18..518641bf 100644
--- a/docs/api/sql/Function.md
+++ b/docs/api/sql/Function.md
@@ -1266,4 +1266,4 @@ Result:
 +----------------------------------------------------------------------------+
 |POLYGON((0 0,0 20,20 20,20 0,0 0),(2 2,18 2,18 18,2 18,2 2))                |
 +----------------------------------------------------------------------------+
-```
\ No newline at end of file
+```
diff --git a/docs/api/sql/Predicate.md b/docs/api/sql/Predicate.md
index ee8b2bc5..e792d1b7 100644
--- a/docs/api/sql/Predicate.md
+++ b/docs/api/sql/Predicate.md
@@ -115,4 +115,25 @@ Spark SQL example:
 SELECT *
 FROM geom
 WHERE ST_Disjoinnt(geom.geom_a, geom.geom_b)
-```
\ No newline at end of file
+```
+
+## ST_OrderingEquals
+Introduction: Returns true if the geometries are equal and the coordinates are 
in the same order
+
+Format: `ST_OrderingEquals(A: geometry, B: geometry)`
+
+Since: `v1.2.1`
+
+Spark SQL example 1:
+```SQL
+SELECT ST_OrderingEquals(ST_GeomFromWKT('POLYGON((2 0, 0 2, -2 0, 2 0))'), 
ST_GeomFromWKT('POLYGON((2 0, 0 2, -2 0, 2 0))'))
+```
+
+Output: `true`
+
+Spark SQL example 2:
+```SQL
+SELECT ST_OrderingEquals(ST_GeomFromWKT('POLYGON((2 0, 0 2, -2 0, 2 0))'), 
ST_GeomFromWKT('POLYGON((0 2, -2 0, 2 0, 0 2))'))
+```
+
+Output: `false`
\ No newline at end of file
diff --git a/flink/src/main/java/org/apache/sedona/flink/Catalog.java 
b/flink/src/main/java/org/apache/sedona/flink/Catalog.java
index 940b984b..eac9b4f9 100644
--- a/flink/src/main/java/org/apache/sedona/flink/Catalog.java
+++ b/flink/src/main/java/org/apache/sedona/flink/Catalog.java
@@ -52,6 +52,7 @@ public class Catalog {
                 new Predicates.ST_Intersects(),
                 new Predicates.ST_Contains(),
                 new Predicates.ST_Disjoint(),
+                new Predicates.ST_OrderingEquals(),
         };
     }
 }
diff --git 
a/flink/src/main/java/org/apache/sedona/flink/expressions/Predicates.java 
b/flink/src/main/java/org/apache/sedona/flink/expressions/Predicates.java
index d0ecd174..55f7945b 100644
--- a/flink/src/main/java/org/apache/sedona/flink/expressions/Predicates.java
+++ b/flink/src/main/java/org/apache/sedona/flink/expressions/Predicates.java
@@ -128,4 +128,28 @@ public class Predicates {
             return geom1.disjoint(geom2);
         }
     }
+
+    public static class ST_OrderingEquals extends ScalarFunction {
+        private List<Envelope> grids;
+
+        /**
+         * Constructor for duplicate removal
+         */
+        public ST_OrderingEquals(PartitioningUtils partitioner) {
+            grids = partitioner.fetchLeafZones();
+        }
+
+        /**
+         * Constructor for relation checking without duplicate removal
+         */
+        public ST_OrderingEquals() {
+        }
+
+        @DataTypeHint("Boolean")
+        public Boolean eval(@DataTypeHint(value = "RAW", bridgedTo = 
org.locationtech.jts.geom.Geometry.class) Object o1, @DataTypeHint(value = 
"RAW", bridgedTo = org.locationtech.jts.geom.Geometry.class) Object o2) {
+            Geometry geom1 = (Geometry) o1;
+            Geometry geom2 = (Geometry) o2;
+            return geom1.equalsExact(geom2);
+        }
+    }
 }
diff --git a/python/tests/sql/test_function.py 
b/python/tests/sql/test_function.py
index 9b674999..cdb23587 100644
--- a/python/tests/sql/test_function.py
+++ b/python/tests/sql/test_function.py
@@ -1016,4 +1016,4 @@ class TestPredicateJoin(TestBase):
 
         for input_geom, expected_geom in tests.items():
             areal_geom = self.spark.sql("select 
ST_AsText(ST_BuildArea(ST_GeomFromText({})))".format(input_geom))
-            assert areal_geom.take(1)[0][0] == expected_geom
\ No newline at end of file
+            assert areal_geom.take(1)[0][0] == expected_geom
diff --git a/python/tests/sql/test_predicate.py 
b/python/tests/sql/test_predicate.py
index 8daf37da..1f56aee1 100644
--- a/python/tests/sql/test_predicate.py
+++ b/python/tests/sql/test_predicate.py
@@ -206,3 +206,13 @@ class TestPredicate(TestBase):
         not_overlaps = self.spark.sql("select ST_Overlaps(c,d) from testtable")
         assert overlaps.take(1)[0][0]
         assert not not_overlaps.take(1)[0][0]
+
+    def test_st_ordering_equals_ok(self):
+        test_table = self.spark.sql("select ST_GeomFromWKT('POLYGON((2 0, 0 2, 
-2 0, 2 0))') as a, ST_GeomFromWKT('POLYGON((2 0, 0 2, -2 0, 2 0))') as b, 
ST_GeomFromWKT('POLYGON((2 0, 0 2, -2 0, 0 -2, 2 0))') as c, 
ST_GeomFromWKT('POLYGON((0 2, -2 0, 2 0, 0 2))') as d")
+        test_table.createOrReplaceTempView("testorderingequals")
+        order_equals = self.spark.sql("select ST_OrderingEquals(a,b) from 
testorderingequals")
+        not_order_equals_diff_geom = self.spark.sql("select 
ST_OrderingEquals(a,c) from testorderingequals")
+        not_order_equals_diff_order = self.spark.sql("select 
ST_OrderingEquals(a,d) from testorderingequals")
+        assert order_equals.take(1)[0][0]
+        assert not not_order_equals_diff_geom.take(1)[0][0]
+        assert not not_order_equals_diff_order.take(1)[0][0]
diff --git a/sql/src/main/scala/org/apache/sedona/sql/UDF/Catalog.scala 
b/sql/src/main/scala/org/apache/sedona/sql/UDF/Catalog.scala
index 5ebd580e..dbb402f5 100644
--- a/sql/src/main/scala/org/apache/sedona/sql/UDF/Catalog.scala
+++ b/sql/src/main/scala/org/apache/sedona/sql/UDF/Catalog.scala
@@ -114,6 +114,7 @@ object Catalog {
     ST_XMax,
     ST_XMin,
     ST_BuildArea,
+    ST_OrderingEquals,
     // Expression for rasters
     RS_NormalizedDifference,
     RS_Mean,
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 96b9f31f..738e8001 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
@@ -1810,4 +1810,4 @@ case class ST_BuildArea(inputExpressions: Seq[Expression])
   protected def withNewChildrenInternal(newChildren: IndexedSeq[Expression]): 
Expression = {
     copy(inputExpressions = newChildren)
   }
-}
+}
\ No newline at end of file
diff --git 
a/sql/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/Predicates.scala
 
b/sql/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/Predicates.scala
index bce0ead8..aca0360a 100644
--- 
a/sql/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/Predicates.scala
+++ 
b/sql/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/Predicates.scala
@@ -23,7 +23,8 @@ import org.apache.spark.sql.catalyst.InternalRow
 import org.apache.spark.sql.catalyst.expressions.Expression
 import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback
 import org.apache.spark.sql.catalyst.util.ArrayData
-import org.apache.spark.sql.types.BooleanType
+import org.apache.spark.sql.types.{BooleanType, DataType}
+import org.locationtech.jts.geom.Geometry
 
 abstract class ST_Predicate extends Expression
 
@@ -304,3 +305,37 @@ case class ST_Disjoint(inputExpressions: Seq[Expression])
     copy(inputExpressions = newChildren)
   }
 }
+
+/**
+ * Test if leftGeometry is order equal to rightGeometry
+ *
+ * @param inputExpressions
+ */
+case class ST_OrderingEquals(inputExpressions: Seq[Expression])
+  extends ST_Predicate with CodegenFallback {
+  override def nullable: Boolean = false
+
+  // This is a binary expression
+  assert(inputExpressions.length == 2)
+
+  override def toString: String = s" **${ST_OrderingEquals.getClass.getName}** 
 "
+
+  override def children: Seq[Expression] = inputExpressions
+
+  override def eval(inputRow: InternalRow): Any = {
+    val leftArray = inputExpressions(0).eval(inputRow).asInstanceOf[ArrayData]
+    val rightArray = inputExpressions(1).eval(inputRow).asInstanceOf[ArrayData]
+
+    val leftGeometry = GeometrySerializer.deserialize(leftArray)
+
+    val rightGeometry = GeometrySerializer.deserialize(rightArray)
+
+    leftGeometry.equalsExact(rightGeometry)
+  }
+
+  override def dataType = BooleanType
+
+  protected def withNewChildrenInternal(newChildren: IndexedSeq[Expression]) = 
{
+    copy(inputExpressions = newChildren)
+  }
+}
\ No newline at end of file
diff --git a/sql/src/test/scala/org/apache/sedona/sql/predicateTestScala.scala 
b/sql/src/test/scala/org/apache/sedona/sql/predicateTestScala.scala
index 00063c6b..cfec4917 100644
--- a/sql/src/test/scala/org/apache/sedona/sql/predicateTestScala.scala
+++ b/sql/src/test/scala/org/apache/sedona/sql/predicateTestScala.scala
@@ -198,5 +198,16 @@ class predicateTestScala extends TestBaseScala {
       assert(disjoint.take(1)(0).get(0) == true)
       assert(notdisjoint.take(1)(0).get(0) == false)
     }
+
+    it("Passed ST_OrderingEquals") {
+      var testtable = sparkSession.sql("select ST_GeomFromWKT('POLYGON((2 0, 0 
2, -2 0, 2 0))') as a, ST_GeomFromWKT('POLYGON((2 0, 0 2, -2 0, 2 0))') as b, 
ST_GeomFromWKT('POLYGON((2 0, 0 2, -2 0, 0 -2, 2 0))') as c, 
ST_GeomFromWKT('POLYGON((0 2, -2 0, 2 0, 0 2))') as d")
+      testtable.createOrReplaceTempView("testtable")
+      var orderEquals = sparkSession.sql("select ST_OrderingEquals(a,b) from 
testtable")
+      var notOrderEqualsDiffGeom = sparkSession.sql("select 
ST_OrderingEquals(a,c) from testtable")
+      var notOrderEqualsDiffOrder = sparkSession.sql("select 
ST_OrderingEquals(a,d) from testtable")
+      assert(orderEquals.take(1)(0).get(0).asInstanceOf[Boolean])
+      assert(!notOrderEqualsDiffGeom.take(1)(0).get(0).asInstanceOf[Boolean])
+      assert(!notOrderEqualsDiffOrder.take(1)(0).get(0).asInstanceOf[Boolean])
+    }
   }
 }

Reply via email to