/* * This file is a part of EpnTAPClient. * This program aims to provide EPN-TAP support for software clients, like CASSIS spectrum analyzer. * See draft specifications: https://voparis-confluence.obspm.fr/pages/viewpage.action?pageId=559861 * Copyright (C) 2016 Institut de Recherche en Astrophysique et Planétologie. * * This program is free software: you can * redistribute it and/or modify it under the terms of the GNU General Public License as published * by the Free Software Foundation, either version 3 of the License, or (at your option) any later * version. This program is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. You should have received a copy of * the GNU General Public License along with this program. If not, see * . */ package eu.omp.irap.vespa.epntapclient.service; import java.util.ArrayList; import java.util.List; import java.util.Map; import eu.omp.irap.vespa.epntapclient.votable.utils.StringJoiner; /** * Defines the queries and the query patterns usually used in the application. * * @author N. Jourdane */ public final class Queries { /** Query to get all EPN-TAP services. */ public static final String GET_EPN_TAP_SERVICES = "SELECT short_name, " + "res_title AS schema_title, table_name, schema_name, ivoid, access_url " + "FROM rr.resource NATURAL JOIN rr.res_schema NATURAL JOIN rr.res_table " + "NATURAL JOIN rr.interface NATURAL JOIN rr.res_detail NATURAL JOIN rr.capability " + "WHERE standard_id='ivo://ivoa.net/std/tap' AND " + "intf_type='vs:paramhttp' AND " + "detail_xpath='/capability/dataModel/@ivo-id' AND " + "1=ivo_nocasematch(detail_value, 'ivo://vopdc.obspm/std/EpnCore%') " + "ORDER BY short_name, table_name"; /** Query to get all EPN-TAP services. */ public static final String GET_TAP_OBSCOR_SERVICES = "SELECT short_name, " + "res_title AS schema_title, table_name, schema_name, ivoid, access_url " + "FROM rr.resource NATURAL JOIN rr.res_schema NATURAL JOIN rr.res_table " + "NATURAL JOIN rr.interface NATURAL JOIN rr.res_detail NATURAL JOIN rr.capability " + "WHERE standard_id='ivo://ivoa.net/std/tap' AND " + "intf_type='vs:paramhttp' AND " + "detail_xpath='/capability/dataModel/@ivo-id' AND " + "1=ivo_nocasematch(detail_value, 'ivo://ivoa.net/std/ObsCore%') " + "ORDER BY short_name, table_name"; /** Query to get all EPN-TAP services. */ public static final String GET_TAP_SERVICES = "SELECT short_name, " + "res_title AS schema_title, table_name, schema_name, ivoid, access_url " + "FROM rr.resource NATURAL JOIN rr.res_schema NATURAL JOIN rr.res_table " + "NATURAL JOIN rr.interface NATURAL JOIN rr.res_detail NATURAL JOIN rr.capability " + "WHERE standard_id='ivo://ivoa.net/std/tap' AND " + "intf_type='vs:paramhttp' AND " + "detail_xpath='/capability/dataModel/@ivo-id' " + "ORDER BY short_name, table_name"; /** Query to get all VO-resources which implements epn-tap core. */ public static final String GET_VO_RESOURCES = "http://voparis-registry.obspm.fr/vo/ivoa/1/voresources/search?" + "keywords=standardid:%22ivo://ivoa.net/std/TAP%22%20datamodel:%22EpnCore%22&max=100"; /** Constructor to hide the implicit public one. */ private Queries() { } /** * The default query, with these parameters, respectively: max_rows, target_name, time_min, * time_max, dataproduct_type, spectral_range_min, spectral_range_max. * * @param nbRow The maximum number of rows returned. * @param tableName The name of the target table for the query. * @param params A map of parameters, for the `WHERE` keywords. * @return The literal string of the query. */ public static String getQuery(String tableName, Map params, int nbRow) { StringJoiner addJoin = new StringJoiner(" AND "); for (Map.Entry param : params.entrySet()) { if (param.getValue() instanceof ArrayList) { StringJoiner orJoin = new StringJoiner(" OR "); @SuppressWarnings("unchecked") List possibleValues = (List) param.getValue(); for (String possibleValue : possibleValues) { orJoin.add(param.getKey() + " LIKE '" + possibleValue + "'"); } addJoin.add("(" + orJoin + ")"); } else if (param.getValue() instanceof String) { addJoin.add(param.getKey() + " LIKE '" + param.getValue() + "'"); } else { addJoin.add(param.getKey() + " = " + param.getValue().toString()); } } String where = addJoin.isEmpty() ? "" : " WHERE " + addJoin; return "SELECT TOP " + nbRow + " target_name, target_class FROM " + tableName + where; } }