code: @SuppressWarnings("unchecked") // Pipeline ensures the proper type will be returned from getMany
      public <T> CloseableIterator<T> getMany(final Class<T> type, final Map<String, Object> query, final boolean streaming) {
          final List<SourceHandler<?, ?>> handlers = getSourceHandlers(type);
  
          if(handlers.isEmpty()) {
              return null;
          }
  
          final PipelineContext context = newContext();
  
          for(final SourceHandler<?, ?> handler : handlers) {
              final CloseableIterator<T> result = (CloseableIterator<T>)handler.getMany(query, context, streaming);
              if(result != null) {
                  return result;
              }
          }
          return null;
      }
docs: Gets multiple data elements from the {@link com.merakianalytics.datapipelines.DataPipeline}
  
  @param <T>
  the type of the data that should be retrieved
  @param type
  the type of the data that should be retrieved
  @param query
  a query specifying the details of what data should fulfill this request
  @param streaming
  whether to stream the results. If streaming is enabled, results from the {@link com.merakianalytics.datapipelines.sources.DataSource} will be
  converted and provided to the {@link com.merakianalytics.datapipelines.sinks.DataSink}s one-by-one as they are requested from the
  {@link com.merakianalytics.datapipelines.iterators.CloseableIterator} instead of converting and storing them all at once.
  @return a {@link com.merakianalytics.datapipelines.iterators.CloseableIterator} of the request type if the query had a result, or null