class_docstr: Common implementation for operators, including unmapped and mapped.
  
  This base class is more about sharing implementations, not defining a common
  interface. Unfortunately it's difficult to use this as the common base class
  for typing due to BaseOperator carrying too much historical baggage.
  
  The union type ``from airflow.models.operator import Operator`` is easier
  to use for typing purposes.
  
  :meta private:
class_docstr_tok: ["Common","implementation","for","operators",",","including","unmapped","and","mapped",".","This","base","class","is","more","about","sharing","implementations",",","not","defining","a","common","interface",".","Unfortunately","it","'s","difficult","to","use","this","as","the","common","base","class","for","typing","due","to","BaseOperator","carrying","too","much","historical","baggage",".","The","union","type","``","from","airflow.models.operator","import","Operator","``","is","easier","to","use","for","typing","purposes",".",":","meta","private",":"]
docstr: Return mapped nodes that are direct dependencies of the current task.
  
  For now, this walks the entire DAG to find mapped nodes that has this
  current task as an upstream. We cannot use ``downstream_list`` since it
  only contains operators, not task groups. In the future, we should
  provide a way to record an DAG node's all downstream nodes instead.
  
  Note that this does not guarantee the returned tasks actually use the
  current task for task mapping, but only checks those task are mapped
  operators, and are downstreams of the current task.
  
  To get a list of tasks that uses the current task for task mapping, use
  :meth:`iter_mapped_dependants` instead.
docstr_tok: ["Return","mapped","nodes","that","are","direct","dependencies","of","the","current","task",".","For","now",",","this","walks","the","entire","DAG","to","find","mapped","nodes","that","has","this","current","task","as","an","upstream",".","We","can","not","use","``","downstream_list","``","since","it","only","contains","operators",",","not","task","groups",".","In","the","future",",","we","should","provide","a","way","to","record","an","DAG","node","'s","all","downstream","nodes","instead",".","Note","that","this","does","not","guarantee","the","returned","tasks","actually","use","the","current","task","for","task","mapping",",","but","only","checks","those","task","are","mapped","operators",",","and","are","downstreams","of","the","current","task",".","To","get","a","list","of","tasks","that","uses","the","current","task","for","task","mapping",",","use",":","meth",":","`","iter_mapped_dependants","`","instead","."]
code: def _iter_all_mapped_downstreams(
      self,
  ) -> Iterator[MappedOperator | MappedTaskGroup]:
      """Return mapped nodes that are direct dependencies of the current task.
  
      For now, this walks the entire DAG to find mapped nodes that has this
      current task as an upstream. We cannot use ``downstream_list`` since it
      only contains operators, not task groups. In the future, we should
      provide a way to record an DAG node's all downstream nodes instead.
  
      Note that this does not guarantee the returned tasks actually use the
      current task for task mapping, but only checks those task are mapped
      operators, and are downstreams of the current task.
  
      To get a list of tasks that uses the current task for task mapping, use
      :meth:`iter_mapped_dependants` instead.
      """
      from airflow.models.mappedoperator import MappedOperator
      from airflow.utils.task_group import TaskGroup
  
      def _walk_group(
          group: TaskGroup,
      ) -> Iterable[tuple[str, DAGNode]]:
          """Recursively walk children in a task group.
  
          This yields all direct children (including both tasks and task
          groups), and all children of any task groups.
          """
          for key, child in group.children.items():
              yield key, child
              if isinstance(child, TaskGroup):
                  yield from _walk_group(child)
  
      dag = self.get_dag()
      if not dag:
          raise RuntimeError(
              "Cannot check for mapped dependants when not attached to a DAG"
          )
      for key, child in _walk_group(dag.task_group):
          if key == self.node_id:
              continue
          if not isinstance(child, (MappedOperator, MappedTaskGroup)):
              continue
          if self.node_id in child.upstream_task_ids:
              yield child
  
imports: from __future__ import annotations
  import datetime
  import inspect
  from functools import cached_property
  from typing import TYPE_CHECKING, Any, Callable, ClassVar, Collection, Iterable, Iterator, Sequence
  from sqlalchemy import select
  from airflow.compat.functools import cache
  from airflow.configuration import conf
  from airflow.exceptions import AirflowException
  from airflow.models.expandinput import NotFullyPopulated
  from airflow.models.taskmixin import DAGNode, DependencyMixin
  from airflow.template.templater import Templater
  from airflow.utils.context import Context
  from airflow.utils.db import exists_query
  from airflow.utils.log.secrets_masker import redact
  from airflow.utils.session import NEW_SESSION, provide_session
  from airflow.utils.setup_teardown import SetupTeardownContext
  from airflow.utils.sqlalchemy import skip_locked, with_row_locks
  from airflow.utils.state import State, TaskInstanceState
  from airflow.utils.task_group import MappedTaskGroup
  from airflow.utils.trigger_rule import TriggerRule
  from airflow.utils.types import NOTSET, ArgNotSet
  from airflow.utils.weight_rule import WeightRule
label_desc: Use image node_id 21 for calling the AbstractOperator obj's underlying member method code with example usage: obj._iter_all_mapped_downstreams() without return types