// Copyright © 2015 HSL <https://www.hsl.fi> // This program is dual-licensed under the EUPL v1.2 and AGPLv3 licenses. package com.querydsl.sql.spatial; import com.querydsl.sql.types.AbstractType; import org.geolatte.geom.Geometry; import org.geolatte.geom.codec.Wkt; import org.postgis.PGgeometry; import org.postgresql.util.PGobject; import javax.annotation.Nullable; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; public class PGGeometryType<T extends Geometry> extends AbstractType<T> { private final Class<T> type; public PGGeometryType(Class<T> type) { super(Types.STRUCT); this.type = type; } @Override public Class<T> getReturnedClass() { return type; } @Override @Nullable public T getValue(ResultSet rs, int startIndex) throws SQLException { Object obj = rs.getObject(startIndex); if (!(obj instanceof PGgeometry)) { obj = new PGgeometry(((PGobject) obj).getValue()); } return obj != null ? (T) PGgeometryConverter.convert(((PGgeometry) obj).getGeometry()) : null; } @Override public void setValue(PreparedStatement st, int startIndex, T value) throws SQLException { PGgeometry geometry = new PGgeometry(PGgeometryConverter.convert(value)); st.setObject(startIndex, geometry); } @Override public String getLiteral(T geometry) { String str = Wkt.newEncoder(Wkt.Dialect.POSTGIS_EWKT_1).encode(geometry); return "'" + str + "'"; } }