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 <17555551+jackie-ji...@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-unsubscr...@pinot.apache.org For additional commands, e-mail: commits-h...@pinot.apache.org