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

Reply via email to