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{

http://dive4elements.wald.intevation.org