From 564dc7ac3067e97e1103947e602ca5552189a767 Mon Sep 17 00:00:00 2001 From: David Stansby Date: Mon, 29 Aug 2022 19:46:59 +0100 Subject: [PATCH] Clean up query code --- sunpy_soar/client.py | 37 +++++++++++++++++-------------------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/sunpy_soar/client.py b/sunpy_soar/client.py index 324b424..921fceb 100644 --- a/sunpy_soar/client.py +++ b/sunpy_soar/client.py @@ -31,22 +31,16 @@ def search(self, *query, **kwargs): return qrt @staticmethod - def _construct_url(query): + def _construct_payload(query): """ - Construct search URL. + Construct search payload. Parameters ---------- - query : list[str] - List of query items. + payload : dict[str] + Payload to send to the TAP server. """ - base_url = ('http://soar.esac.esa.int/soar-sl-tap/tap/' - 'sync?REQUEST=doQuery&') - # Need to manually set the intervals based on a query - request_dict = {} - request_dict['LANG'] = 'ADQL' - request_dict['FORMAT'] = 'json' - + # Construct ADQL query url_query = {} url_query['SELECT'] = '*' # Assume science data by deafult @@ -57,14 +51,14 @@ def _construct_url(query): url_query['FROM'] = 'v_ll_data_item' url_query['WHERE'] = '+AND+'.join(query) - request_dict['QUERY'] = '+'.join([f'{item}+{url_query[item]}' for - item in url_query]) + adql_query = '+'.join([f'{item}+{url_query[item]}' for item in url_query]) - request_str = '' - request_str = [f'{item}={request_dict[item]}' for item in request_dict] - request_str = '&'.join(request_str) + payload = {'REQUEST': 'doQuery', + 'LANG': 'ADQL', + 'FORMAT': 'json', + 'QUERY': adql_query} - return base_url + request_str + return payload @staticmethod def _do_search(query): @@ -81,10 +75,13 @@ def _do_search(query): astropy.table.QTable Query results. """ - url = SOARClient._construct_url(query) - log.debug(f'Getting request from URL: {url}') + tap_endpoint = 'http://soar.esac.esa.int/soar-sl-tap/tap' + payload = SOARClient._construct_payload(query) + # Need to force requests to not form-encode the paramaters + payload = '&'.join([f'{key}={val}' for key, val in payload.items()]) # Get request info - r = requests.get(url) + r = requests.get(f'{tap_endpoint}/sync', params=payload) + log.debug(f'Sent query: {r.url}') r.raise_for_status() # Do some list/dict wrangling