Mercurial > dive4elements > gnv-client
diff geo-backend/src/main/java/de/intevation/gnv/geobackend/sde/datasources/ArcSDEStatement.java @ 275:9063c5fcebf7
Added the possibility to use Innerselects in SpatialQueries
geo-backend/trunk@286 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Tim Englich <tim.englich@intevation.de> |
---|---|
date | Thu, 05 Nov 2009 15:03:51 +0000 |
parents | ff1b7967e6b9 |
children | f304f2f12db4 |
line wrap: on
line diff
--- a/geo-backend/src/main/java/de/intevation/gnv/geobackend/sde/datasources/ArcSDEStatement.java Mon Nov 02 10:53:06 2009 +0000 +++ b/geo-backend/src/main/java/de/intevation/gnv/geobackend/sde/datasources/ArcSDEStatement.java Thu Nov 05 15:03:51 2009 +0000 @@ -123,14 +123,14 @@ public ResultSet executeQuery(String statement) throws SQLException { try { SeQuery query = null; - if (statement.toLowerCase().contains("st_astext")){ + if (statement.toLowerCase().contains("st_astext") || statement.toLowerCase().contains("intersects")){ String[] values = statement.toLowerCase().split("where", 2); String where = values.length > 1 ? values[1].trim() : ""; values = values[0].split("from", 2); String[] tableNames = values[1].toUpperCase().trim().split(","); String[] returnFields = values[0].replaceAll("select", "").trim().split(","); - String geometryColumnName = "N/N"; + String geometryColumnName = null; String byClause = null; int byClausePos = where.indexOf("group by"); if (byClausePos < 0){ @@ -158,11 +158,27 @@ int pos = where.indexOf("intersects"); if (pos > 0 ){ String substr = where.substring(pos); + where = where.substring(0,where.lastIndexOf("intersects")); // TODO auch or unterstützen where = where.substring(0,where.lastIndexOf("and")); // TODO auch or unterstützen String intersectsStmt = substr.substring(0, substr.lastIndexOf(")")); // Annahme räumliches Stmt steht am Ende - String wkt = intersectsStmt.substring(intersectsStmt.indexOf("\""), intersectsStmt.lastIndexOf("\"")).replace("\"", "").trim(); + String wkt = null; + if (intersectsStmt.contains("select")){ + // Anstelle eines WKT ist ein InnerSelect zum Bestimmen der Comparatorgeometrie gegeben. + String stmt = intersectsStmt.substring(intersectsStmt.indexOf("select"),intersectsStmt.lastIndexOf(")")); + ResultSet resultSet = this.executeQuery(stmt); + if (resultSet != null && resultSet.next()){ + // TODO Selektion von mehreren Geometrien unterstützen. + wkt = resultSet.getString("SHAPE"); + } + }else{ + wkt = intersectsStmt.substring(intersectsStmt.indexOf("\""), intersectsStmt.lastIndexOf("\"")).replace("\"", "").trim(); + } g = new WKTReader().read(wkt); + if (geometryColumnName == null){ + geometryColumnName = "SHAPE"; // TODO dynamisch aus Intersects auslesen. + } + } return this.executeQuery(this.connection.getSeConnection(), tableNames, geometryColumnName, where, g, returnFields,byClause); }else{