/// <summary>
        /// Send Worker response to Pipe.
        /// </summary>
        /// <param name="bulkTagRecord"></param>
        private void Send(BulkTagRecord bulkTagRecord)
        {
            var message = new PipeMessageEnvelope
            {
                Body = bulkTagRecord
            };

            OutputDataPipe.Send(message);
            IncreaseProcessedDocumentsCount(bulkTagRecord.Documents.Count);
        }
        /// <summary>
        /// This method groups the results into batches and send
        /// </summary>
        /// <param name="documents"></param>
        private void GroupDocumentsAndSend(List <BulkDocumentInfoBEO> documents)
        {
            documents = GatherFamiliesAndDuplicates(documents);

            // Construct the record object for the successive worker, with the boot param
            var bulkTagRecord = new BulkTagRecord
            {
                BinderId     = _mBootObject.BinderId,
                CollectionId = _mBootObject.TagDetails.CollectionId,
                MatterId     = _mBootObject.TagDetails.MatterId,
                DatasetId    = _mBootObject.TagDetails.DatasetId,
                ReviewSetId  = _mBootObject.DocumentListDetails.SearchContext.ReviewSetId,
                NumberOfOriginalDocuments = _mTotalDocumentCount,
                CreatedByUserGuid         = _mBootObject.JobScheduleCreatedBy
            };

            // Fill the tag details in record object
            var tagRecord = new TagRecord
            {
                Id                 = _mBootObject.TagDetails.Id,
                ParentId           = _mBootObject.TagDetails.ParentTagId,
                Name               = _mBootObject.TagDetails.Name,
                TagDisplayName     = _mBootObject.TagDetails.TagDisplayName,
                IsOperationTagging = _mBootObject.IsOperationTagging,
                IsTagAllDuplicates = _mBootObject.IsTagAllDuplicates,
                IsTagAllFamily     = _mBootObject.IsTagAllFamily
            };

            tagRecord.TagBehaviors.AddRange(_mBootObject.TagDetails.TagBehaviors);

            bulkTagRecord.SearchContext = _mSearchContext;
            bulkTagRecord.TagDetails    = tagRecord;

            // Determine # of batches for documents to be sent
            var documentsCopy = new List <BulkDocumentInfoBEO>(documents);
            var noOfBatches   = (documentsCopy.Count % _mWindowSize == 0)
                ? (documents.Count / _mWindowSize)
                : (documents.Count / _mWindowSize) + 1;

            bulkTagRecord.NumberOfBatches = noOfBatches;

            Tracer.Info(string.Format("Total batch of document(s) determined : {0}", noOfBatches));
            var processedDocCount = 0;

            for (var i = 0; i < noOfBatches; i++)
            {
                // Group documents and send it to next worker
                bulkTagRecord.Documents = documentsCopy.Skip(processedDocCount).Take(_mWindowSize).ToList();
                processedDocCount      += _mWindowSize;
                Send(bulkTagRecord);
            }
        }
        /// <summary>
        /// Helper method to update the tag log in database
        /// </summary>
        /// <param name="bulkTagRecord"></param>
        private void UpdateTagStatistics(BulkTagRecord bulkTagRecord)
        {
            var taglog = new TagLogBEO
            {
                DatasetId   = Convert.ToInt32(bulkTagRecord.DatasetId),
                JobId       = WorkAssignment.JobId,
                AlreadyTag  = _documentsAlreadyTagged,
                FailedTag   = _documentsFailed,
                DocumentTag = _documentsTagged
            };

            RVWTagBO.UpdateTagLog(taglog);
        }
        /// <summary>
        /// Creating logs to send logging worker.
        /// </summary>
        /// <param name="originalDocuments"></param>
        /// <param name="failedDocuments"></param>
        /// <param name="bulkTagRecord"></param>
        private List <JobWorkerLog <TagLogInfo> > CreateLogs(List <BulkDocumentInfoBEO> originalDocuments,
                                                             IEnumerable <KeyValuePair <string, string> > failedDocuments,
                                                             BulkTagRecord bulkTagRecord)
        {
            var jobWorkerLogs = new List <JobWorkerLog <TagLogInfo> >();

            foreach (var failedDocument in failedDocuments)
            {
                var documentLog = originalDocuments.Find(d => d.DocumentId == failedDocument.Key);
                if (null == documentLog)
                {
                    continue;
                }

                var logInfo = new TagLogInfo
                {
                    Information = string.Format("{0} : {1}", documentLog.DCN, failedDocument.Value),
                    IsFailureInDatabaseUpdate = false,
                    IsFailureInSearchUpdate   = true,
                    DocumentControlNumber     = documentLog.DCN,
                    DocumentId = failedDocument.Key,
                };

                var jobWorkerLog = new JobWorkerLog <TagLogInfo>
                {
                    JobRunId         = Convert.ToInt32(PipelineId),
                    WorkerInstanceId = WorkerId,
                    WorkerRoleType   = WorkerRoletype,
                    Success          = false,
                    IsMessage        = false,
                    LogInfo          = logInfo
                };
                jobWorkerLogs.Add(jobWorkerLog);
                if (!bulkTagRecord.Notification.DocumentsFailed.Exists(d => d == failedDocument.Key))
                {
                    bulkTagRecord.Notification.DocumentsFailed.Add(failedDocument.Key);
                }
            }
            return(jobWorkerLogs);
        }