parameters: (self, query_id=None, query_result_id=None, filetype="json")
docstring: 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
docstring_summary: Retrieve query results.
docstring_tokens: Retrieve query results .
function: 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.")
function_tokens: 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." )