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