def getparamslist(self, args): ''' Retrieve a list of all available input parameters into the query .. :quickref: Query; Get a list of all or "best" queryable parameters :query string release: the release of MaNGA :form paramdisplay: ``all`` or ``best``, type of parameters to return :resjson int status: status of response. 1 if good, -1 if bad. :resjson string error: error message, null if None :resjson json inconfig: json of incoming configuration :resjson json utahconfig: json of outcoming configuration :resjson string traceback: traceback of an error, null if None :resjson string data: dictionary of returned data :json list params: the list of queryable parameters :resheader Content-Type: application/json :statuscode 200: no error :statuscode 422: invalid input parameters **Example request**: .. sourcecode:: http GET /marvin/api/query/getparamslist/ HTTP/1.1 Host: api.sdss.org Accept: application/json, */* **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Type: application/json { "status": 1, "error": null, "inconfig": {"release": "MPL-5"}, "utahconfig": {"release": "MPL-5", "mode": "local"}, "traceback": null, "data": ['nsa.z', 'cube.ra', 'cube.dec', ...] } ''' paramdisplay = args.pop('paramdisplay', 'all') if paramdisplay == 'all': try: params = Query.get_available_params('all', release=args['release']) except MarvinError as e: self.results['error'] = str(e) self.results['traceback'] = get_traceback(asstring=True) self.results['status'] = -1 return jsonify(self.results) elif paramdisplay == 'best': params = bestparams self.results['data'] = params self.results['status'] = 1 output = jsonify(self.results) return output
def make_error_json(error, name, code, data=None): ''' creates the error json dictionary for API errors ''' shortname = name.lower().replace(' ', '_') messages = {'error': shortname, 'message': error.description if hasattr(error, 'description') else None, 'status_code': code, 'traceback': get_traceback(asstring=True)} if data: return jsonify({'validation_errors': data}), code else: return jsonify({'api_error': messages}), code
def _compressed_response(compression, results): ''' Compress the data before sending it back in the Response Parameters: compression (str): The compression type. Either `json` or `msgpack`. results (dict): The current response dictionary Returns: A Flask Response object with the compressed data ''' # pack the data mimetype = 'json' if compression == 'json' else 'octet-stream' try: packed = compress_data(results, compress_with=compression) except Exception as e: results['error'] = str(e) results['traceback'] = get_traceback(asstring=True) return Response(stream_with_context(packed), mimetype='application/{0}'.format(mimetype))
def query_getsubset(self, args): ''' Remotely grab a subset of results from a query .. :quickref: Query; Grab a subset of results from a remote query :query string release: the release of MaNGA :form searchfilter: your string searchfilter expression :form params: the list of return parameters :form rettype: the string indicating your Marvin Tool conversion object :form start: the starting page index of results you wish to grab :form end: the ending page index of the results you wish to grab :form limit: the limiting number of results to return for large results :form sort: a string parameter name to sort on :form order: the order of the sort, either ``desc`` or ``asc`` :resjson int status: status of response. 1 if good, -1 if bad. :resjson string error: error message, null if None :resjson json inconfig: json of incoming configuration :resjson json utahconfig: json of outcoming configuration :resjson string traceback: traceback of an error, null if None :resjson string data: dictionary of returned data :json list results: the list of results :json string query: the raw SQL string of your query :json int chunk: the page limit of the results :json string filter: the searchfilter used :json list returnparams: the list of return parameters :json list params: the list of parameters used in the query :json list queryparams_order: the list of parameters used in the query :json dict runtime: a dictionary of query time (days, minutes, seconds) :json int totalcount: the total count of results :json int count: the count in the current page of results :resheader Content-Type: application/json :statuscode 200: no error :statuscode 422: invalid input parameters **Example request**: .. sourcecode:: http GET /marvin2/api/query/cubes/getsubset/ HTTP/1.1 Host: api.sdss.org Accept: application/json, */* **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Type: application/json { "status": 1, "error": null, "inconfig": {"release": "MPL-5", "searchfilter": "nsa.z<0.1", "start":10, "end":15}, "utahconfig": {"release": "MPL-5", "mode": "local"}, "traceback": null, "chunk": 100, "count": 4, "data": [["1-209232",8485,"8485-1901","1901",0.0407447], ["1-209113",8485,"8485-1902","1902",0.0378877], ["1-209191",8485,"8485-12701","12701",0.0234253], ["1-209151",8485,"8485-12702","12702",0.0185246] ], "filter": "nsa.z<0.1", "params": ["cube.mangaid","cube.plate","cube.plateifu","ifu.name","nsa.z"], "query": "SELECT ... FROM ... WHERE ...", "queryparams_order": ["mangaid","plate","plateifu","name","z"], "returnparams": null, "runtime": {"days": 0,"microseconds": 55986,"seconds": 0}, "totalcount": 4 } ''' searchfilter = args.pop('searchfilter', None) try: res = _getCubes(searchfilter, **args) except MarvinError as e: self.results['error'] = str(e) self.results['traceback'] = get_traceback(asstring=True) else: self.results['status'] = 1 self.update_results(res) # this needs to be json.dumps until sas-vm at Utah updates to 2.7.11 return Response(json.dumps(self.results), mimetype='application/json')
def query_allcolumn(self, args, colname): ''' Retrieves the entire result set for a single column .. :quickref: Query; Retrieves the entire result set for a single column :query string release: the release of MaNGA :form searchfilter: your string searchfilter expression :resjson int status: status of response. 1 if good, -1 if bad. :resjson string error: error message, null if None :resjson json inconfig: json of incoming configuration :resjson json utahconfig: json of outcoming configuration :resjson string traceback: traceback of an error, null if None :resjson string data: dictionary of returned data :json list column: the list of results for the specified column :resheader Content-Type: application/json :statuscode 200: no error :statuscode 422: invalid input parameters **Example request**: .. sourcecode:: http GET /marvin2/api/query/cubes/columns/plateifu/ HTTP/1.1 Host: api.sdss.org Accept: application/json, */* **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Type: application/json { "status": 1, "error": null, "inconfig": {"release": "MPL-5", "searchfilter": "nsa.z<0.1"}, "utahconfig": {"release": "MPL-5", "mode": "local"}, "traceback": null, "chunk": 100, "count": 4, "data": ["8485-1901", "8485-1902", "8485-12701", "7443-12701", "8485-12702"], } ''' searchfilter = args.pop('searchfilter', None) format_type = args.pop('format_type', 'list') try: query, results = _run_query(searchfilter, **args) except MarvinError as e: self.results['error'] = str(e) self.results['traceback'] = get_traceback(asstring=True) else: try: column = _get_column(results, colname, format_type=format_type) except MarvinError as e: self.results['error'] = str(e) self.results['traceback'] = get_traceback(asstring=True) else: self.results['status'] = 1 self.results['data'] = column self.results['runtime'] = _get_runtime(query) return Response(json.dumps(self.results), mimetype='application/json')