public IEnumerable<TopEvent> Get(bool relative)
        {
            List<TopEvent> events = null;
            using (var repository = new TopEventRepository())
            {
                events = (from evnt in repository.DataSet.Include("Game.HomeTeam")
                              .Include("Game.AwayTeam")
                              .Include("ActivityPoint")
                              .Include("Event")
                          where evnt.IsRelativeTop == relative
                          select evnt).OrderBy(evnt => evnt.Rank).ToList();
            }

            return events;
        }
        public void Update()
        {
            // Delete everything
            using (var repository = new TopEventRepository())
            {
                var evnts = (from evnt in repository.GetAll() select evnt).ToList();
                foreach(var evnt in evnts)
                {
                    repository.Delete(evnt);
                }
            }

            // update top points by count
            List<ActivityPoint> topPoints = new List<ActivityPoint>();
            List<GameEvent> topEvents = new List<GameEvent>();
            int skipPoints = 0;

            while (topEvents.Count < 10)
            {
                ActivityPoint point = null;
                GameEvent gameEvent = null;
                using (var repository = new ActivityRepository())
                {
                    point = (from p in repository.DataSet.Include("Game")
                             where p.Game.TweetCount > 0 &&
                             (p.Time < p.Game.HalftimeStart || p.Game.HalftimeEnd < p.Time)
                             select p).OrderByDescending(p => p.TweetCount).Skip(skipPoints).Take(1).First();
                }
                using (var repository = new GameEventRepository())
                {
                    gameEvent = (from evnt in repository.GetAll()
                                 where evnt.GameId == point.GameId
                                 && evnt.Timestamp < point.Time
                                 select evnt).OrderByDescending(evnt => evnt.Timestamp).Take(1).SingleOrDefault();
                }

                if (gameEvent == null
                    || gameEvent.Type == GameEventType.FIRST_HALF_START
                    || gameEvent.Type == GameEventType.FIRST_HALF_END
                    || gameEvent.Type == GameEventType.SECOND_HALF_START
                    || gameEvent.Type == GameEventType.SECOND_HALF_END
                    || topEvents.Where(evnt => evnt.Id == gameEvent.Id).Count() > 0)
                {
                    // this event is already in the list
                    skipPoints++;
                }
                else
                {
                    topEvents.Add(gameEvent);
                    topPoints.Add(point);
                }
            }

            using (var repository = new TopEventRepository())
            {
                for (int i = 0; i < topPoints.Count; i++)
                {
                    TopEvent evnt = new TopEvent()
                    {
                        IsRelativeTop = false,
                        Rank = i + 1,
                        GameId = topPoints[i].GameId,
                        ActivityId = topPoints[i].Id,
                        EventId = topEvents[i].Id
                    };
                    repository.Save(evnt);
                }
            }

            // update top points by percentage
            topPoints = new List<ActivityPoint>();
            topEvents = new List<GameEvent>();
            skipPoints = 0;

            while (topEvents.Count < 10)
            {
                ActivityPoint point = null;
                GameEvent gameEvent = null;
                using (var repository = new ActivityRepository())
                {
                    point = (from p in repository.DataSet.Include("Game")
                             where p.Game.TweetCount > 0 &&
                             (p.Time < p.Game.HalftimeStart || p.Game.HalftimeEnd < p.Time)
                             select p).OrderByDescending(p => (double)p.TweetCount / (double)p.Game.TweetCount).Skip(skipPoints).Take(1).First();
                }
                using (var repository = new GameEventRepository())
                {
                    gameEvent = (from evnt in repository.GetAll()
                                 where evnt.GameId == point.GameId
                                 && evnt.Timestamp < point.Time
                                 select evnt).OrderByDescending(evnt => evnt.Timestamp).Take(1).SingleOrDefault();
                }

                if (gameEvent == null
                    || gameEvent.Type == GameEventType.FIRST_HALF_START
                    || gameEvent.Type == GameEventType.FIRST_HALF_END
                    || gameEvent.Type == GameEventType.SECOND_HALF_START
                    || gameEvent.Type == GameEventType.SECOND_HALF_END
                    || topEvents.Where(evnt => evnt.Id == gameEvent.Id).Count() > 0)
                {
                    // this event is already in the list
                    skipPoints++;
                }
                else
                {
                    topEvents.Add(gameEvent);
                    topPoints.Add(point);
                }
            }

            using (var repository = new TopEventRepository())
            {
                for (int i = 0; i < topPoints.Count; i++)
                {
                    TopEvent evnt = new TopEvent()
                    {
                        IsRelativeTop = true,
                        Rank = i + 1,
                        GameId = topPoints[i].GameId,
                        ActivityId = topPoints[i].Id,
                        EventId = topEvents[i].Id
                    };
                    repository.Save(evnt);
                }
            }
        }