docs: def get_many(self, type: Type[T], query: Mapping[str, Any], streaming: bool = False) -> Iterable[T]:
          """Gets a query from the data pipeline, which contains a request for multiple objects.
  
          1) Extracts the query the sequence of data sources.
          2) Inserts the results into the data sinks (if appropriate).
          3) Transforms the results into the requested type if it wasn't already.
          4) Inserts the transformed result into any data sinks.
  
          Args:
              query: The query being requested (contains a request for multiple objects).
              context: The context for the extraction (mutable).
              streaming: Specifies whether the results should be returned as a generator (default False).
  
          Returns:
              The requested objects or a generator of the objects if streaming is True.
          """
          LOGGER.info("Getting SourceHandlers for \"{type}\"".format(type=type.__name__))
          try:
              handlers = self._get_types[type]
          except KeyError:
              try:
                  LOGGER.info("Building new SourceHandlers for \"{type}\"".format(type=type.__name__))
                  handlers = self._get_handlers(type)
              except NoConversionError:
                  handlers = None
              self._get_types[type] = handlers
  
          if handlers is None:
              raise NoConversionError("No source can provide \"{type}\"".format(type=type.__name__))
  
          LOGGER.info("Creating new PipelineContext")
          context = self._new_context()
  
          LOGGER.info("Querying SourceHandlers for \"{type}\"".format(type=type.__name__))
          for handler in handlers:
              try:
                  return handler.get_many(query, context, streaming)
              except NotFoundError:
                  pass
  
          raise NotFoundError("No source returned a query result!")