You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pinot.apache.org by ja...@apache.org on 2021/10/13 23:37:59 UTC

[pinot] branch master updated: Add geo type conversion scalar functions (#7573)

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

jackie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pinot.git


The following commit(s) were added to refs/heads/master by this push:
     new 0ecfc11  Add geo type conversion scalar functions (#7573)
0ecfc11 is described below

commit 0ecfc11535e24ed72404662e4c92c9cb869228fc
Author: Xiaotian (Jackie) Jiang <17...@users.noreply.github.com>
AuthorDate: Wed Oct 13 16:37:42 2021 -0700

    Add geo type conversion scalar functions (#7573)
    
    Add the following geo scalar functions for type conversion:
    - stGeomFromText
    - stGeogFromText
    - stGeomFromWKB
    - stGeogFromWKB
    - stAsBinary
---
 .../function/ConstructFromTextFunction.java        |  9 ++--
 .../function/ConstructFromWKBFunction.java         |  9 ++--
 .../transform/function/ScalarFunctions.java        | 52 ++++++++++++++++++++--
 .../transform/function/StAsBinaryFunction.java     | 13 +++---
 .../transform/function/StAsTextFunction.java       | 16 +++----
 .../transform/function/StGeogFromTextFunction.java |  6 +--
 .../transform/function/StGeogFromWKBFunction.java  |  6 +--
 .../transform/function/StGeomFromTextFunction.java | 10 ++---
 .../transform/function/StGeomFromWKBFunction.java  | 10 ++---
 .../transform/function/StPolygonFunction.java      |  6 +--
 .../apache/pinot/queries/StUnionQueriesTest.java   | 42 +++++++++++++----
 .../pinot/perf/BenchmarkGeospatialSerde.java       |  4 +-
 .../pinot/segment/local/utils/GeometryUtils.java   | 10 +++++
 13 files changed, 134 insertions(+), 59 deletions(-)

diff --git a/pinot-core/src/main/java/org/apache/pinot/core/geospatial/transform/function/ConstructFromTextFunction.java b/pinot-core/src/main/java/org/apache/pinot/core/geospatial/transform/function/ConstructFromTextFunction.java
index b7741fe..d0ff874 100644
--- a/pinot-core/src/main/java/org/apache/pinot/core/geospatial/transform/function/ConstructFromTextFunction.java
+++ b/pinot-core/src/main/java/org/apache/pinot/core/geospatial/transform/function/ConstructFromTextFunction.java
@@ -31,7 +31,6 @@ import org.apache.pinot.segment.local.utils.GeometrySerializer;
 import org.apache.pinot.segment.spi.datasource.DataSource;
 import org.apache.pinot.spi.data.FieldSpec;
 import org.locationtech.jts.geom.Geometry;
-import org.locationtech.jts.geom.GeometryFactory;
 import org.locationtech.jts.io.ParseException;
 import org.locationtech.jts.io.WKTReader;
 
@@ -46,18 +45,18 @@ abstract class ConstructFromTextFunction extends BaseTransformFunction {
 
   @Override
   public void init(List<TransformFunction> arguments, Map<String, DataSource> dataSourceMap) {
-    Preconditions
-        .checkArgument(arguments.size() == 1, "Exactly 1 argument is required for transform function: %s", getName());
+    Preconditions.checkArgument(arguments.size() == 1, "Exactly 1 argument is required for transform function: %s",
+        getName());
     TransformFunction transformFunction = arguments.get(0);
     Preconditions.checkArgument(transformFunction.getResultMetadata().isSingleValue(),
         "The argument must be single-valued for transform function: %s", getName());
     Preconditions.checkArgument(transformFunction.getResultMetadata().getDataType() == FieldSpec.DataType.STRING,
         "The argument must be of string type");
     _transformFunction = transformFunction;
-    _reader = new WKTReader(getGeometryFactory());
+    _reader = getWKTReader();
   }
 
-  abstract protected GeometryFactory getGeometryFactory();
+  abstract protected WKTReader getWKTReader();
 
   @Override
   public TransformResultMetadata getResultMetadata() {
diff --git a/pinot-core/src/main/java/org/apache/pinot/core/geospatial/transform/function/ConstructFromWKBFunction.java b/pinot-core/src/main/java/org/apache/pinot/core/geospatial/transform/function/ConstructFromWKBFunction.java
index 184f885..761fe06 100644
--- a/pinot-core/src/main/java/org/apache/pinot/core/geospatial/transform/function/ConstructFromWKBFunction.java
+++ b/pinot-core/src/main/java/org/apache/pinot/core/geospatial/transform/function/ConstructFromWKBFunction.java
@@ -31,7 +31,6 @@ import org.apache.pinot.segment.spi.datasource.DataSource;
 import org.apache.pinot.spi.data.FieldSpec;
 import org.apache.pinot.spi.utils.BytesUtils;
 import org.locationtech.jts.geom.Geometry;
-import org.locationtech.jts.geom.GeometryFactory;
 import org.locationtech.jts.io.ParseException;
 import org.locationtech.jts.io.WKBReader;
 
@@ -46,18 +45,18 @@ abstract class ConstructFromWKBFunction extends BaseTransformFunction {
 
   @Override
   public void init(List<TransformFunction> arguments, Map<String, DataSource> dataSourceMap) {
-    Preconditions
-        .checkArgument(arguments.size() == 1, "Exactly 1 argument is required for transform function: %s", getName());
+    Preconditions.checkArgument(arguments.size() == 1, "Exactly 1 argument is required for transform function: %s",
+        getName());
     TransformFunction transformFunction = arguments.get(0);
     Preconditions.checkArgument(transformFunction.getResultMetadata().isSingleValue(),
         "The argument must be single-valued for transform function: %s", getName());
     Preconditions.checkArgument(transformFunction.getResultMetadata().getDataType() == FieldSpec.DataType.BYTES,
         "The argument must be of bytes type");
     _transformFunction = transformFunction;
-    _reader = new WKBReader(getGeometryFactory());
+    _reader = getWKBReader();
   }
 
-  abstract protected GeometryFactory getGeometryFactory();
+  abstract protected WKBReader getWKBReader();
 
   @Override
   public TransformResultMetadata getResultMetadata() {
diff --git a/pinot-core/src/main/java/org/apache/pinot/core/geospatial/transform/function/ScalarFunctions.java b/pinot-core/src/main/java/org/apache/pinot/core/geospatial/transform/function/ScalarFunctions.java
index d8ea85b..4ea84e5 100644
--- a/pinot-core/src/main/java/org/apache/pinot/core/geospatial/transform/function/ScalarFunctions.java
+++ b/pinot-core/src/main/java/org/apache/pinot/core/geospatial/transform/function/ScalarFunctions.java
@@ -25,7 +25,7 @@ import org.apache.pinot.spi.annotations.ScalarFunction;
 import org.locationtech.jts.geom.Coordinate;
 import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.geom.Point;
-import org.locationtech.jts.io.WKTWriter;
+import org.locationtech.jts.io.ParseException;
 
 
 /**
@@ -65,6 +65,42 @@ public class ScalarFunctions {
   }
 
   /**
+   * Reads a geometry object from the WKT format.
+   */
+  @ScalarFunction
+  public static byte[] stGeomFromText(String wkt)
+      throws ParseException {
+    return GeometrySerializer.serialize(GeometryUtils.GEOMETRY_WKT_READER.read(wkt));
+  }
+
+  /**
+   * Reads a geography object from the WKT format.
+   */
+  @ScalarFunction
+  public static byte[] stGeogFromText(String wkt)
+      throws ParseException {
+    return GeometrySerializer.serialize(GeometryUtils.GEOGRAPHY_WKT_READER.read(wkt));
+  }
+
+  /**
+   * Reads a geometry object from the WKB format.
+   */
+  @ScalarFunction
+  public static byte[] stGeomFromWKB(byte[] wkb)
+      throws ParseException {
+    return GeometrySerializer.serialize(GeometryUtils.GEOMETRY_WKB_READER.read(wkb));
+  }
+
+  /**
+   * Reads a geography object from the WKB format.
+   */
+  @ScalarFunction
+  public static byte[] stGeogFromWKB(byte[] wkb)
+      throws ParseException {
+    return GeometrySerializer.serialize(GeometryUtils.GEOGRAPHY_WKB_READER.read(wkb));
+  }
+
+  /**
    * Saves the geometry object as WKT format.
    *
    * @param bytes the serialized geometry object
@@ -72,8 +108,18 @@ public class ScalarFunctions {
    */
   @ScalarFunction
   public static String stAsText(byte[] bytes) {
-    WKTWriter writer = new WKTWriter();
-    return writer.write(GeometrySerializer.deserialize(bytes));
+    return GeometryUtils.WKT_WRITER.write(GeometrySerializer.deserialize(bytes));
+  }
+
+  /**
+   * Saves the geometry object as WKB format.
+   *
+   * @param bytes the serialized geometry object
+   * @return the geometry in WKB
+   */
+  @ScalarFunction
+  public static byte[] stAsBinary(byte[] bytes) {
+    return GeometryUtils.WKB_WRITER.write(GeometrySerializer.deserialize(bytes));
   }
 
   /**
diff --git a/pinot-core/src/main/java/org/apache/pinot/core/geospatial/transform/function/StAsBinaryFunction.java b/pinot-core/src/main/java/org/apache/pinot/core/geospatial/transform/function/StAsBinaryFunction.java
index 134174b..66e3999 100644
--- a/pinot-core/src/main/java/org/apache/pinot/core/geospatial/transform/function/StAsBinaryFunction.java
+++ b/pinot-core/src/main/java/org/apache/pinot/core/geospatial/transform/function/StAsBinaryFunction.java
@@ -27,19 +27,19 @@ import org.apache.pinot.core.operator.transform.function.BaseTransformFunction;
 import org.apache.pinot.core.operator.transform.function.TransformFunction;
 import org.apache.pinot.core.plan.DocIdSetPlanNode;
 import org.apache.pinot.segment.local.utils.GeometrySerializer;
+import org.apache.pinot.segment.local.utils.GeometryUtils;
 import org.apache.pinot.segment.spi.datasource.DataSource;
 import org.apache.pinot.spi.data.FieldSpec;
 import org.locationtech.jts.geom.Geometry;
-import org.locationtech.jts.io.WKBWriter;
 
 
 /**
  * Returns the WKB representation of the geometry object.
  */
 public class StAsBinaryFunction extends BaseTransformFunction {
-  private TransformFunction _transformFunction;
-  private WKBWriter _writer;
   public static final String FUNCTION_NAME = "ST_AsBinary";
+
+  private TransformFunction _transformFunction;
   private byte[][] _results;
 
   @Override
@@ -49,15 +49,14 @@ public class StAsBinaryFunction extends BaseTransformFunction {
 
   @Override
   public void init(List<TransformFunction> arguments, Map<String, DataSource> dataSourceMap) {
-    Preconditions
-        .checkArgument(arguments.size() == 1, "Exactly 1 argument is required for transform function: %s", getName());
+    Preconditions.checkArgument(arguments.size() == 1, "Exactly 1 argument is required for transform function: %s",
+        getName());
     TransformFunction transformFunction = arguments.get(0);
     Preconditions.checkArgument(transformFunction.getResultMetadata().isSingleValue(),
         "Argument must be single-valued for transform function: %s", getName());
     Preconditions.checkArgument(transformFunction.getResultMetadata().getDataType() == FieldSpec.DataType.BYTES,
         "The argument must be of bytes type");
     _transformFunction = transformFunction;
-    _writer = new WKBWriter();
   }
 
   @Override
@@ -74,7 +73,7 @@ public class StAsBinaryFunction extends BaseTransformFunction {
     Geometry geometry;
     for (int i = 0; i < projectionBlock.getNumDocs(); i++) {
       geometry = GeometrySerializer.deserialize(values[i]);
-      _results[i] = _writer.write(geometry);
+      _results[i] = GeometryUtils.WKB_WRITER.write(geometry);
     }
     return _results;
   }
diff --git a/pinot-core/src/main/java/org/apache/pinot/core/geospatial/transform/function/StAsTextFunction.java b/pinot-core/src/main/java/org/apache/pinot/core/geospatial/transform/function/StAsTextFunction.java
index 01e490b..4f277fb 100644
--- a/pinot-core/src/main/java/org/apache/pinot/core/geospatial/transform/function/StAsTextFunction.java
+++ b/pinot-core/src/main/java/org/apache/pinot/core/geospatial/transform/function/StAsTextFunction.java
@@ -27,22 +27,19 @@ import org.apache.pinot.core.operator.transform.function.BaseTransformFunction;
 import org.apache.pinot.core.operator.transform.function.TransformFunction;
 import org.apache.pinot.core.plan.DocIdSetPlanNode;
 import org.apache.pinot.segment.local.utils.GeometrySerializer;
+import org.apache.pinot.segment.local.utils.GeometryUtils;
 import org.apache.pinot.segment.spi.datasource.DataSource;
 import org.apache.pinot.spi.data.FieldSpec;
 import org.locationtech.jts.geom.Geometry;
-import org.locationtech.jts.io.WKTWriter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 
 /**
  * Returns the text representation of the geometry object.
  */
 public class StAsTextFunction extends BaseTransformFunction {
-  private static final Logger LOGGER = LoggerFactory.getLogger(StAsTextFunction.class);
-  private TransformFunction _transformFunction;
-  private static WKTWriter _writer;
   public static final String FUNCTION_NAME = "ST_AsText";
+
+  private TransformFunction _transformFunction;
   private String[] _results;
 
   @Override
@@ -52,15 +49,14 @@ public class StAsTextFunction extends BaseTransformFunction {
 
   @Override
   public void init(List<TransformFunction> arguments, Map<String, DataSource> dataSourceMap) {
-    Preconditions
-        .checkArgument(arguments.size() == 1, "Exactly 1 argument is required for transform function: %s", getName());
+    Preconditions.checkArgument(arguments.size() == 1, "Exactly 1 argument is required for transform function: %s",
+        getName());
     TransformFunction transformFunction = arguments.get(0);
     Preconditions.checkArgument(transformFunction.getResultMetadata().isSingleValue(),
         "Argument must be single-valued for transform function: %s", getName());
     Preconditions.checkArgument(transformFunction.getResultMetadata().getDataType() == FieldSpec.DataType.BYTES,
         "The argument must be of bytes type");
     _transformFunction = transformFunction;
-    _writer = new WKTWriter();
   }
 
   @Override
@@ -77,7 +73,7 @@ public class StAsTextFunction extends BaseTransformFunction {
     Geometry geometry;
     for (int i = 0; i < projectionBlock.getNumDocs(); i++) {
       geometry = GeometrySerializer.deserialize(values[i]);
-      _results[i] = _writer.write(geometry);
+      _results[i] = GeometryUtils.WKT_WRITER.write(geometry);
     }
     return _results;
   }
diff --git a/pinot-core/src/main/java/org/apache/pinot/core/geospatial/transform/function/StGeogFromTextFunction.java b/pinot-core/src/main/java/org/apache/pinot/core/geospatial/transform/function/StGeogFromTextFunction.java
index 5534cb7..b44ef4f 100644
--- a/pinot-core/src/main/java/org/apache/pinot/core/geospatial/transform/function/StGeogFromTextFunction.java
+++ b/pinot-core/src/main/java/org/apache/pinot/core/geospatial/transform/function/StGeogFromTextFunction.java
@@ -19,7 +19,7 @@
 package org.apache.pinot.core.geospatial.transform.function;
 
 import org.apache.pinot.segment.local.utils.GeometryUtils;
-import org.locationtech.jts.geom.GeometryFactory;
+import org.locationtech.jts.io.WKTReader;
 
 
 /**
@@ -29,8 +29,8 @@ public class StGeogFromTextFunction extends ConstructFromTextFunction {
   public static final String FUNCTION_NAME = "ST_GeogFromText";
 
   @Override
-  protected GeometryFactory getGeometryFactory() {
-    return GeometryUtils.GEOGRAPHY_FACTORY;
+  protected WKTReader getWKTReader() {
+    return GeometryUtils.GEOGRAPHY_WKT_READER;
   }
 
   @Override
diff --git a/pinot-core/src/main/java/org/apache/pinot/core/geospatial/transform/function/StGeogFromWKBFunction.java b/pinot-core/src/main/java/org/apache/pinot/core/geospatial/transform/function/StGeogFromWKBFunction.java
index d2d1be5..4f5bf51 100644
--- a/pinot-core/src/main/java/org/apache/pinot/core/geospatial/transform/function/StGeogFromWKBFunction.java
+++ b/pinot-core/src/main/java/org/apache/pinot/core/geospatial/transform/function/StGeogFromWKBFunction.java
@@ -19,7 +19,7 @@
 package org.apache.pinot.core.geospatial.transform.function;
 
 import org.apache.pinot.segment.local.utils.GeometryUtils;
-import org.locationtech.jts.geom.GeometryFactory;
+import org.locationtech.jts.io.WKBReader;
 
 
 /**
@@ -29,8 +29,8 @@ public class StGeogFromWKBFunction extends ConstructFromWKBFunction {
   public static final String FUNCTION_NAME = "ST_GeogFromWKB";
 
   @Override
-  protected GeometryFactory getGeometryFactory() {
-    return GeometryUtils.GEOGRAPHY_FACTORY;
+  protected WKBReader getWKBReader() {
+    return GeometryUtils.GEOGRAPHY_WKB_READER;
   }
 
   @Override
diff --git a/pinot-core/src/main/java/org/apache/pinot/core/geospatial/transform/function/StGeomFromTextFunction.java b/pinot-core/src/main/java/org/apache/pinot/core/geospatial/transform/function/StGeomFromTextFunction.java
index be55220..6315abe 100644
--- a/pinot-core/src/main/java/org/apache/pinot/core/geospatial/transform/function/StGeomFromTextFunction.java
+++ b/pinot-core/src/main/java/org/apache/pinot/core/geospatial/transform/function/StGeomFromTextFunction.java
@@ -19,7 +19,7 @@
 package org.apache.pinot.core.geospatial.transform.function;
 
 import org.apache.pinot.segment.local.utils.GeometryUtils;
-import org.locationtech.jts.geom.GeometryFactory;
+import org.locationtech.jts.io.WKTReader;
 
 
 /**
@@ -29,12 +29,12 @@ public class StGeomFromTextFunction extends ConstructFromTextFunction {
   public static final String FUNCTION_NAME = "ST_GeomFromText";
 
   @Override
-  public String getName() {
-    return FUNCTION_NAME;
+  protected WKTReader getWKTReader() {
+    return GeometryUtils.GEOMETRY_WKT_READER;
   }
 
   @Override
-  protected GeometryFactory getGeometryFactory() {
-    return GeometryUtils.GEOMETRY_FACTORY;
+  public String getName() {
+    return FUNCTION_NAME;
   }
 }
diff --git a/pinot-core/src/main/java/org/apache/pinot/core/geospatial/transform/function/StGeomFromWKBFunction.java b/pinot-core/src/main/java/org/apache/pinot/core/geospatial/transform/function/StGeomFromWKBFunction.java
index dd319fa..c2e574e 100644
--- a/pinot-core/src/main/java/org/apache/pinot/core/geospatial/transform/function/StGeomFromWKBFunction.java
+++ b/pinot-core/src/main/java/org/apache/pinot/core/geospatial/transform/function/StGeomFromWKBFunction.java
@@ -19,7 +19,7 @@
 package org.apache.pinot.core.geospatial.transform.function;
 
 import org.apache.pinot.segment.local.utils.GeometryUtils;
-import org.locationtech.jts.geom.GeometryFactory;
+import org.locationtech.jts.io.WKBReader;
 
 
 /**
@@ -29,12 +29,12 @@ public class StGeomFromWKBFunction extends ConstructFromWKBFunction {
   public static final String FUNCTION_NAME = "ST_GeomFromWKB";
 
   @Override
-  public String getName() {
-    return FUNCTION_NAME;
+  protected WKBReader getWKBReader() {
+    return GeometryUtils.GEOMETRY_WKB_READER;
   }
 
   @Override
-  protected GeometryFactory getGeometryFactory() {
-    return GeometryUtils.GEOMETRY_FACTORY;
+  public String getName() {
+    return FUNCTION_NAME;
   }
 }
diff --git a/pinot-core/src/main/java/org/apache/pinot/core/geospatial/transform/function/StPolygonFunction.java b/pinot-core/src/main/java/org/apache/pinot/core/geospatial/transform/function/StPolygonFunction.java
index 3c1e99c..6f47766 100644
--- a/pinot-core/src/main/java/org/apache/pinot/core/geospatial/transform/function/StPolygonFunction.java
+++ b/pinot-core/src/main/java/org/apache/pinot/core/geospatial/transform/function/StPolygonFunction.java
@@ -24,9 +24,9 @@ import org.apache.pinot.core.plan.DocIdSetPlanNode;
 import org.apache.pinot.segment.local.utils.GeometrySerializer;
 import org.apache.pinot.segment.local.utils.GeometryUtils;
 import org.locationtech.jts.geom.Geometry;
-import org.locationtech.jts.geom.GeometryFactory;
 import org.locationtech.jts.geom.Polygon;
 import org.locationtech.jts.io.ParseException;
+import org.locationtech.jts.io.WKTReader;
 
 
 /**
@@ -36,8 +36,8 @@ public class StPolygonFunction extends ConstructFromTextFunction {
   public static final String FUNCTION_NAME = "ST_Polygon";
 
   @Override
-  protected GeometryFactory getGeometryFactory() {
-    return GeometryUtils.GEOMETRY_FACTORY;
+  protected WKTReader getWKTReader() {
+    return GeometryUtils.GEOMETRY_WKT_READER;
   }
 
   @Override
diff --git a/pinot-core/src/test/java/org/apache/pinot/queries/StUnionQueriesTest.java b/pinot-core/src/test/java/org/apache/pinot/queries/StUnionQueriesTest.java
index 8ba42b0..c636a0e 100644
--- a/pinot-core/src/test/java/org/apache/pinot/queries/StUnionQueriesTest.java
+++ b/pinot-core/src/test/java/org/apache/pinot/queries/StUnionQueriesTest.java
@@ -178,9 +178,16 @@ public class StUnionQueriesTest extends BaseQueriesTest {
 
   @Test
   public void testPostAggregation() {
-    String query =
-        "SELECT ST_AS_TEXT(ST_UNION(pointColumn)), TO_GEOMETRY(ST_UNION(pointColumn)), TO_SPHERICAL_GEOGRAPHY"
-            + "(ST_UNION(pointColumn)), ST_AS_TEXT(TO_SPHERICAL_GEOGRAPHY(ST_UNION(pointColumn))) FROM testTable";
+    String query = "SELECT "
+        + "ST_AS_TEXT(ST_UNION(pointColumn)), "
+        + "ST_AS_BINARY(ST_UNION(pointColumn)), "
+        + "TO_GEOMETRY(ST_UNION(pointColumn)), "
+        + "TO_SPHERICAL_GEOGRAPHY(ST_UNION(pointColumn)), "
+        + "ST_GEOM_FROM_TEXT(ST_AS_TEXT(ST_UNION(pointColumn))), "
+        + "ST_GEOG_FROM_TEXT(ST_AS_TEXT(ST_UNION(pointColumn))), "
+        + "ST_GEOM_FROM_WKB(ST_AS_BINARY(ST_UNION(pointColumn))), "
+        + "ST_GEOG_FROM_WKB(ST_AS_BINARY(ST_UNION(pointColumn))) "
+        + "FROM testTable";
 
     // Inner segment
     Operator operator = getOperatorForPqlQuery(query);
@@ -190,7 +197,7 @@ public class StUnionQueriesTest extends BaseQueriesTest {
         NUM_RECORDS);
     List<Object> aggregationResult = resultsBlock.getAggregationResult();
     assertNotNull(aggregationResult);
-    assertEquals(aggregationResult.size(), 4);
+    assertEquals(aggregationResult.size(), 8);
     for (Object value : aggregationResult) {
       assertEquals(value, _intermediateResult);
     }
@@ -199,17 +206,36 @@ public class StUnionQueriesTest extends BaseQueriesTest {
     BrokerResponseNative brokerResponse = getBrokerResponseForSqlQuery(query);
     ResultTable resultTable = brokerResponse.getResultTable();
     DataSchema expectedDataSchema = new DataSchema(new String[]{
-        "st_as_text(st_union(pointColumn))", "to_geometry(st_union(pointColumn))",
-        "to_spherical_geography(st_union(pointColumn))", "st_as_text(to_spherical_geography(st_union(pointColumn)))"
-    }, new ColumnDataType[]{ColumnDataType.STRING, ColumnDataType.BYTES, ColumnDataType.BYTES, ColumnDataType.STRING});
+        "st_as_text(st_union(pointColumn))",
+        "st_as_binary(st_union(pointColumn))",
+        "to_geometry(st_union(pointColumn))",
+        "to_spherical_geography(st_union(pointColumn))",
+        "st_geom_from_text(st_as_text(st_union(pointColumn)))",
+        "st_geog_from_text(st_as_text(st_union(pointColumn)))",
+        "st_geom_from_wkb(st_as_binary(st_union(pointColumn)))",
+        "st_geog_from_wkb(st_as_binary(st_union(pointColumn)))"
+    }, new ColumnDataType[]{
+        ColumnDataType.STRING,
+        ColumnDataType.BYTES,
+        ColumnDataType.BYTES,
+        ColumnDataType.BYTES,
+        ColumnDataType.BYTES,
+        ColumnDataType.BYTES,
+        ColumnDataType.BYTES,
+        ColumnDataType.BYTES
+    });
     assertEquals(resultTable.getDataSchema(), expectedDataSchema);
     List<Object[]> rows = resultTable.getRows();
     assertEquals(rows.size(), 1);
     assertEquals(rows.get(0), new Object[]{
         ScalarFunctions.stAsText(_expectedResults),
+        BytesUtils.toHexString(ScalarFunctions.stAsBinary(_expectedResults)),
+        BytesUtils.toHexString(ScalarFunctions.toGeometry(_expectedResults)),
+        BytesUtils.toHexString(ScalarFunctions.toSphericalGeography(_expectedResults)),
         BytesUtils.toHexString(ScalarFunctions.toGeometry(_expectedResults)),
         BytesUtils.toHexString(ScalarFunctions.toSphericalGeography(_expectedResults)),
-        ScalarFunctions.stAsText(ScalarFunctions.toSphericalGeography(_expectedResults))
+        BytesUtils.toHexString(ScalarFunctions.toGeometry(_expectedResults)),
+        BytesUtils.toHexString(ScalarFunctions.toSphericalGeography(_expectedResults))
     });
   }
 
diff --git a/pinot-perf/src/main/java/org/apache/pinot/perf/BenchmarkGeospatialSerde.java b/pinot-perf/src/main/java/org/apache/pinot/perf/BenchmarkGeospatialSerde.java
index 5684943..b9c6a78 100644
--- a/pinot-perf/src/main/java/org/apache/pinot/perf/BenchmarkGeospatialSerde.java
+++ b/pinot-perf/src/main/java/org/apache/pinot/perf/BenchmarkGeospatialSerde.java
@@ -24,9 +24,9 @@ import java.io.IOException;
 import java.io.UncheckedIOException;
 import org.apache.pinot.core.common.ObjectSerDeUtils;
 import org.apache.pinot.segment.local.utils.GeometrySerializer;
+import org.apache.pinot.segment.local.utils.GeometryUtils;
 import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.io.ParseException;
-import org.locationtech.jts.io.WKTReader;
 import org.openjdk.jmh.annotations.Benchmark;
 import org.openjdk.jmh.annotations.BenchmarkMode;
 import org.openjdk.jmh.annotations.Fork;
@@ -304,7 +304,7 @@ public class BenchmarkGeospatialSerde {
 
   private static Geometry fromText(String text) {
     try {
-      return new WKTReader().read(text);
+      return GeometryUtils.GEOMETRY_WKT_READER.read(text);
     } catch (ParseException e) {
       throw new RuntimeException(e);
     }
diff --git a/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/utils/GeometryUtils.java b/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/utils/GeometryUtils.java
index 5f056da..aa46c3e 100644
--- a/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/utils/GeometryUtils.java
+++ b/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/utils/GeometryUtils.java
@@ -22,6 +22,10 @@ import com.google.common.base.Joiner;
 import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.geom.GeometryFactory;
 import org.locationtech.jts.geom.PrecisionModel;
+import org.locationtech.jts.io.WKBReader;
+import org.locationtech.jts.io.WKBWriter;
+import org.locationtech.jts.io.WKTReader;
+import org.locationtech.jts.io.WKTWriter;
 
 
 /**
@@ -39,6 +43,12 @@ public class GeometryUtils {
   public static final byte GEOGRAPHY_GET_MASK = (byte) 0x7f;
   public static final GeometryFactory GEOMETRY_FACTORY = new GeometryFactory();
   public static final GeometryFactory GEOGRAPHY_FACTORY = new GeometryFactory(new PrecisionModel(), GEOGRAPHY_SRID);
+  public static final WKTReader GEOMETRY_WKT_READER = new WKTReader(GEOMETRY_FACTORY);
+  public static final WKTReader GEOGRAPHY_WKT_READER = new WKTReader(GEOGRAPHY_FACTORY);
+  public static final WKBReader GEOMETRY_WKB_READER = new WKBReader(GEOMETRY_FACTORY);
+  public static final WKBReader GEOGRAPHY_WKB_READER = new WKBReader(GEOGRAPHY_FACTORY);
+  public static final WKTWriter WKT_WRITER = new WKTWriter();
+  public static final WKBWriter WKB_WRITER = new WKBWriter();
   public static final double EARTH_RADIUS_KM = 6371.01;
   public static final double EARTH_RADIUS_M = EARTH_RADIUS_KM * 1000.0;
   public static final Joiner OR_JOINER = Joiner.on(" or ");

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org
For additional commands, e-mail: commits-help@pinot.apache.org