private static LineEvent MergeWithDatabase(LineEvent lineEvent) { const string MinStartTimeFormat = "SELECT MIN(StartTime) FROM Event WHERE LineID = {0} AND {1} BETWEEN StartTime AND EndTime"; const string MaxEndTimeFormat = "SELECT MAX(EndTime) FROM Event WHERE LineID = {0} AND {1} BETWEEN StartTime AND EndTime"; Func <LineEvent, LineEvent, LineEvent> merge = (lineEvent1, lineEvent2) => lineEvent1.Merge(lineEvent2); DateTime startTime = lineEvent.TimeRange.Start; DateTime endTime = lineEvent.TimeRange.End; using (AdoDataConnection connection = s_connectionFactory()) { while (true) { DateTime adjustedStartTime = startTime.AddSeconds(-s_timeTolerance); object adjustedStartTime2 = ToDateTime2(connection, adjustedStartTime); DateTime minStartTime = connection.ExecuteScalar(startTime, MinStartTimeFormat, lineEvent.LineID, adjustedStartTime2); if (startTime == minStartTime) { break; } startTime = minStartTime; } while (true) { DateTime adjustedEndTime = endTime.AddSeconds(s_timeTolerance); object adjustedEndTime2 = ToDateTime2(connection, adjustedEndTime); DateTime maxEndTime = connection.ExecuteScalar(endTime, MaxEndTimeFormat, lineEvent.LineID, adjustedEndTime2); if (endTime == maxEndTime) { break; } endTime = maxEndTime; } } if (startTime == lineEvent.TimeRange.Start && endTime == lineEvent.TimeRange.End) { return(lineEvent); } Range <DateTime> dbTimeRange = new Range <DateTime>(startTime, endTime); LineEvent dbLineEvent = new LineEvent(lineEvent.LineID, dbTimeRange); return(lineEvent.Merge(dbLineEvent)); }
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); }