(self, query_id=None, query_result_id=None, filetype="json")
Retrieve query results.

        :param number query_id: The ID of the query whose results should be fetched
        :param number query_result_id: the ID of the query result to fetch
        :param string filetype: Format to return. One of 'json', 'xlsx', or 'csv'. Defaults to 'json'.

        :<json number id: Query result ID
        :<json string query: Query that produced this result
        :<json string query_hash: Hash code for query text
        :<json object data: Query output
        :<json number data_source_id: ID of data source that produced this result
        :<json number runtime: Length of execution time in seconds
        :<json string retrieved_at: Query retrieval date/time, in ISO format
Retrieve query results.
Retrieve query results .
def get(self, query_id=None, query_result_id=None, filetype="json"):
        """
        Retrieve query results.

        :param number query_id: The ID of the query whose results should be fetched
        :param number query_result_id: the ID of the query result to fetch
        :param string filetype: Format to return. One of 'json', 'xlsx', or 'csv'. Defaults to 'json'.

        :<json number id: Query result ID
        :<json string query: Query that produced this result
        :<json string query_hash: Hash code for query text
        :<json object data: Query output
        :<json number data_source_id: ID of data source that produced this result
        :<json number runtime: Length of execution time in seconds
        :<json string retrieved_at: Query retrieval date/time, in ISO format
        """
        # TODO:
        # This method handles two cases: retrieving result by id & retrieving result by query id.
        # They need to be split, as they have different logic (for example, retrieving by query id
        # should check for query parameters and shouldn't cache the result).
        should_cache = query_result_id is not None

        parameter_values = collect_parameters_from_request(request.args)
        max_age = int(request.args.get("maxAge", 0))

        query_result = None
        query = None

        if query_result_id:
            query_result = get_object_or_404(
                models.QueryResult.get_by_id_and_org, query_result_id, self.current_org
            )

        if query_id is not None:
            query = get_object_or_404(
                models.Query.get_by_id_and_org, query_id, self.current_org
            )

            if (
                query_result is None
                and query is not None
                and query.latest_query_data_id is not None
            ):
                query_result = get_object_or_404(
                    models.QueryResult.get_by_id_and_org,
                    query.latest_query_data_id,
                    self.current_org,
                )

            if (
                query is not None
                and query_result is not None
                and self.current_user.is_api_user()
            ):
                if query.query_hash != query_result.query_hash:
                    abort(404, message="No cached result found for this query.")

        if query_result:
            require_access(query_result.data_source, self.current_user, view_only)

            if isinstance(self.current_user, models.ApiUser):
                event = {
                    "user_id": None,
                    "org_id": self.current_org.id,
                    "action": "api_get",
                    "api_key": self.current_user.name,
                    "file_type": filetype,
                    "user_agent": request.user_agent.string,
                    "ip": request.remote_addr,
                }

                if query_id:
                    event["object_type"] = "query"
                    event["object_id"] = query_id
                else:
                    event["object_type"] = "query_result"
                    event["object_id"] = query_result_id

                self.record_event(event)

            response_builders = {
                "json": self.make_json_response,
                "xlsx": self.make_excel_response,
                "csv": self.make_csv_response,
                "tsv": self.make_tsv_response,
            }
            response = response_builders[filetype](query_result)

            if len(settings.ACCESS_CONTROL_ALLOW_ORIGIN) > 0:
                self.add_cors_headers(response.headers)

            if should_cache:
                response.headers.add_header(
                    "Cache-Control", "private,max-age=%d" % ONE_YEAR
                )

            filename = get_download_filename(query_result, query, filetype)

            filenames = content_disposition_filenames(filename)
            response.headers.add("Content-Disposition", "attachment", **filenames)

            return response

        else:
            abort(404, message="No cached result found for this query.")
def get ( self , query_id = None , query_result_id = None , filetype = "json" ) : # TODO: # This method handles two cases: retrieving result by id & retrieving result by query id. # They need to be split, as they have different logic (for example, retrieving by query id # should check for query parameters and shouldn't cache the result). should_cache = query_result_id is not None parameter_values = collect_parameters_from_request ( request . args ) max_age = int ( request . args . get ( "maxAge" , 0 ) ) query_result = None query = None if query_result_id : query_result = get_object_or_404 ( models . QueryResult . get_by_id_and_org , query_result_id , self . current_org ) if query_id is not None : query = get_object_or_404 ( models . Query . get_by_id_and_org , query_id , self . current_org ) if ( query_result is None and query is not None and query . latest_query_data_id is not None ) : query_result = get_object_or_404 ( models . QueryResult . get_by_id_and_org , query . latest_query_data_id , self . current_org , ) if ( query is not None and query_result is not None and self . current_user . is_api_user ( ) ) : if query . query_hash != query_result . query_hash : abort ( 404 , message = "No cached result found for this query." ) if query_result : require_access ( query_result . data_source , self . current_user , view_only ) if isinstance ( self . current_user , models . ApiUser ) : event = { "user_id" : None , "org_id" : self . current_org . id , "action" : "api_get" , "api_key" : self . current_user . name , "file_type" : filetype , "user_agent" : request . user_agent . string , "ip" : request . remote_addr , } if query_id : event [ "object_type" ] = "query" event [ "object_id" ] = query_id else : event [ "object_type" ] = "query_result" event [ "object_id" ] = query_result_id self . record_event ( event ) response_builders = { "json" : self . make_json_response , "xlsx" : self . make_excel_response , "csv" : self . make_csv_response , "tsv" : self . make_tsv_response , } response = response_builders [ filetype ] ( query_result ) if len ( settings . ACCESS_CONTROL_ALLOW_ORIGIN ) > 0 : self . add_cors_headers ( response . headers ) if should_cache : response . headers . add_header ( "Cache-Control" , "private,max-age=%d" % ONE_YEAR ) filename = get_download_filename ( query_result , query , filetype ) filenames = content_disposition_filenames ( filename ) response . headers . add ( "Content-Disposition" , "attachment" , * * filenames ) return response else : abort ( 404 , message = "No cached result found for this query." )