From 8af6d409afc22a33a12ce20564622ff6addfed48 Mon Sep 17 00:00:00 2001 From: Jennifer Medina Date: Thu, 4 May 2023 13:17:09 -0400 Subject: [PATCH 1/4] parameters will be passed as JSON objects only when accessing PANSTARRS API. parameter syntax updated. --- astroquery/mast/collections.py | 12 ++++++++++-- astroquery/mast/services.py | 22 +++++++++++++++++++++- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/astroquery/mast/collections.py b/astroquery/mast/collections.py index 7e46436605..3063c08537 100644 --- a/astroquery/mast/collections.py +++ b/astroquery/mast/collections.py @@ -162,7 +162,11 @@ def query_region_async(self, coordinates, *, radius=0.2*u.deg, catalog="Hsc", for prop, value in kwargs.items(): params[prop] = value - return self._current_connection.service_request_async(service, params, pagesize=pagesize, page=page) + # Parameters will be passed as JSON objects only when accessing the PANSTARRS API + use_json = True if catalog.lower() == 'panstarrs' else False + + return self._current_connection.service_request_async(service, params, pagesize=pagesize, page=page, + use_json=use_json) @class_or_instance def query_object_async(self, objectname, *, radius=0.2*u.deg, catalog="Hsc", @@ -313,7 +317,11 @@ def query_criteria_async(self, catalog, *, pagesize=None, page=None, **criteria) raise InvalidQueryError("At least one non-positional criterion must be supplied.") params["filters"] = filters - return self._current_connection.service_request_async(service, params, pagesize=pagesize, page=page) + # Parameters will be passed as JSON objects only when accessing the PANSTARRS API + use_json = True if catalog.lower() == 'panstarrs' else False + + return self._current_connection.service_request_async(service, params, pagesize=pagesize, page=page, + use_json=use_json) @class_or_instance def query_hsc_matchid_async(self, match, *, version=3, pagesize=None, page=None): diff --git a/astroquery/mast/services.py b/astroquery/mast/services.py index b82bc36cba..24f5937b4f 100644 --- a/astroquery/mast/services.py +++ b/astroquery/mast/services.py @@ -288,7 +288,27 @@ def service_request_async(self, service, params, page_size=None, page=None, use_ catalogs_request.extend(self._build_catalogs_params(params)) else: headers['Content-Type'] = 'application/json' - catalogs_request = params + + # Parameter syntax needs to be updated only for PANSTARRS catalog queries + if service.lower() == 'panstarrs': + catalogs_request.extend(self._build_catalogs_params(params)) + + # After parameter syntax is updated, revert back to dictionary + # so params can be passed as a JSON dictionary + params_dict = {} + for key, val in catalogs_request: + params_dict.setdefault(key, []).append(val) + catalogs_request = params_dict + + # Removing single-element lists. Single values will live on their own (except for `sort_by`) + for key in catalogs_request.keys(): + if (key != 'sort_by') & (len(catalogs_request[key]) == 1): + catalogs_request[key] = catalogs_request[key][0] + + # Otherwise, catalogs_request can remain as the original params dict + else: + catalogs_request = params + response = self._request('POST', request_url, data=catalogs_request, headers=headers, use_json=use_json) return response From 9718c79339bf18233612ddbbb1ece47ede8a1225 Mon Sep 17 00:00:00 2001 From: Jennifer Medina Date: Fri, 5 May 2023 12:51:26 -0400 Subject: [PATCH 2/4] unit test for panstarrs query with columns and sort_by specified --- astroquery/mast/tests/test_mast_remote.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/astroquery/mast/tests/test_mast_remote.py b/astroquery/mast/tests/test_mast_remote.py index 09e41a02a1..f70f6dd236 100644 --- a/astroquery/mast/tests/test_mast_remote.py +++ b/astroquery/mast/tests/test_mast_remote.py @@ -691,6 +691,17 @@ def test_catalogs_query_criteria(self): assert isinstance(result, Table) assert 'PSO J254.2861-04.1091' in result['objName'] + result = mast.Catalogs.query_criteria(coordinates="158.47924 -7.30962", + radius=0.01, + catalog="PANSTARRS", + table="mean", + data_release="dr2", + nStackDetections=[("gte", "1")], + columns=["objName", "distance"], + sort_by=[("asc", "distance")]) + assert isinstance(result, Table) + assert result['distance'][0] <= result['distance'][1] + def test_catalogs_query_hsc_matchid_async(self): catalogData = mast.Catalogs.query_object("M10", radius=.001, From b4ccc43b4dd82cd65824bd1fd1fc68c343303702 Mon Sep 17 00:00:00 2001 From: Jennifer Medina Date: Fri, 5 May 2023 12:58:07 -0400 Subject: [PATCH 3/4] changelog entry --- CHANGES.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 1f3c18ffde..1e8ab6cecd 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -144,6 +144,8 @@ mast - Expanding ``Cutouts`` functionality to support TICA HLSPs now available through ``TesscutClass``. [##2668] + +- Resolved issue making PANSTARRS catalog queries when columns and sorting is specified. [#2727] nist ^^^^ From c42dd7ad36d28e595625c4564d644723353f26aa Mon Sep 17 00:00:00 2001 From: Jennifer V Medina Date: Fri, 5 May 2023 13:17:03 -0400 Subject: [PATCH 4/4] simplify `use_json` variable call --- astroquery/mast/collections.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/astroquery/mast/collections.py b/astroquery/mast/collections.py index 3063c08537..fe4c9c2de5 100644 --- a/astroquery/mast/collections.py +++ b/astroquery/mast/collections.py @@ -163,7 +163,7 @@ def query_region_async(self, coordinates, *, radius=0.2*u.deg, catalog="Hsc", params[prop] = value # Parameters will be passed as JSON objects only when accessing the PANSTARRS API - use_json = True if catalog.lower() == 'panstarrs' else False + use_json = catalog.lower() == 'panstarrs' return self._current_connection.service_request_async(service, params, pagesize=pagesize, page=page, use_json=use_json) @@ -318,7 +318,7 @@ def query_criteria_async(self, catalog, *, pagesize=None, page=None, **criteria) params["filters"] = filters # Parameters will be passed as JSON objects only when accessing the PANSTARRS API - use_json = True if catalog.lower() == 'panstarrs' else False + use_json = catalog.lower() == 'panstarrs' return self._current_connection.service_request_async(service, params, pagesize=pagesize, page=page, use_json=use_json)