docstr: Parameters
  ----------
  po_name : str
      The name of the query object to query
  
  data : dict
      The deserialized request body
  
  uid: str
      A unique identifier for the request
  
  qry: str
      The incoming query object. This object maintains
      raw incoming request, which is different from the sanitied data
  
  Returns
  -------
  out : (result type, dict, int)
      A triple containing a result type, the result message
      as a dictionary, and the time in seconds that it took to complete
      the request.
docstr_tok: ["Parameters","--","--","--","--","--","po_name",":","str","The","name","of","the","query","object","to","query","data",":","dict","The","deserialized","request","body","uid",":","str","A","unique","identifier","for","the","request","qry",":","str","The","incoming","query","object",".","This","object","maintains","raw","incoming","request",",","which","is","different","from","the","sanitied","data","Returns","--","--","--","-","out",":","(","result","type",",","dict",",","int",")","A","triple","containing","a","result","type",",","the","result","message","as","a","dictionary",",","and","the","time","in","seconds","that","it","took","to","complete","the","request","."]
code: def _query(self, po_name, data, uid, qry):
      """
      Parameters
      ----------
      po_name : str
          The name of the query object to query
  
      data : dict
          The deserialized request body
  
      uid: str
          A unique identifier for the request
  
      qry: str
          The incoming query object. This object maintains
          raw incoming request, which is different from the sanitied data
  
      Returns
      -------
      out : (result type, dict, int)
          A triple containing a result type, the result message
          as a dictionary, and the time in seconds that it took to complete
          the request.
      """
      self.logger.log(
          logging.DEBUG, f"Collecting query info for {po_name}..."
      )
      start_time = time.time()
      response = self.python_service.ps.query(po_name, data, uid)
      gls_time = time.time() - start_time
      self.logger.log(logging.DEBUG, f"Query info: {response}")
  
      if isinstance(response, QuerySuccessful):
          response_json = response.to_json()
          md5_tag = md5(response_json.encode("utf-8")).hexdigest()
          self.set_header("Etag", f'"{md5_tag}"')
          return (QuerySuccessful, response.for_json(), gls_time)
      else:
          self.logger.log(
              logging.ERROR, f"Failed query, response: {response}"
          )
          return (type(response), response.for_json(), gls_time)
  
imports: from tabpy.tabpy_server.handlers import BaseHandler
  import logging
  import time
  from tabpy.tabpy_server.common.messages import Query, QuerySuccessful, QueryError, UnknownURI
  from hashlib import md5
  import uuid
  import json
  from tabpy.tabpy_server.common.util import format_exception
  import urllib
  from tornado import gen
  from tabpy.tabpy_server.handlers.util import AuthErrorStates
label_desc: Use image node_id 2 for calling the QueryPlaneHandler obj's underlying member method code with example usage: obj._query(po_name, data, uid, qry) and returns: QuerySuccessful,  response,  gls_time, type,  response,  gls_time