/// <summary>
        /// Convert ReviewsetDocumentBEOs to BulkDocumentInfoBEOs
        /// </summary>
        /// <param name="reviewsetDocuments">List of ReviewsetDocumentBEOs</param>
        /// <returns>List of BulkDocumentInfoBEOs</returns>
        private List <BulkDocumentInfoBEO> ConvertToBulkDocumentInfoBEO(List <ReviewsetDocumentBEO> reviewsetDocuments)
        {
            reviewsetDocuments.ShouldNotBe(null);
            var currentUser      = EVSessionManager.Get <UserSessionBEO>(Constants.UserSessionInfo);
            var bulkTagDocuments = new List <BulkDocumentInfoBEO>();

            reviewsetDocuments.ForEach(document => bulkTagDocuments.Add(new BulkDocumentInfoBEO
            {
                CreatedBy         = currentUser != null ? currentUser.UserGUID : string.Empty,
                DocumentId        = document.DocumentId,
                DCN               = document.DCN,
                FamilyId          = document.FamilyId,
                FromOriginalQuery = true
            }));
            return(bulkTagDocuments);
        }
Exemple #2
0
        /// <summary>
        /// Atomic work 1) Search 2) Notify 3) Update task details back to database.
        /// </summary>
        /// <param name="task"></param>
        /// <param name="jobParameters"></param>
        /// <returns></returns>
        protected override bool DoAtomicWork(SearchAlertsTaskBEO task, SearchAlertsJobBEO jobParameters)
        {
            var statusFlag   = Constants.FAILURE; // Function return status.
            var queryTostore = string.Empty;
            DocumentQueryEntity searchBizEntityObj = null;

            try
            {
                //Get Previous Run Details
                var prevAlertRunDetails = m_Helper.GetPreviousAlertRunDetails(task.SearchAlert.AlertId);
                if (prevAlertRunDetails.Count > 0 && prevAlertRunDetails.Count == 7)
                {
                    m_AlertLastRunTimestamp  = Convert.ToDateTime(prevAlertRunDetails[0]);
                    m_LastResultCount        = Convert.ToInt32(prevAlertRunDetails[1]);
                    m_ManualAlertNextRunDate = Convert.ToDateTime(prevAlertRunDetails[2]);
                    var searchQuery = prevAlertRunDetails[3];
                    if (!string.IsNullOrEmpty(searchQuery))
                    {
                        searchBizEntityObj =
                            (DocumentQueryEntity)
                            XmlUtility.DeserializeObject(searchQuery, typeof(DocumentQueryEntity));
                        if (searchBizEntityObj != null)
                        {
                            m_PrevSearchQuery =
                                HttpUtility.HtmlDecode(
                                    (searchBizEntityObj.QueryObject.DisplayQuery.Split(new[] { Constants.ThreeTilde },
                                                                                       StringSplitOptions.None))[0]);
                        }
                    }
                    var createdBy = prevAlertRunDetails[6];

                    //the below block of code is required to pass the user details who has actually created or updated the alert so that search can use the same
                    // to check various business rules.
                    var adminUserSession = EVSessionManager.Get <UserSessionBEO>(Constants.UserSessionInfo);
                    var currentAlertUser = UserBO.GetUserUsingGuid(createdBy);
                    if (currentAlertUser != null)
                    {
                        SetContext(adminUserSession, currentAlertUser, true);
                    }
                    var originalQuery  = HttpUtility.HtmlDecode(task.SearchAlert.DocumentQuery.QueryObject.DisplayQuery);
                    var generatedQuery = PopulateQuery(task, originalQuery, currentAlertUser.Timezone);

                    //now modify the query in order to distinguish between all results and new results. This will be used in the UI.
                    queryTostore = originalQuery + Constants.QUERY_DELIMETER + generatedQuery.Item3;


                    // 1st time both will be the same so execute search only once.
                    if (generatedQuery.Item1)
                    {
                        // Get only the all doc result count. This will be executed only for 1st time.
                        m_AllResultCount = GetAlertResultCount(searchBizEntityObj, originalQuery);
                        m_NewResultCount = m_AllResultCount;
                    }
                    else
                    {
                        // Get the new result count
                        m_NewResultCount = GetAlertResultCount(searchBizEntityObj, generatedQuery.Item2);
                        // Get the all docs result count
                        m_AllResultCount = GetAlertResultCount(searchBizEntityObj, originalQuery);
                    }

                    ConstructNotificationMessage(task, originalQuery, searchBizEntityObj);
                    statusFlag = Constants.SUCCESS;
                }
            }
            catch (EVException ex)
            {
                HandleEVException(ex, MethodBase.GetCurrentMethod().Name, task);
                statusFlag = Constants.FAILURE;
                var taskException = new EVTaskException(ex.GetErrorCode(), ex, TaskLogInfo);
                throw (taskException);
            }
            catch (Exception ex)
            {
                // Handle exception in initialize
                LogMessage(ex.Message, MethodBase.GetCurrentMethod().Name, EventLogEntryType.Error, task);
                statusFlag = Constants.FAILURE;
                var taskException = new EVTaskException(ErrorCodes.ProblemInDoAtomicWork, ex, TaskLogInfo);
                throw (taskException);
            }
            finally
            {
                try
                {
                    task.SearchAlert.ActualOccurrenceCount = task.SearchAlert.ActualOccurrenceCount + 1;
                    task.SearchAlert.DocumentQuery.QueryObject.QueryList.Clear();
                    task.SearchAlert.DocumentQuery.QueryObject.QueryList.AddRange(new List <Query>
                    {
                        new Query
                        {
                            SearchQuery = queryTostore,
                            Precedence  = 1
                        }
                    });

                    // 3. Update alert details back to database
                    m_Helper.UpdateAlertPostNotification(task.SearchAlert.ActualOccurrenceCount,
                                                         DateTime.UtcNow,
                                                         m_NewResultCount,
                                                         m_AllResultCount,
                                                         m_ManualAlertNextRunDate != DateTime.MinValue
                            ? m_ManualAlertNextRunDate
                            : m_Helper.CalculateNextRunTimeStampForAlert(
                                                             task.SearchAlert.Duration, task.SearchAlert.NextRunDate),
                                                         task.SearchAlert.AlertId,
                                                         task.SearchAlert.NotificationId,
                                                         jobParameters.JobRunId,
                                                         XmlUtility.SerializeObject(task.SearchAlert.DocumentQuery));
                }
                catch (EVException ex)
                {
                    HandleEVException(ex, MethodBase.GetCurrentMethod().Name, task);
                    statusFlag = Constants.FAILURE;
                }
                catch (Exception ex)
                {
                    // Handle exception in initialize
                    LogMessage(Constants.FAILED_MESSAGE + ex.Message, MethodBase.GetCurrentMethod().Name,
                               EventLogEntryType.Error, task);
                    statusFlag = Constants.FAILURE;
                }
            }
            return(statusFlag); // function return status.
        }