protected override bool ShouldSend(Document item, out string reason, out Exception exception, out Document result)
        {
            exception = null;
            reason    = null;
            result    = item;

            if (Fetcher.FetchingFrom == SubscriptionFetcher.FetchingOrigin.Storage)
            {
                var conflictStatus = ChangeVectorUtils.GetConflictStatus(
                    remoteAsString: item.ChangeVector,
                    localAsString: SubscriptionState.ChangeVectorForNextBatchStartingPoint);

                if (conflictStatus == ConflictStatus.AlreadyMerged)
                {
                    reason = $"{item.Id} is already merged";
                    return(false);
                }

                if (SubscriptionConnectionsState.IsDocumentInActiveBatch(ClusterContext, item.Id, Active))
                {
                    reason = $"{item.Id} exists in an active batch";
                    return(false);
                }
            }

            if (Fetcher.FetchingFrom == SubscriptionFetcher.FetchingOrigin.Resend)
            {
                var current = Database.DocumentsStorage.GetDocumentOrTombstone(DocsContext, item.Id, throwOnConflict: false);
                if (ShouldFetchFromResend(item.Id, current, item.ChangeVector) == false)
                {
                    item.ChangeVector = string.Empty;
                    reason            = $"Skip {item.Id} from resend";
                    return(false);
                }

                Debug.Assert(current.Document != null, "Document does not exist");
                result.Id           = current.Document.Id; // use proper casing
                result.Data         = current.Document.Data;
                result.Etag         = current.Document.Etag;
                result.ChangeVector = current.Document.ChangeVector;
            }

            if (Patch == null)
            {
                return(true);
            }

            try
            {
                InitializeScript();
                var match = Patch.MatchCriteria(Run, DocsContext, item, ProjectionMetadataModifier.Instance, ref result.Data);

                if (match == false)
                {
                    if (Fetcher.FetchingFrom == SubscriptionFetcher.FetchingOrigin.Resend)
                    {
                        ItemsToRemoveFromResend.Add(item.Id);
                    }

                    result.Data = null;
                    reason      = $"{item.Id} filtered out by criteria";
                    return(false);
                }

                return(true);
            }
            catch (Exception ex)
            {
                exception = ex;
                reason    = $"Criteria script threw exception for document id {item.Id}";
                return(false);
            }
        }