/// <summary>
        /// Atomic work 1)Get old search result 2)New Search 3) Compare 4) generate report to database.
        /// </summary>
        /// <param name="task"></param>
        /// <param name="jobParameters"></param>
        /// <returns></returns>
        protected override bool DoAtomicWork(CompareSavedSearchResultsJobTaskEntity task,
                                             CompareSavedSearchResultsJobBEO jobParameters)
        {
            task.ShouldNotBe(null);
            jobParameters.ShouldNotBe(null);
            var queryContext = _searchResultsProperty.DocumentQuery;

            queryContext.DocumentStartIndex    = 0;
            queryContext.DocumentCount         = 1;
            queryContext.IgnoreDocumentSnippet = true;
            queryContext.OutputFields.Clear();
            queryContext.OutputFields.Add(new Field {
                FieldName = EVSystemFields.DcnField
            });
            try
            {
                LogMessage(string.Format(Constants.DoAtomicWorkStartMessage, task.TaskNumber), GetType(),
                           Constants.DoAtomicMethodFullName, EventLogEntryType.Information, jobParameters.JobId,
                           jobParameters.JobRunId);
                switch (task.TaskType)
                {
                case TypeOfTask.FetchRecordFromDb:
                {
                    var searchResultuuid = string.Format(SaveSearchResultIdentifierBEO.UniqueIdentifierFormat,
                                                         _searchResultsProperty.DocumentQuery.QueryObject.MatterId,
                                                         _searchResultsProperty.DocumentQuery.QueryObject.DatasetId,
                                                         _searchResultsProperty.SearchResultId);
                    _oldSearchResult = SearchResultsService.GetSavedSearchResultsWithDocument(searchResultuuid);
                }
                break;

                case TypeOfTask.FetchRecordFromSearchSubSystem:
                {
                    LogMessage(string.Format("New Search start at : {0}",
                                             DateTime.UtcNow.ConvertToUserTime()), GetType(), Constants.DoAtomicMethodFullName,
                               EventLogEntryType.Information, jobParameters.JobId, jobParameters.JobRunId);

                    //SearchContextObject searchContextObject = ConvertToSearchContextObject(queryContext);
                    ReviewerSearchResults rvwSearchBeo;
                    queryContext.QueryObject.TransactionName =
                        "CompareSavedSearchResultsJob - DoAtomicWork (GetCount)";
                    var totalResultCount = JobSearchHandler.GetSearchResultsCount(queryContext.QueryObject);
                    //searchContextObject.ItemsPerPage = totalResultCount;
                    queryContext.DocumentCount   = (int)totalResultCount;
                    queryContext.TransactionName = "CompareSavedSearchResultsJob - DoAtomicWork (GetAll)";
                    rvwSearchBeo = JobSearchHandler.GetAllDocuments(queryContext, false);
                    // Getting search result list by page index
                    LogMessage(string.Format("New Search End at : {0}", DateTime.UtcNow.ConvertToUserTime()),
                               GetType(), Constants.DoAtomicMethodFullName, EventLogEntryType.Information,
                               jobParameters.JobId, jobParameters.JobRunId);
                    //Constructing New search Result Beo
                    _newSearchResult = new SearchResultsDataContract
                    {
                        Information = new SearchResultsInformationDataContract
                        {
                            Properties =
                                new SearchResultsPropertiesDataContract
                            {
                                SearchResultId           = _searchResultsProperty.SearchResultId,
                                SearchResultsName        = _searchResultsProperty.SearchResultsName,
                                SearchResultsDescription = _searchResultsProperty.SearchResultsDescription,
                                DocumentQuery            = _searchResultsProperty.DocumentQuery
                            },
                            CreatedBy   = _userEntityOfJobOwner.UserId,
                            CreatedDate = DateTime.UtcNow.ConvertToUserTime()
                        }
                    };
                    if (rvwSearchBeo != null)
                    {
                        if (rvwSearchBeo.ResultDocuments != null && rvwSearchBeo.ResultDocuments.Any())
                        {
                            //int totalHitCount = 0;
                            foreach (var document in rvwSearchBeo.ResultDocuments)
                            {
                                var documentDeatail = new SearchResultDocumentDetailsDataContract();
                                documentDeatail.DocumentId            = document.DocumentID;
                                documentDeatail.DocumentControlNumber = document.DocumentControlNumber;
                                documentDeatail.NativeFilePath        = GetNativeFilePath(document);
                                _newSearchResult.Details.Add(documentDeatail);
                            }
                            _newSearchResult.Information.NumberOfDocuments = rvwSearchBeo.ResultDocuments.Count;
                        }
                    }
                    LogMessage(string.Format("New Search Results Construction done at : {0}",
                                             DateTime.UtcNow.ConvertToUserTime()), GetType(), Constants.DoAtomicMethodFullName,
                               EventLogEntryType.Information, jobParameters.JobId, jobParameters.JobRunId);
                }
                break;

                case TypeOfTask.CompareRecords:
                {
                    var comparisonStart = DateTime.Now;
                    _savedSearchCompareReport = new SavedSearchCompareReportBEO();
                    LogMessage(string.Format("Comparison Start at: {0}", DateTime.UtcNow.ConvertToUserTime()),
                               GetType(), Constants.DoAtomicMethodFullName, EventLogEntryType.Information,
                               jobParameters.JobId, jobParameters.JobRunId);
                    var oldResultSet = new List <SearchResultsDetailBEO>();
                    var newResultSet = new List <SearchResultsDetailBEO>();
                    _oldSearchResult.Details.SafeForEach(x => oldResultSet.Add(x.ToBusinessEntity()));
                    _newSearchResult.Details.SafeForEach(x => newResultSet.Add(x.ToBusinessEntity()));

                    // Extracting Common document details
                    (newResultSet.Intersect(oldResultSet).ToList()).SafeForEach(x =>
                                                                                _savedSearchCompareReport.CommonDocumentSet.Add(x));
                    //Extracting Unique document details from new Search result
                    (newResultSet.Except(_savedSearchCompareReport.CommonDocumentSet).ToList()).
                    SafeForEach(x => _savedSearchCompareReport.DocumentsOnlyInNewResultSet.Add(x));
                    //Extracting Unique document details from old(Saved) Search result
                    (oldResultSet.Except(_savedSearchCompareReport.CommonDocumentSet).ToList()).
                    SafeForEach(x => _savedSearchCompareReport.DocumentOnlyInOldResultSet.Add(x));
                    var comparisonStop = DateTime.Now;
                    LogMessage(string.Format("Total Time taken for comparison: {0}",
                                             (comparisonStop - comparisonStart).Milliseconds), GetType(),
                               Constants.DoAtomicMethodFullName, EventLogEntryType.Information, jobParameters.JobId,
                               jobParameters.JobRunId);
                }
                break;

                case TypeOfTask.ConstructFileContent:
                {
                    LogMessage(
                        string.Format("File Construction start at: {0}", DateTime.UtcNow.ConvertToUserTime()),
                        GetType(), Constants.DoAtomicMethodFullName, EventLogEntryType.Information,
                        jobParameters.JobId, jobParameters.JobRunId);

                    //Saving Old search results information
                    _savedSearchCompareReport.OldResultDetails = new SearchResultsInformationBEO
                    {
                        CreatedBy          = _oldSearchResult.Information.CreatedBy,
                        CreatedDate        = _oldSearchResult.Information.CreatedDate,
                        NumberOfDocuments  = _oldSearchResult.Information.NumberOfDocuments,
                        NumberOfSearchHits = _oldSearchResult.Information.NumberOfSearchHits
                    };
                    //Saving Old search results information
                    _savedSearchCompareReport.NewResultDetails = new SearchResultsInformationBEO
                    {
                        CreatedBy          = _newSearchResult.Information.CreatedBy,
                        CreatedDate        = _newSearchResult.Information.CreatedDate,
                        NumberOfDocuments  = _newSearchResult.Information.NumberOfDocuments,
                        NumberOfSearchHits = _newSearchResult.Information.NumberOfSearchHits
                    };
                    _savedSearchCompareReport.CreatedBy       = _userEntityOfJobOwner.UserId;
                    _savedSearchCompareReport.SearchQueryTerm = queryContext.QueryObject.DisplayQuery;
                    _savedSearchCompareReport.CreatedDate     = DateTime.UtcNow.ConvertToUserTime();
                    //File Creation Logic
                    CreateReportFile(out _reportString);
                    LogMessage(string.Format("File Construction End at: {0}", DateTime.UtcNow.ConvertToUserTime()),
                               GetType(), Constants.DoAtomicMethodFullName, EventLogEntryType.Information,
                               jobParameters.JobId, jobParameters.JobRunId);
                    //Clean up all class level variable
                    _oldSearchResult = null;
                    _newSearchResult = null;
                }
                break;
                }
            }
            catch (EVException ex)
            {
                _isJobFailed = true;
                WriteToEventViewer(ex, GetType(), MethodBase.GetCurrentMethod().Name, jobParameters.JobId,
                                   jobParameters.JobRunId);
                HandleTaskException(null, string.Format(Constants.TaskKeyStringFormat, task.TaskType),
                                    ErrorCodes.ProblemInDoAtomicWork);
            }
            catch (Exception ex)
            {
                _isJobFailed = true;
                // Handle exception in DoAutomic
                LogMessage(ex, GetType(), MethodBase.GetCurrentMethod().Name, EventLogEntryType.Error,
                           jobParameters.JobId, jobParameters.JobRunId);
                HandleTaskException(ex, string.Format(Constants.TaskKeyStringFormat, task.TaskType),
                                    ErrorCodes.ProblemInDoAtomicWork);
            }
            return(true);
        }
        /// <summary>
        /// Atomic work 1) Search 2) Insert to DB 3) Audit Log.
        /// </summary>
        /// <param name="task"></param>
        /// <param name="jobParameters"></param>
        /// <returns></returns>
        protected override bool DoAtomicWork(SaveSearchResultsJobTaskBEO task, SaveSearchResultsJobBEO jobParameters)
        {
            #region Pre-condition asserts

            task.ShouldNotBe(null);
            jobParameters.ShouldNotBe(null);

            #endregion

            var searchResultsDataEntityObject = new SearchResultsDataContract();
            var searchContext = jobParameters.DocumentQuery;
            searchContext.DocumentStartIndex    = (task.PageNo * task.PageSize);
            searchContext.DocumentCount         = task.PageSize;
            searchContext.IgnoreDocumentSnippet = true;
            searchContext.OutputFields.Clear();
            searchContext.OutputFields.Add(new Field {
                FieldName = EVSystemFields.DcnField
            });
            LogMessage(string.Format(Constants.DoAtomicWorkStartMessage, task.TaskNumber), false, LogCategory.Job, null);
            LogMessage(string.Format(Constants.DoAtomicWorkStartMessage, task.TaskNumber), GetType(),
                       Constants.DoAtomicMethodFullName, EventLogEntryType.Information, jobParameters.JobId,
                       jobParameters.JobRunId);
            try
            {
                // Perform Atomic Task
                //ReviewerSearchResults rvwSearchBeo = JobSearchHandler.GetSearchResultsWithMatchContext(searchContext);
                // we get the search results from   search sub-system in batches of 1000
                searchContext.TransactionName = "SaveSearchResultJob - DoAtomicWork";
                var rvwSearchBeo = JobSearchHandler.GetSearchResults(searchContext);

                LogMessage(string.Format(Constants.SearchDoneForTask, task.TaskNumber), false, LogCategory.Job, null);
                LogMessage(string.Format(Constants.SearchDoneForTask, task.TaskNumber), GetType(),
                           Constants.DoAtomicMethodFullName, EventLogEntryType.Information, jobParameters.JobId,
                           jobParameters.JobRunId);
                if (rvwSearchBeo != null)
                {
                    if (rvwSearchBeo.ResultDocuments != null && rvwSearchBeo.ResultDocuments.Any())
                    {
                        searchResultsDataEntityObject = new SearchResultsDataContract();

                        foreach (var searchDocument in rvwSearchBeo.ResultDocuments)
                        {
                            var documentDetail =
                                new SearchResultDocumentDetailsDataContract
                            {
                                DocumentId            = searchDocument.DocumentID,
                                DocumentControlNumber = searchDocument.DocumentControlNumber,
                                NativeFilePath        = GetNativeFilePath(searchDocument),
                                DatasetId             = _jobBeo.DocumentQuery.QueryObject.DatasetId
                            };
                            searchResultsDataEntityObject.Information = new SearchResultsInformationDataContract
                            {
                                Properties = new SearchResultsPropertiesDataContract
                                {
                                    SearchResultId = _jobBeo.SearchQueryId,
                                    DocumentQuery  = _jobBeo.DocumentQuery
                                },
                                CreatedBy   = _userEntityOfJobOwner.UserGUID,
                                CreatedDate = DateTime.UtcNow
                            };
                            documentDetail.SearchHitCount = searchDocument.SearchHitCount;
                            searchResultsDataEntityObject.Details.Add(documentDetail);
                        }
                        // perform db insertion
                        LogMessage(Constants.InsertDocumentDetailMessage, false, LogCategory.Job, null);
                        LogMessage(Constants.InsertDocumentDetailMessage, GetType(), Constants.DoAtomicMethodFullName,
                                   EventLogEntryType.Information, jobParameters.JobId, jobParameters.JobRunId);

                        #region Audit for each document

                        if (rvwSearchBeo.ResultDocuments != null && rvwSearchBeo.ResultDocuments.Count > 0)
                        {
                            foreach (var searchDocument in rvwSearchBeo.ResultDocuments)
                            {
                                var additionalDetails = new List <KeyValuePair <string, string> >();

                                var additionalDetail = new KeyValuePair <string, string>(Constants.AuditFor,
                                                                                         jobParameters.JobName);
                                additionalDetails.Add(additionalDetail);
                                additionalDetail = new KeyValuePair <string, string>(Constants.DocumentControlNumber,
                                                                                     searchDocument.DocumentControlNumber);
                                additionalDetails.Add(additionalDetail);
                                additionalDetail = new KeyValuePair <string, string>(Constants.DocumentGuid,
                                                                                     searchDocument.DocumentID);
                                additionalDetails.Add(additionalDetail);
                            }
                        }

                        #endregion

                        searchResultsDataEntityObject =
                            SearchResultsService.SaveSearchResultsDocumentDetails(searchResultsDataEntityObject);

                        LogMessage(string.Format(Constants.DoAtomicWorkCompletedMessage, task.TaskNumber), false,
                                   LogCategory.Job, null);
                        LogMessage(string.Format(Constants.DoAtomicWorkCompletedMessage, task.TaskNumber), GetType(),
                                   Constants.DoAtomicMethodFullName, EventLogEntryType.Information, jobParameters.JobId,
                                   jobParameters.JobRunId);
                    }
                }
            }
            finally
            {
                if (searchResultsDataEntityObject.Details != null && searchResultsDataEntityObject.Details.Count > 0)
                {
                    searchResultsDataEntityObject.Details.SafeForEach(x => _dcnList.Add(x.DocumentControlNumber));
                }
            }

            #region Post-condition and class invariant asserts

            task.ShouldNotBe(null);
            jobParameters.ShouldNotBe(null);

            #endregion

            return(true);
        }