package com.vividsolutions.jump.datastore.postgis; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Envelope; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jump.datastore.FilterQuery; import com.vividsolutions.jump.datastore.SpatialReferenceSystemID; /** * Creates SQL query strings for a PostGIS database */ public class PostgisSQLBuilder { private SpatialReferenceSystemID defaultSRID = null; private String[] colNames = null; public PostgisSQLBuilder(SpatialReferenceSystemID defaultSRID, String[] colNames) { this.defaultSRID = defaultSRID; this.colNames = colNames; } public String getSQL(FilterQuery query) { return buildQueryString(query); } private String buildQueryString(FilterQuery query) { StringBuffer qs = new StringBuffer(); //HACK qs.append("SELECT "); qs.append(getColumnListSpecifier(colNames, query.getGeometryAttributeName())); qs.append(" FROM "); // fixed by mmichaud on 2010-05-27 for mixed case dataset names qs.append("\"" + query.getDatasetName().replaceAll("\\.","\".\"") + "\""); qs.append(" t WHERE "); qs.append(buildBoxFilter(query.getGeometryAttributeName(), query.getSRSName(), query.getFilterGeometry())); String whereCond = query.getCondition(); if (whereCond != null) { qs.append(" AND "); qs.append(whereCond); } //System.out.println(qs); return qs.toString(); } private String buildBoxFilter(String geometryColName, SpatialReferenceSystemID SRID, Geometry geom) { Envelope env = geom.getEnvelopeInternal(); // Example of Postgis SQL: GEOM && SetSRID('BOX3D(191232 243117,191232 243119)'::box3d,-1); StringBuffer buf = new StringBuffer(); // fixed by mmichaud on 2010-05-27 for mixed case geometryColName names buf.append("\"" + geometryColName + "\" && SetSRID('BOX3D("); buf.append(env.getMinX() + " " + env.getMinY() + "," + env.getMaxX() + " " + env.getMaxY() ); buf.append(")'::box3d,"); buf.append(getSRID(SRID) + ")"); return buf.toString(); } private String getSRID(SpatialReferenceSystemID querySRID) { SpatialReferenceSystemID srid = defaultSRID; if (! querySRID.isNull()) srid = querySRID; if (srid.isNull()) return "NULL"; else return srid.getString(); } private String getColumnListSpecifier( String[] colName, String geomColName) { // Added double quotes around each column name in order to read mixed case table names // correctly [mmichaud 2007-05-13] StringBuffer buf = new StringBuffer(); // fixed by mmichaud using a patch from jaakko [2008-05-21] // query geomColName as geomColName instead of geomColName as geomColName + "_wkb" buf.append("AsBinary(\"").append(geomColName).append("\") as ").append(geomColName); for (int i = 0; i < colName.length; i++) { if (! geomColName.equalsIgnoreCase(colName[i])) { buf.append(",\""); buf.append(colName[i]).append("\""); } } return buf.toString(); } }