class BlobShardCollectorProvider extends ShardCollectorProvider {

    private final BlobShard blobShard;
    private final InputFactory inputFactory;

    public BlobShardCollectorProvider(BlobShard blobShard,
                                      ClusterService clusterService,
                                      Schemas schemas,
                                      NodeLimits nodeJobsCounter,
                                      CircuitBreakerService circuitBreakerService,
                                      NodeContext nodeCtx,
                                      ThreadPool threadPool,
                                      Settings settings,
                                      ElasticsearchClient elasticsearchClient,
                                      Map<String, FileOutputFactory> fileOutputFactoryMap) {
        super(
            clusterService,
            circuitBreakerService,
            schemas,
            nodeJobsCounter,
            nodeCtx,
            threadPool,
            settings,
            elasticsearchClient,
            blobShard.indexShard(),
            new ShardRowContext(blobShard, clusterService),
            fileOutputFactoryMap
        );
        inputFactory = new InputFactory(nodeCtx);
        this.blobShard = blobShard;
    }

    @Nullable
    @Override
    protected BatchIterator<Row> getProjectionFusedIterator(RoutedCollectPhase normalizedPhase, CollectTask collectTask) {
        return null;
    }

    @Override
    protected BatchIterator<Row> getUnorderedIterator(RoutedCollectPhase collectPhase,
                                                      boolean requiresScroll,
                                                      CollectTask collectTask) {
        return InMemoryBatchIterator.of(getBlobRows(collectTask.txnCtx(), collectPhase, requiresScroll), SentinelRow.SENTINEL,
                                        true);
    }

    private Iterable<Row> getBlobRows(TransactionContext txnCtx, RoutedCollectPhase collectPhase, boolean requiresRepeat) {
        Iterable<File> files = blobShard.blobContainer().getFiles();
        Iterable<Row> rows = RowsTransformer.toRowsIterable(txnCtx, inputFactory, BlobReferenceResolver.INSTANCE, collectPhase, files);
        if (requiresRepeat) {
            return Lists.of(rows);
        }
        return rows;
    }

    public OrderedDocCollector getOrderedCollector(RoutedCollectPhase collectPhase,
                                                   SharedShardContext sharedShardContext,
                                                   CollectTask collectTask,
                                                   boolean requiresRepeat) {<FILL_FUNCTION_BODY>}
}

        RoutedCollectPhase normalizedCollectPhase = collectPhase.normalize(shardNormalizer, collectTask.txnCtx());
        return new BlobOrderedDocCollector(
            blobShard.indexShard().shardId(),
            getBlobRows(collectTask.txnCtx(), normalizedCollectPhase, requiresRepeat));
    
<methods>public CompletableFuture<io.crate.execution.engine.collect.ShardCollectorProvider.BatchIteratorFactory> awaitShardSearchActive() ,public io.crate.execution.engine.pipeline.ProjectorFactory getProjectorFactory() ,public io.crate.expression.reference.sys.shard.ShardRowContext shardRowContext() <variables>private final non-sealed io.crate.execution.engine.collect.ShardCollectorProvider.BatchIteratorFactory batchIteratorFactory,protected final non-sealed org.elasticsearch.index.shard.IndexShard indexShard,private final non-sealed io.crate.execution.engine.pipeline.ProjectorFactory projectorFactory,protected final non-sealed io.crate.metadata.Schemas schemas,final non-sealed io.crate.expression.eval.EvaluatingNormalizer shardNormalizer,private final non-sealed io.crate.expression.reference.sys.shard.ShardRowContext shardRowContext