private <RowT> ServerStreamingCallable<Query, RowT> createReadRowsCallable(
      ServerStreamingCallSettings<Query, Row> readRowsSettings, RowAdapter<RowT> rowAdapter) {

    ServerStreamingCallable<ReadRowsRequest, RowT> merging =
        new RowMergingCallable<>(stub.readRowsCallable(), rowAdapter);

    // Copy settings for the middle ReadRowsRequest -> RowT callable (as opposed to the outer
    // Query -> RowT callable or the inner ReadRowsRequest -> ReadRowsResponse callable).
    ServerStreamingCallSettings<ReadRowsRequest, RowT> innerSettings =
        ServerStreamingCallSettings.<ReadRowsRequest, RowT>newBuilder()
            .setResumptionStrategy(new ReadRowsResumptionStrategy<>(rowAdapter))
            .setRetryableCodes(readRowsSettings.getRetryableCodes())
            .setRetrySettings(readRowsSettings.getRetrySettings())
            .setIdleTimeout(readRowsSettings.getIdleTimeout())
            .build();

    // Retry logic is split into 2 parts to workaround a rare edge case described in
    // ReadRowsRetryCompletedCallable
    ServerStreamingCallable<ReadRowsRequest, RowT> retrying1 =
        new ReadRowsRetryCompletedCallable<>(merging);

    ServerStreamingCallable<ReadRowsRequest, RowT> retrying2 =
        Callables.retrying(retrying1, innerSettings, clientContext);

    FilterMarkerRowsCallable<RowT> filtering =
        new FilterMarkerRowsCallable<>(retrying2, rowAdapter);

    return createUserFacingServerStreamingCallable(
        "ReadRows", new ReadRowsUserCallable<>(filtering, requestContext));
  }
private < RowT > ServerStreamingCallable < Query , RowT > createReadRowsCallable ( ServerStreamingCallSettings < Query , Row > readRowsSettings , RowAdapter < RowT > rowAdapter ) { ServerStreamingCallable < ReadRowsRequest , RowT > merging = new RowMergingCallable < > ( stub . readRowsCallable ( ) , rowAdapter ) ; ServerStreamingCallSettings < ReadRowsRequest , RowT > innerSettings = ServerStreamingCallSettings . < ReadRowsRequest , RowT > newBuilder ( ) . setResumptionStrategy ( new ReadRowsResumptionStrategy < > ( rowAdapter ) ) . setRetryableCodes ( readRowsSettings . getRetryableCodes ( ) ) . setRetrySettings ( readRowsSettings . getRetrySettings ( ) ) . setIdleTimeout ( readRowsSettings . getIdleTimeout ( ) ) . build ( ) ; ServerStreamingCallable < ReadRowsRequest , RowT > retrying1 = new ReadRowsRetryCompletedCallable < > ( merging ) ; ServerStreamingCallable < ReadRowsRequest , RowT > retrying2 = Callables . retrying ( retrying1 , innerSettings , clientContext ) ; FilterMarkerRowsCallable < RowT > filtering = new FilterMarkerRowsCallable < > ( retrying2 , rowAdapter ) ; return createUserFacingServerStreamingCallable ( "ReadRows" , new ReadRowsUserCallable < > ( filtering , requestContext ) ) ; }
Creates a callable chain to handle ReadRows RPCs. The chain will:

<ul>
<li>Convert a {@link Query} into a {@link com.google.bigtable.v2.ReadRowsRequest} and
dispatch the RPC.
<li>Upon receiving the response stream, it will merge the {@link
com.google.bigtable.v2.ReadRowsResponse.CellChunk}s in logical rows. The actual row
implementation can be configured in by the {@code rowAdapter} parameter.
<li>Retry/resume on failure.
<li>Filter out marker rows.
</ul>