class_docstr: Interact with Amazon EMR Containers (Amazon EMR on EKS).
  
  Provide thick wrapper around :py:class:`boto3.client("emr-containers") <EMRContainers.Client>`.
  
  :param virtual_cluster_id: Cluster ID of the EMR on EKS virtual cluster
  
  Additional arguments (such as ``aws_conn_id``) may be specified and
  are passed down to the underlying AwsBaseHook.
  
  .. seealso::
      - :class:`airflow.providers.amazon.aws.hooks.base_aws.AwsBaseHook`
class_docstr_tok: ["Interact","with","Amazon","EMR","Containers","(","Amazon","EMR","on","EKS",")",".","Provide","thick","wrapper","around",":","py",":","class",":","`","boto3.client","(","``","emr-containers","''",")","<","EMRContainers.Client",">","`",".",":","param","virtual_cluster_id",":","Cluster","ID","of","the","EMR","on","EKS","virtual","cluster","Additional","arguments","(","such","as","``","aws_conn_id","``",")","may","be","specified","and","are","passed","down","to","the","underlying","AwsBaseHook",".","..","seealso",":",":","-",":","class",":","`","airflow.providers.amazon.aws.hooks.base_aws.AwsBaseHook","`"]
docstr: Fetch the status of submitted job run. Returns None or one of valid query states.
  
  .. seealso::
      - :external+boto3:py:meth:`EMRContainers.Client.describe_job_run`
  
  :param job_id: The ID of the job run request.
docstr_tok: ["Fetch","the","status","of","submitted","job","run",".","Returns","None","or","one","of","valid","query","states",".","..","seealso",":",":","-",":","external+boto3",":","py",":","meth",":","`","EMRContainers.Client.describe_job_run","`",":","param","job_id",":","The","ID","of","the","job","run","request","."]
code: def check_query_status(self, job_id: str) -> str | None:
      """
      Fetch the status of submitted job run. Returns None or one of valid query states.
  
      .. seealso::
          - :external+boto3:py:meth:`EMRContainers.Client.describe_job_run`
  
      :param job_id: The ID of the job run request.
      """
      try:
          response = self.conn.describe_job_run(
              virtualClusterId=self.virtual_cluster_id,
              id=job_id,
          )
          return response["jobRun"]["state"]
      except self.conn.exceptions.ResourceNotFoundException:
          # If the job is not found, we raise an exception as something fatal has happened.
          raise AirflowException(
              f"Job ID {job_id} not found on Virtual Cluster {self.virtual_cluster_id}"
          )
      except ClientError as ex:
          # If we receive a generic ClientError, we swallow the exception so that the
          self.log.error(
              "AWS request failed, check logs for more info: %s", ex
          )
          return None
  
imports: from __future__ import annotations
  import json
  import time
  import warnings
  from typing import Any
  from botocore.exceptions import ClientError
  from airflow.exceptions import AirflowException, AirflowNotFoundException
  from airflow.providers.amazon.aws.hooks.base_aws import AwsBaseHook
  from airflow.providers.amazon.aws.utils.waiter_with_logging import wait
label_desc: Use image node_id 5 for calling the EmrContainerHook obj's underlying member method code with example usage: obj.check_query_status(job_id) and returns: response, None