private async Task <CollectionPrepareResult> CheckFullCollectionTransitAsync(ITextStatusNotifier progress, CancellationToken token)
        {
            _logger.Debug("Detected full transit for collection {Collection}", _collectionName);
            progress.Status = "Removing documents from destination...";
            await _destination.DeleteAllDocumentsAsync(token);

            progress.Status = "Counting documents...";
            var count = await _source.CountAllAsync(token);

            return(new CollectionPrepareResult(SourceFilter.Empty, count));
        }
        private async Task <CollectionPrepareResult> CheckIterativeCollectionAsync(ITextStatusNotifier progress, IterativeTransitOptions iterOpts, CancellationToken token)
        {
            _logger.Debug("Detected iterative transit for collection {Collection} with checkpoint field {Field}",
                          _collectionName, iterOpts.Field);
            progress.Status = "Searching checkpoint...";
            var filter = await CreateIterativeFilterAsync(iterOpts, token);

            _logger.Debug("Counting how many documents should be transferred");
            progress.Status = "Counting documents...";
            var count = await _source.CountLagAsync(filter, token);

            _logger.Debug("Collection {Collection} has lag {Lag:N0}", _collectionName, count);

            return(new CollectionPrepareResult(filter, count));
        }
        public async Task <CollectionPrepareResult> PrepareCollectionAsync(
            IterativeTransitOptions?iterativeTransitOptions,
            ITextStatusNotifier progress,
            CancellationToken token)
        {
            var sw = new Stopwatch();

            sw.Start();
            var result = iterativeTransitOptions != null
                ? await CheckIterativeCollectionAsync(progress, iterativeTransitOptions, token)
                : await CheckFullCollectionTransitAsync(progress, token);

            sw.Stop();
            _logger.Debug("Collection check was completed in {Elapsed} ms", sw.ElapsedMilliseconds);
            return(result);
        }