From 6ef7f79f5085b7281fd9d3288c274d9534f76ca8 Mon Sep 17 00:00:00 2001
From: John Swinbank <john@swinbank.org>
Date: Thu, 24 Feb 2022 18:54:58 +0100
Subject: [PATCH] Don't do all that decoding

---
 esap/query/api/services/astron_vo.py | 119 +++++++--------------------
 1 file changed, 31 insertions(+), 88 deletions(-)

diff --git a/esap/query/api/services/astron_vo.py b/esap/query/api/services/astron_vo.py
index 167011d5..fd023631 100644
--- a/esap/query/api/services/astron_vo.py
+++ b/esap/query/api/services/astron_vo.py
@@ -4,6 +4,7 @@
     Date created: 2020-02-07
     Description:  ESAP services for VO.
 """
+from collections import namedtuple
 from rest_framework import serializers
 from .query_base import query_base
 import pyvo as vo
@@ -154,30 +155,14 @@ class tap_service_connector(query_base):
             # http://www.ivoa.net/documents/ObsCore/20170509/REC-ObsCore-v1.1-20170509.pdf
 
             record = {}
-            result = ''
 
             # if * then iterate on the full row, otherwise just on the selection
             if dataset.select_fields=='*':
-                values = row.values()
-
-                for value in values:
-                    try:
-                        result = result + value.decode('utf-8') + ','
-                    except:
-                        try:
-                            result = result + str(value) + ','
-                        except:
-                            pass
+                result = ",".join(str(value) for value in row.values())
             else:
                 select_list = dataset.select_fields.split(',')
+                result = ",".join(str(row[key]) for key in select_list)
 
-                for select in select_list:
-                    try:
-                        result = result + row[select].decode('utf-8') + ','
-                    except:
-                        pass
-            # cut off the last ','
-            result = result[:-1]
             record['dataset'] = dataset.uri
             record['dataset_name'] = dataset_name
             record['result'] = result
@@ -185,77 +170,35 @@ class tap_service_connector(query_base):
 
             # add some fields to return some rendering information for the frontend.
             # for ivoa.obscore field names see: http://www.ivoa.net/documents/ObsCore/20170509/REC-ObsCore-v1.1-20170509.pdf
-            try:
-                record['title'] = row[dataset.title_field].decode('utf-8')
-            except:
-                pass
-
-            try:
-                record['dataproduct_type'] = row['dataproduct_type'].decode('utf-8')
-            except:
-                pass
-
-            try:
-                record['calibration_level'] = row['calib_level']
-                record['level'] = row['calib_level']
-            except:
-                pass
-
-            try:
-                record['thumbnail'] = row[dataset.thumbnail_field].decode('utf-8')
-            except:
-                record['thumbnail'] = ''
-
-            try:
-                record['url'] = row[dataset.url_field].decode('utf-8')
-            except:
-                pass
-
-            try:
-                record['name'] = row['target_name'].decode('utf-8')
-            except:
-                record['name'] = 'unknown'
-
-            try:
-                record['ra'] = row['s_ra']
-            except:
-                pass
 
-            try:
-                record['dec'] = row['s_dec']
-            except:
-                pass
-
-            try:
-                record['fov'] = row['s_fov']
-            except:
-                pass
-
-            try:
-                record['target'] = row['target_name'].decode('utf-8')
-            except:
-                pass
-
-            try:
-                record['obs_collection'] = row['obs_collection'].decode('utf-8')
-                record['collection'] = row['obs_collection'].decode('utf-8')
-            except:
-                record['collection']  = 'unknown'
-
-            try:
-                record['size'] = row['access_estsize']
-            except:
-                pass
-
-            try:
-                record['facility'] = row['facility_name'].decode('utf-8')
-            except:
-                pass
-
-            try:
-                record['instrument'] = row['instrument_name'].decode('utf-8')
-            except:
-                pass
+            # We'll map field "src" in the result to field "dst" in the output
+            # record. If "src" doesn't exist, we'll use "default" if specified,
+            # otherwise we won't set the field.
+            KeywordMapping = namedtuple('KeywordMapping', ['src', 'dst', 'default'])
+            keyword_mappings = [
+                KeywordMapping(dataset.title_field, 'title', None),
+                KeywordMapping('dataproduct_type', 'dataproduct_type', None),
+                KeywordMapping('calib_level', 'calibration_level', None),
+                KeywordMapping('calib_level', 'level', None),
+                KeywordMapping(dataset.thumbnail_field, 'thumbnail', ''),
+                KeywordMapping(dataset.url_field, 'url', None),
+                KeywordMapping('target_name', 'name', 'unknown'),
+                KeywordMapping('target_name', 'target', None),
+                KeywordMapping('s_ra', 'ra', None),
+                KeywordMapping('s_dec', 'dec', None),
+                KeywordMapping('s_fov', 'fov', None),
+                KeywordMapping('s_fov', 'fov', None),
+                KeywordMapping('obs_collection', 'obs_collection', None),
+                KeywordMapping('obs_collection', 'collection', 'unknown'),
+                KeywordMapping('access_estsize', 'size', None),
+                KeywordMapping('facility_name', 'facility', None),
+                KeywordMapping('instrument_name', 'instrument', None)
+            ]
+            for mapping in keyword_mappings:
+                if mapping.src in row:
+                    record[mapping.dst] = row[mapping.src]
+                elif mapping.default is not None:
+                    record[mapping.dst] = mapping.default
 
             results.append(record)
 
-- 
GitLab