PostGISDialect.java

  1. /*
  2.  * Copyright (C) 2021 B3Partners B.V.
  3.  *
  4.  * SPDX-License-Identifier: MIT
  5.  */

  6. package nl.b3p.brmo.sql.dialect;

  7. import java.sql.Connection;
  8. import java.sql.SQLException;
  9. import java.util.regex.Matcher;
  10. import java.util.regex.Pattern;
  11. import nl.b3p.brmo.util.StandardLinearizedWKTWriter;
  12. import org.geotools.geometry.jts.WKTWriter2;
  13. import org.locationtech.jts.geom.Geometry;
  14. import org.postgresql.util.PGobject;

  15. public class PostGISDialect implements SQLDialect {
  16.   private final StandardLinearizedWKTWriter wktWriter = new StandardLinearizedWKTWriter();
  17.   private final WKTWriter2 wktWriter2 = new WKTWriter2();

  18.   @Override
  19.   public String getDriverClass() {
  20.     return "org.postgresql.Driver";
  21.   }

  22.   @Override
  23.   public String getType(String type) {
  24.     Matcher sequence = Pattern.compile("sequence\\((.+)\\)").matcher(type);
  25.     if (sequence.matches()) {
  26.       return "integer default nextval('" + sequence.group(1) + "')";
  27.     }
  28.     return type;
  29.   }

  30.   @Override
  31.   public Object getGeometryParameter(Connection c, Geometry geometry, boolean linearizeCurves)
  32.       throws SQLException {
  33.     if (geometry == null) {
  34.       return null;
  35.     } else {
  36.       String ewkt = getEWkt(geometry, linearizeCurves);
  37.       PGobject object = new PGobject();
  38.       object.setType("geometry");
  39.       object.setValue(ewkt);
  40.       return object;
  41.     }
  42.   }

  43.   public String getEWkt(Geometry geometry, boolean linearizeCurves) {
  44.     String wkt = linearizeCurves ? wktWriter.write(geometry) : wktWriter2.write(geometry);
  45.     return "SRID=" + geometry.getSRID() + ";" + wkt;
  46.   }

  47.   @Override
  48.   public String getCreateGeometryIndexSQL(String tableName, String geometryColumn, String type) {
  49.     return String.format(
  50.         "create index idx_%s_%s on %s using gist (%s)",
  51.         tableName, geometryColumn, tableName, geometryColumn);
  52.   }

  53.   @Override
  54.   public int getDefaultOptimalBatchSize() {
  55.     return 2500;
  56.   }
  57. }