private static void QueueEvent(Event evt) { LineEvent lineEvent = new LineEvent(evt); EmailProcessingThread.Push(() => { if (!RecentLineEvents.Any()) { QueryRecentLineEvents(); } List <LineEvent> overlappingLineEvents = QueuedLineEvents .Where(queuedLineEvent => lineEvent.Overlaps(queuedLineEvent)) .ToList(); if (overlappingLineEvents.Any()) { QueuedLineEvents.ExceptWith(overlappingLineEvents); lineEvent = overlappingLineEvents.Aggregate(lineEvent, (mergedLineEvent, queuedLineEvent) => mergedLineEvent.Merge(queuedLineEvent)); } else { DateTime twoDaysAgo = DateTime.UtcNow.AddDays(-2.0D); if (lineEvent.TimeRange.End > twoDaysAgo) { lineEvent = MergeWithRecentLineEvents(lineEvent); } if (lineEvent.TimeRange.Start < twoDaysAgo) { lineEvent = MergeWithDatabase(lineEvent); } } if (!QueueLineEvent(lineEvent)) { GenerateEmail(lineEvent); } }); }
private static void QueryRecentLineEvents() { using (AdoDataConnection connection = s_connectionFactory()) { TableOperations <Event> eventTable = new TableOperations <Event>(connection); DateTime twoDaysAgo = DateTime.UtcNow.AddDays(-2.0D); object twoDaysAgo2 = ToDateTime2(connection, twoDaysAgo); List <Event> recentEvents = eventTable.QueryRecordsWhere("EndTime >= {0}", twoDaysAgo2).ToList(); foreach (IGrouping <int, Event> grouping in recentEvents.GroupBy(evt => evt.LineID)) { LineEvent mergedLineEvent = null; foreach (Event evt in grouping) { LineEvent lineEvent = new LineEvent(evt); if ((object)mergedLineEvent == null) { mergedLineEvent = lineEvent; } if (!mergedLineEvent.Overlaps(lineEvent)) { RecentLineEvents.Add(mergedLineEvent); mergedLineEvent = lineEvent; } mergedLineEvent = mergedLineEvent.Merge(lineEvent); } RecentLineEvents.Add(mergedLineEvent); } } PurgeOldLineEventsAction.DelayAndExecute(PurgeInterval); }