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 b03958d7 [SEDONA 95] Add ST_Disjoint predicate (#610)
b03958d7 is described below
commit b03958d738b2a2fbcfe720a115787e2485f12ef4
Author: Onkar Pandit <[email protected]>
AuthorDate: Mon Apr 18 17:56:34 2022 -0700
[SEDONA 95] Add ST_Disjoint predicate (#610)
---
docs/api/flink/Predicate.md | 15 ++++++++++
docs/api/sql/Predicate.md | 15 ++++++++++
docs/archive/api/sql/GeoSparkSQL-Predicate.md | 2 +-
.../main/java/org/apache/sedona/flink/Catalog.java | 3 +-
.../sedona/flink/expressions/Predicates.java | 24 +++++++++++++++
.../org/apache/sedona/flink/PredicateTest.java | 9 ++++++
.../scala/org/apache/sedona/sql/UDF/Catalog.scala | 1 +
.../sql/sedona_sql/expressions/Predicates.scala | 34 ++++++++++++++++++++++
.../org/apache/sedona/sql/predicateTestScala.scala | 8 +++++
9 files changed, 109 insertions(+), 2 deletions(-)
diff --git a/docs/api/flink/Predicate.md b/docs/api/flink/Predicate.md
index 4e4fce67..78de24a8 100644
--- a/docs/api/flink/Predicate.md
+++ b/docs/api/flink/Predicate.md
@@ -26,4 +26,19 @@ SQL example:
SELECT *
FROM pointdf
WHERE ST_Intersects(ST_PolygonFromEnvelope(1.0,100.0,1000.0,1100.0),
pointdf.arealandmark)
+```
+
+## ST_Disjoint
+
+Introduction: Return true if A and B are disjoint
+
+Format: `ST_Disjoint (A:geometry, B:geometry)`
+
+Since: `v1.2.1`
+
+Spark SQL example:
+```SQL
+SELECT *
+FROM pointdf
+WHERE ST_Disjoinnt(ST_PolygonFromEnvelope(1.0,100.0,1000.0,1100.0),
pointdf.arealandmark)
```
\ No newline at end of file
diff --git a/docs/api/sql/Predicate.md b/docs/api/sql/Predicate.md
index 20f0f4b1..ee8b2bc5 100644
--- a/docs/api/sql/Predicate.md
+++ b/docs/api/sql/Predicate.md
@@ -100,4 +100,19 @@ Spark SQL example:
SELECT *
FROM geom
WHERE ST_Overlaps(geom.geom_a, geom.geom_b)
+```
+
+## ST_Disjoint
+
+Introduction: Return true if A and B are disjoint
+
+Format: `ST_Disjoint (A:geometry, B:geometry)`
+
+Since: `v1.2.1`
+
+Spark SQL example:
+```SQL
+SELECT *
+FROM geom
+WHERE ST_Disjoinnt(geom.geom_a, geom.geom_b)
```
\ No newline at end of file
diff --git a/docs/archive/api/sql/GeoSparkSQL-Predicate.md
b/docs/archive/api/sql/GeoSparkSQL-Predicate.md
index 50f858d8..9ab2cb23 100644
--- a/docs/archive/api/sql/GeoSparkSQL-Predicate.md
+++ b/docs/archive/api/sql/GeoSparkSQL-Predicate.md
@@ -100,4 +100,4 @@ Spark SQL example:
SELECT *
FROM geom
WHERE ST_Overlaps(geom.geom_a, geom.geom_b)
-```
\ 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 b855c74d..618b00e6 100644
--- a/flink/src/main/java/org/apache/sedona/flink/Catalog.java
+++ b/flink/src/main/java/org/apache/sedona/flink/Catalog.java
@@ -39,7 +39,8 @@ public class Catalog {
public static UserDefinedFunction[] getPredicates() {
return new UserDefinedFunction[]{
new Predicates.ST_Intersects(),
- new Predicates.ST_Contains()
+ new Predicates.ST_Contains(),
+ new Predicates.ST_Disjoint(),
};
}
}
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 eedcc1c5..d0ecd174 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
@@ -104,4 +104,28 @@ public class Predicates {
return JudgementHelper.match(geom1, geom2, halfOpenRectangle,
false);
}
}
+
+ public static class ST_Disjoint extends ScalarFunction {
+ private List<Envelope> grids;
+
+ /**
+ * Constructor for duplicate removal
+ */
+ public ST_Disjoint(PartitioningUtils partitioner) {
+ grids = partitioner.fetchLeafZones();
+ }
+
+ /**
+ * Constructor for relation checking without duplicate removal
+ */
+ public ST_Disjoint() {
+ }
+
+ @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.disjoint(geom2);
+ }
+ }
}
diff --git a/flink/src/test/java/org/apache/sedona/flink/PredicateTest.java
b/flink/src/test/java/org/apache/sedona/flink/PredicateTest.java
index 0b3594aa..2061ca12 100644
--- a/flink/src/test/java/org/apache/sedona/flink/PredicateTest.java
+++ b/flink/src/test/java/org/apache/sedona/flink/PredicateTest.java
@@ -33,4 +33,13 @@ public class PredicateTest extends TestBase{
Table result = pointTable.filter(expr);
assertEquals(count(result), 1);
}
+
+ @Test
+ public void testDisjoint() {
+ Table pointTable = createPointTable(testDataSize);
+ String polygon =
createPolygonWKT(testDataSize).get(0).getField(0).toString();
+ String expr = "ST_Disjoint(ST_GeomFromWkt('" + polygon + "'),
geom_point)";
+ Table result = pointTable.filter(expr);
+ assertEquals(count(result), 999);
+ }
}
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 e078afb3..1759e543 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
@@ -40,6 +40,7 @@ object Catalog {
ST_Contains,
ST_Intersects,
ST_Within,
+ ST_Disjoint,
ST_Distance,
ST_3DDistance,
ST_ConvexHull,
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 82b80aec..3f5d2894 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
@@ -266,6 +266,40 @@ case class ST_Equals(inputExpressions: Seq[Expression])
override def dataType = BooleanType
+ protected def withNewChildrenInternal(newChildren: IndexedSeq[Expression]) =
{
+ copy(inputExpressions = newChildren)
+ }
+}
+
+/**
+ * Test if leftGeometry is disjoint from rightGeometry
+ *
+ * @param inputExpressions
+ */
+case class ST_Disjoint(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_Disjoint.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.disjoint(rightGeometry)
+ }
+
+ override def dataType = BooleanType
+
protected def withNewChildrenInternal(newChildren: IndexedSeq[Expression]) =
{
copy(inputExpressions = newChildren)
}
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 95fd7848..00063c6b 100644
--- a/sql/src/test/scala/org/apache/sedona/sql/predicateTestScala.scala
+++ b/sql/src/test/scala/org/apache/sedona/sql/predicateTestScala.scala
@@ -190,5 +190,13 @@ class predicateTestScala extends TestBaseScala {
assert(overlaps.take(1)(0).get(0) == true)
assert(notoverlaps.take(1)(0).get(0) == false)
}
+ it("Passed ST_Disjoint") {
+ var testtable = sparkSession.sql("select ST_GeomFromWKT('POLYGON((1 4,
4.5 4, 4.5 2, 1 2, 1 4))') as a,ST_GeomFromWKT('POLYGON((5 4, 6 4, 6 2, 5 2, 5
4))') as b, ST_GeomFromWKT('POLYGON((1 9, 6 6, 6 4, 1 2,1 9))') as c,
ST_GeomFromWKT('POLYGON((2 5, 4 5, 4 1, 2 1, 2 5))') as d")
+ testtable.createOrReplaceTempView("testtable")
+ var disjoint = sparkSession.sql("select ST_Disjoint(a,b) from testtable")
+ var notdisjoint = sparkSession.sql("select ST_Disjoint(c,d) from
testtable")
+ assert(disjoint.take(1)(0).get(0) == true)
+ assert(notdisjoint.take(1)(0).get(0) == false)
+ }
}
}