PostGISDialect.java

/*
 * Copyright (C) 2021 B3Partners B.V.
 *
 * SPDX-License-Identifier: MIT
 */

package nl.b3p.brmo.sql.dialect;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import nl.b3p.brmo.util.StandardLinearizedWKTWriter;
import org.geotools.geometry.jts.WKTWriter2;
import org.locationtech.jts.geom.Geometry;
import org.postgresql.util.PGobject;

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

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

  @Override
  public String getType(String type) {
    Matcher sequence = Pattern.compile("sequence\\((.+)\\)").matcher(type);
    if (sequence.matches()) {
      return "integer default nextval('" + sequence.group(1) + "')";
    }
    return type;
  }

  @Override
  public Object getGeometryParameter(Connection c, Geometry geometry, boolean linearizeCurves)
      throws SQLException {
    if (geometry == null) {
      return null;
    } else {
      String ewkt = getEWkt(geometry, linearizeCurves);
      PGobject object = new PGobject();
      object.setType("geometry");
      object.setValue(ewkt);
      return object;
    }
  }

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

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

  @Override
  public int getDefaultOptimalBatchSize() {
    return 2500;
  }
}