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); } }