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])
+ }
}
}