public final Iterable<ItemT> search(
      final RequestT request,
      final GenomicsRequestInitializer<? super RequestSubT> initializer,
      final RetryPolicy retryPolicy) {
    final ApiT api = getApi(genomics);
    return FluentIterable
        .from(
            new Iterable<Pair>() {
              @Override public Iterator<Pair> iterator() {
                try {
                  return new AbstractSequentialIterator<Pair>(
                          new Pair(createSearch(api, request, Optional.<String>absent()), null)) {
                        @Override protected Pair computeNext(Pair pair) {
                          return Optional.fromNullable(pair.request)
                              .transform(
                                  new Function<RequestSubT, Pair>() {
                                    @Override public Pair apply(RequestSubT search) {
                                      try {
                                        initializer.initialize(search);
                                        ResponseT response = retryPolicy.execute(search);
                                        Optional<String> pageToken =
                                            Optional.fromNullable(Strings.emptyToNull(getNextPageToken(response)));
                                        return new Pair(
                                            pageToken.isPresent()
                                                ? createSearch(api, request, pageToken)
                                                : null,
                                            response);
                                      } catch (IOException e) {
                                        throw new SearchException(e);
                                      }
                                    }
                                  })
                              .orNull();
                        }
                      };
                } catch (IOException e) {
                  throw new SearchException(e);
                }
              }
            })
        .skip(1)
        .transform(
            new Function<Pair, ResponseT>() {
              @Override public ResponseT apply(Pair pair) {
                return pair.response;
              }
            })
        .transformAndConcat(
            new Function<ResponseT, Iterable<ItemT>>() {
              @Override public Iterable<ItemT> apply(ResponseT response) {
                return Optional.fromNullable(getResponses(response)).or(Collections.<ItemT>emptyList());
              }
            });
  }
public final Iterable < ItemT > search ( final RequestT request , final GenomicsRequestInitializer < ? super RequestSubT > initializer , final RetryPolicy retryPolicy ) { final ApiT api = getApi ( genomics ) ; return FluentIterable . from ( new Iterable < Pair > ( ) { @ Override public Iterator < Pair > iterator ( ) { try { return new AbstractSequentialIterator < Pair > ( new Pair ( createSearch ( api , request , Optional . < String > absent ( ) ) , null ) ) { @ Override protected Pair computeNext ( Pair pair ) { return Optional . fromNullable ( pair . request ) . transform ( new Function < RequestSubT , Pair > ( ) { @ Override public Pair apply ( RequestSubT search ) { try { initializer . initialize ( search ) ; ResponseT response = retryPolicy . execute ( search ) ; Optional < String > pageToken = Optional . fromNullable ( Strings . emptyToNull ( getNextPageToken ( response ) ) ) ; return new Pair ( pageToken . isPresent ( ) ? createSearch ( api , request , pageToken ) : null , response ) ; } catch ( IOException e ) { throw new SearchException ( e ) ; } } } ) . orNull ( ) ; } } ; } catch ( IOException e ) { throw new SearchException ( e ) ; } } } ) . skip ( 1 ) . transform ( new Function < Pair , ResponseT > ( ) { @ Override public ResponseT apply ( Pair pair ) { return pair . response ; } } ) . transformAndConcat ( new Function < ResponseT , Iterable < ItemT > > ( ) { @ Override public Iterable < ItemT > apply ( ResponseT response ) { return Optional . fromNullable ( getResponses ( response ) ) . or ( Collections . < ItemT > emptyList ( ) ) ; } } ) ; }
Search for objects. Warning: the returned {@link Iterable} may throw {@link SearchException}
during iteration; users are encouraged to call
{@link #search(Object, GenomicsRequestInitializer, Callback, RetryPolicy)} instead.

@param request The search request.
@param initializer The {@link GenomicsRequestInitializer} to initialize requests with.
@param retryPolicy A retry policy specifying behavior when a request fails
(usually due to SocketTimeoutExceptions)
@return A lazy stream of search results.