diff --git a/data-discovery/src/main/java/vlkb/search/DbPSearch.java b/data-discovery/src/main/java/vlkb/search/DbPSearch.java index dbd44949d499af6fbc318d5d0080cd0d78941a0a..3aaab5ef577c9cac401d208ba6c3ee1df2f96552 100644 --- a/data-discovery/src/main/java/vlkb/search/DbPSearch.java +++ b/data-discovery/src/main/java/vlkb/search/DbPSearch.java @@ -26,81 +26,25 @@ public class DbPSearch private static final Logger LOGGER = Logger.getLogger(DbPSearch.class.getName()); private DBConn dbConn; - //private static final String DB_DRIVER = "org.postgresql.Driver"; DbPSearch(DBConn dbConn) { this.dbConn = dbConn; } - public String[] queryOverlapingPubdid(Coord coord, SubsurveyId subsurveyId) - { - LOGGER.info("trace"); -// String skySystem = coord.skySystem; - String shape = coord.pos.shape; - - double lon; - double lat; - double radius; - double dlon; - double dlat; - - String inputRegion = null; - if(shape.equals("CIRCLE")) - { - lon = coord.pos.circle.lon; - lat = coord.pos.circle.lat; - radius = coord.pos.circle.radius; - inputRegion = "scircle '<(" + Double.toString(lon) + "d," + Double.toString(lat) + "d)," - + Double.toString(radius) + "d>'"; - } - else if (shape.equals("RECT")) - { - lon = (coord.pos.range.lon1 + coord.pos.range.lon2)/2.0; - lat = (coord.pos.range.lat1 + coord.pos.range.lat2)/2.0; - dlon = (coord.pos.range.lon2 - coord.pos.range.lon1)/2.0; - dlat = (coord.pos.range.lat2 - coord.pos.range.lat1)/2.0; - - /* South-West and North-East corners of a box */ - String sw_lon = Double.toString(lon - dlon/2.0); - String sw_lat = Double.toString(lat - dlat/2.0); - String ne_lon = Double.toString(lon + dlon/2.0); - String ne_lat = Double.toString(lat + dlat/2.0); - inputRegion = "sbox '( ("+ sw_lon + "d, " + sw_lat + "d), (" + ne_lon +"d, " + ne_lat + "d) )'"; - } - else if (shape.equals("POLYGON")) - { - // FIXME redefine Polygon as point-array: - assert(coord.pos.polygon.lon.length == coord.pos.polygon.lat.length); + public String[] queryOverlapingPubdid(Coord coord, SubsurveyId subsurveyId) + { + LOGGER.info("trace"); - // Polygon has at least 3 points - inputRegion = "spoly '( (" + coord.pos.polygon.lon[0] + "d, " + coord.pos.polygon.lat[0] + "d),"; - for(int ii=1; ii < coord.pos.polygon.lon.length; ii++) - { - inputRegion += ", (" + coord.pos.polygon.lon[ii] + "d, " + coord.pos.polygon.lat[ii] + "d)"; - } - inputRegion += " )'"; - } - else - { - throw new IllegalArgumentException("Coord::shape was: " + shape + " but valid is CIRCLE or RECT"); - } + String inputRegion = toPgSphereSqlTypeString(coord.pos); + String dbRegion = toRegionColumnName(coord.pos.system); - boolean vel_valid = (coord.band != null) && (coord.band.system != Band.System.NONE);//coord.vel_valid; - - String theQuery; - if(coord.pos.system == Pos.System.GALACTIC) - { - theQuery ="SELECT obs_publisher_did FROM obscore WHERE ("+inputRegion+" && polygon_region_galactic)"; - } - else - { - theQuery ="SELECT obs_publisher_did FROM obscore WHERE (" + inputRegion + " && polygon_region)"; - } + String theQuery = "SELECT obs_publisher_did FROM obscore WHERE ("+inputRegion+" && " + dbRegion + ")"; + boolean vel_valid = (coord.band != null) && (coord.band.system != Band.System.NONE); if(vel_valid) { String vel_no_overlap @@ -115,7 +59,7 @@ public class DbPSearch if(subsurveyId != null) { - /* FIXME replace this implementation with exact string match once survey_id is defined / added to obs_core */ + /* FIXME replace this implementation with exact string match once survey_id is defined in obs_core */ String addSS = ""; if((subsurveyId.surveyName != null) && (subsurveyId.surveyName.length() > 0)) @@ -141,20 +85,19 @@ public class DbPSearch List<String> pubdidList = new ArrayList<>(); - LOGGER.info("Connecting to: " + dbConn.uri() + " with optional user/pwd: " + dbConn.userName() +" / "+ dbConn.password() ); + LOGGER.info("Connecting to: " + dbConn.uri() + + " with optional user/pwd: " + dbConn.userName() +" / "+ dbConn.password() ); try( Connection conn = DriverManager.getConnection(dbConn.uri(), dbConn.userName(), dbConn.password()); Statement st = conn.createStatement(); ResultSet res = st.executeQuery(theQuery);) { - while (res.next()) { String pubdid_str = res.getString("obs_publisher_did"); pubdidList.add(pubdid_str); } - } catch (SQLException se) { @@ -172,127 +115,19 @@ public class DbPSearch - public FormatResponseFilter.ObsCore[] queryOutputData(String[] pubdidArr, Coord coord/*, SubsurveyId subsurveyId*/) + public FormatResponseFilter.ObsCore[] queryOutputData(String[] pubdidArr, Coord coord) { LOGGER.info(""); - String skySystem = coord.pos.system.toString(); - String shape = coord.pos.shape; - - double lon; - double lat; - double radius; - double dlon; - double dlat; - - String inputRegion = null; - - if(shape.equals("CIRCLE")) - { - lon = coord.pos.circle.lon; - lat = coord.pos.circle.lat; - radius = coord.pos.circle.radius; - inputRegion = "scircle '<(" + Double.toString(lon) + "d," + Double.toString(lat) + "d)," - + Double.toString(radius) + "d>'"; - } - else if (shape.equals("RECT")) - { - lon = (coord.pos.range.lon1 + coord.pos.range.lon2)/2.0; - lat = (coord.pos.range.lat1 + coord.pos.range.lat2)/2.0; - dlon = (coord.pos.range.lon2 - coord.pos.range.lon1)/2.0; - dlat = (coord.pos.range.lat2 - coord.pos.range.lat1)/2.0; - - /* South-West and North-East corners of a box */ - String sw_lon = Double.toString(lon - dlon/2.0); - String sw_lat = Double.toString(lat - dlat/2.0); - String ne_lon = Double.toString(lon + dlon/2.0); - String ne_lat = Double.toString(lat + dlat/2.0); - - inputRegion = "sbox '( ("+ sw_lon + "d, " + sw_lat + "d), (" + ne_lon +"d, " + ne_lat + "d) )'"; - } - else - { // FIXME how to deal with Polygon ? -> use enclose-RECT -> RANGE - /* lon = coord.lon; - lat = coord.lat; - radius = coord.radius; - dlon = coord.dlon; - dlat = coord.dlat;*/ - - throw new IllegalArgumentException("Coord::shape was: " + shape + " but valid is CIRCLE or RECT"); - } - - boolean vel_valid = (coord.band != null) && (coord.band.system != Band.System.NONE);//coord.vel_valid; - // String vel_type = coord.vel_type; - // double vel_low = coord.band.wavelength[0];//vel_low; - // double vel_up = coord.band.wavelength[1];//vel_up; - - - /* - double lon = coord.lon; - double lat = coord.lat; - double radius = coord.radius; - double dlon = coord.dlon; - double dlat = coord.dlat; - - boolean vel_valid = coord.vel_valid; - String vel_type = coord.vel_type; - double vel_low = coord.vel_low; - double vel_up = coord.vel_up; - - String inputRegion = null; - - if(coord.shape.equals("CIRCLE")) - { - inputRegion = "scircle '<(" + Double.toString(lon) + "d," + Double.toString(lat) + "d)," - + Double.toString(radius) + "d>'"; - } - else if( coord.shape.equals("RECT") ) - { - /*Vert vert[] = toVertices(lon, lat, dlon, dlat); - - inputRegion = "spoly '{" - + "(" + Double.toString(vert[0].lon) + "d," + Double.toString(vert[0].lat) + "d)," - + "(" + Double.toString(vert[1].lon) + "d," + Double.toString(vert[1].lat) + "d)," - + "(" + Double.toString(vert[2].lon) + "d," + Double.toString(vert[2].lat) + "d)," - + "(" + Double.toString(vert[3].lon) + "d," + Double.toString(vert[3].lat) + "d)" - + "}'"; - */ - - /* South-West and North-East corners of a box * / - String sw_lon = Double.toString(lon - dlon/2.0); - String sw_lat = Double.toString(lat - dlat/2.0); - String ne_lon = Double.toString(lon + dlon/2.0); - String ne_lat = Double.toString(lat + dlat/2.0); - - inputRegion = "sbox '( ("+ sw_lon + "d, " + sw_lat + "d), (" + ne_lon +"d, " + ne_lat + "d) )'"; - } - else - { - throw new IllegalArgumentException("Coord::shape was: " + coord.shape + " but valid is CIRCLE or RECT"); - } - */ - - - - - String commaSepPubdids = String.join("\',\'", pubdidArr); + String inputRegion = toPgSphereSqlTypeString(coord.pos); + String dbRegion = toRegionColumnName(coord.pos.system); - //String theQuery ="SELECT dataproduct_type,obs_publisher_did,obs_collection,polygon_region_galactic,access_url,em_min,em_max," - String theQuery; - if(coord.pos.system == Pos.System.GALACTIC) - { - theQuery ="SELECT *," - + inputRegion + " <@ polygon_region_galactic AS inputInsideDb, " - + inputRegion + " @> polygon_region_galactic AS dbInsideInput FROM obscore WHERE (obs_publisher_did IN (\'"+commaSepPubdids+"\'))"; - } - else - { - theQuery ="SELECT *," - + inputRegion + " <@ polygon_region AS inputInsideDb, " - + inputRegion + " @> polygon_region AS dbInsideInput FROM obscore WHERE (obs_publisher_did IN (\'"+commaSepPubdids+"\'))"; - } + String theQuery ="SELECT *," + + inputRegion + " <@ " + dbRegion + " AS inputInsideDb, " + + inputRegion + " @> " + dbRegion + " AS dbInsideInput FROM obscore WHERE (obs_publisher_did IN (\'" + +commaSepPubdids+"\'))"; theQuery += " ORDER BY obs_collection"; @@ -300,14 +135,13 @@ public class DbPSearch List<FormatResponseFilter.ObsCore> obsCoreList = new ArrayList<>(); - LOGGER.info("Connecting to: " + dbConn.uri() + " with optional user/pwd: " + dbConn.userName() +" / "+ dbConn.password() ); + LOGGER.info("Connecting to: " + dbConn.uri() + + " with optional user/pwd: " + dbConn.userName() +" / "+ dbConn.password() ); try( Connection conn = DriverManager.getConnection(dbConn.uri(), dbConn.userName(), dbConn.password()); Statement st = conn.createStatement(); ResultSet res = st.executeQuery(theQuery);) { - //ResultSet res = doQuery(theQuery); - while (res.next()) { FormatResponseFilter.ObsCore obsCore = new FormatResponseFilter.ObsCore(); @@ -371,100 +205,76 @@ public class DbPSearch return cubes; } - /* - public static void loadDriver()// throws ClassNotFoundException - { - /* https://docs.oracle.com/javase/tutorial/jdbc/basics/connecting.html : - * Any JDBC 4.0 drivers that are found in your class path are automatically loaded. - * (However, you must manually load any drivers prior to JDBC 4.0 with the method - * Class.forName.) - * / - /* OR - * DriverManager.registerDriver(new org.postgresql.Driver()); - * LOGGER.info(getClasspathString()); - * LOGGER.info(getRegisteredDriverList()); - *i / - try - { - // Class.forName(DB_DRIVER); - } - catch (ClassNotFoundException e) - { - LOGGER.info("DB driver "+ DB_DRIVER +" not found: " + e.getMessage()); - e.printStackTrace(); - } - } - */ - /* - private ResultSet doQuery(String theQuery) throws SQLException, ClassNotFoundException - { - /* https://docs.oracle.com/javase/tutorial/jdbc/basics/connecting.html : - * Any JDBC 4.0 drivers that are found in your class path are automatically loaded. - * (However, you must manually load any drivers prior to JDBC 4.0 with the method - * Class.forName.) - * / - // Class.forName(DB_DRIVER); - /* OR - * DriverManager.registerDriver(new org.postgresql.Driver()); - * LOGGER.info(getClasspathString()); - * LOGGER.info(getRegisteredDriverList()); - * / - LOGGER.info("Connecting to: " + dbConn.uri() + " with optional user/pwd: " + dbConn.userName() +" / "+ dbConn.password() ); - Connection conn = DriverManager.getConnection(dbConn.uri(), dbConn.userName(), dbConn.password()); + private String toPgSphereSqlTypeString(Pos pos) + { + double lon; + double lat; + double radius; + double dlon; + double dlat; - Statement st = conn.createStatement(); + String inputRegion = null; - ResultSet res = st.executeQuery(theQuery); + String shape = pos.shape; - return res; + if(shape.equals("CIRCLE")) + { + lon = pos.circle.lon; + lat = pos.circle.lat; + radius = pos.circle.radius; + inputRegion = "scircle '<(" + Double.toString(lon) + "d," + Double.toString(lat) + "d)," + + Double.toString(radius) + "d>'"; } - */ - /* public Subsurvey[] getSurveyTable() - { - List<Subsurvey> survList = new ArrayList<Subsurvey>(); - - String theQuery = "SELECT name,species,transition,rest_frequency,restf_fits_unit,velocity_fits_unit,description FROM surveys"; + else if (shape.equals("RECT")) + { + lon = (pos.range.lon1 + pos.range.lon2)/2.0; + lat = (pos.range.lat1 + pos.range.lat2)/2.0; + dlon = (pos.range.lon2 - pos.range.lon1)/2.0; + dlat = (pos.range.lat2 - pos.range.lat1)/2.0; + /* South-West and North-East corners of a box */ + String sw_lon = Double.toString(lon - dlon/2.0); + String sw_lat = Double.toString(lat - dlat/2.0); + String ne_lon = Double.toString(lon + dlon/2.0); + String ne_lat = Double.toString(lat + dlat/2.0); - LOGGER.info("Connecting to: " + dbConn.uri() + " with optional user/pwd: " + dbConn.userName() +" / "+ dbConn.password() ); - try( - Connection conn = DriverManager.getConnection(dbConn.uri(), dbConn.userName(), dbConn.password()); - Statement st = conn.createStatement(); - ResultSet res = st.executeQuery(theQuery);) - { - //ResultSet res = doQuery(theQuery); + inputRegion = "sbox '( ("+ sw_lon + "d, " + sw_lat + "d), (" + ne_lon +"d, " + ne_lat + "d) )'"; + } + else if (shape.equals("POLYGON")) + { + // FIXME redefine Polygon as point-array: + assert(pos.polygon.lon.length == pos.polygon.lat.length); - if(res == null) - { - LOGGER.info("Query yielded no resuls: " + theQuery); + // Polygon has at least 3 points + inputRegion = "spoly '( (" + pos.polygon.lon[0] + "d, " + pos.polygon.lat[0] + "d),"; + for(int ii=1; ii < pos.polygon.lon.length; ii++) + { + inputRegion += ", (" + pos.polygon.lon[ii] + "d, " + pos.polygon.lat[ii] + "d)"; + } + inputRegion += " )'"; + } + else + { + throw new IllegalArgumentException("Coord::shape was: " + shape + " but valid is CIRCLE or RECT"); + } + return inputRegion; } - else - { - while (res.next()) + + private String toRegionColumnName(Pos.System system) { - Subsurvey surv = new Subsurvey(); - surv.rf = res.getDouble("rest_frequency"); - surv.surveyname = res.getString("name"); - surv.species = res.getString("species"); - surv.transition = res.getString("transition"); - surv.rf_unit = res.getString("restf_fits_unit"); - surv.vel_unit = res.getString("velocity_fits_unit"); - surv.description = res.getString("description"); - - survList.add(surv); - } + String dbRegion; + switch(system) + { + case GALACTIC: + dbRegion = "polygon_region_galactic"; + break; + default: + dbRegion = "polygon_region"; + } + return dbRegion; } - } - catch (SQLException se) - { - logSqlExInfo(se); - se.printStackTrace(); - } - return survList.toArray(new Subsurvey[0]); - } - */ @@ -483,36 +293,5 @@ public class DbPSearch - private String getClasspathString() - { - StringBuffer classpath = new StringBuffer("getClasspathString:\r\n"); - ClassLoader applicationClassLoader = this.getClass().getClassLoader(); - if (applicationClassLoader == null) { - applicationClassLoader = ClassLoader.getSystemClassLoader(); - } - URL[] urls = ((URLClassLoader)applicationClassLoader).getURLs(); - for(int i=0; i < urls.length; i++) { - classpath.append(urls[i].getFile()).append("\r\n"); - } - - return classpath.toString(); - } - - - /* Returns the list of JDBC Drivers loaded by the caller's class loader */ - private String getRegisteredDriverList() - { - StringBuffer drvList = new StringBuffer("getRegisteredDriverList:\r\n"); - for (Enumeration e = DriverManager.getDrivers(); - e.hasMoreElements(); ) - { - Driver d = (Driver) e.nextElement(); - String driverClass = d.getClass().getName(); - drvList.append(driverClass).append("\r\n"); - } - return drvList.toString(); - } - - - } +