Exemplo n.º 1
0
        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));
        }
Exemplo n.º 2
0
        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);
        }