private void PersistEventIfItIsComplete(BackgrounderEvent @event)
 {
     if (@event.CanBeMergedNow())
     {
         PersistEvent(@event);
     }
 }
        private BackgrounderJob GetFinalJobRecord(BackgrounderEvent @event)
        {
            var finalEvent = @event.StartEvent;

            if (@event.IsComplete())
            {
                finalEvent.AddInfoFromEndEvent(@event.EndEvent);
                return(finalEvent);
            }

            if (_latestStartEvents.StartedBeforeLatestStartEvent(finalEvent))
            {
                finalEvent.MarkAsTimedOut();
                return(finalEvent);
            }

            finalEvent.MarkAsUnknown();
            return(finalEvent);
        }
        private void PersistEvent(BackgrounderEvent @event, bool deleteFromDictionary = true)
        {
            var jobEvent = GetFinalJobRecord(@event);

            _jobWriter.AddLine(jobEvent);

            if (ExtractRefreshJobTypes.Contains(jobEvent.JobType))
            {
                var extractDetails = @event.ExtractJobDetails ?? new BackgrounderExtractJobDetail()
                {
                    BackgrounderJobId = @event.StartEvent.JobId,
                };

                var argChunks = jobEvent.Args?
                                .Replace("[", "")
                                .Replace("]", "")
                                .Split(',')
                                .ToArray();

                if (argChunks?.Length > 0)
                {
                    extractDetails.ResourceType = argChunks[0].Trim();
                }

                if (argChunks?.Length >= 3)
                {
                    extractDetails.ResourceName = argChunks[2].Trim();
                }

                _extractJobDetailWriter.AddLine(extractDetails);
            }

            if (SubscriptionJobTypes.Contains(jobEvent.JobType) && @event.SubscriptionJobDetails != null)
            {
                _subscriptionJobDetailWriter.AddLine(@event.SubscriptionJobDetails);
            }

            if (deleteFromDictionary)
            {
                _events.Remove(jobEvent.JobId);
            }
        }