예제 #1
0
        public void Run(Model.MlbStatsContext context)
        {
            var url     = Feeds.GameStatusTypesFeed.GetFeedUrl();
            var rawJson = JsonUtility.GetRawJsonFromUrl(url);
            var feed    = Feeds.GameStatusTypesFeed.FromJson(rawJson);

            var dbGameStatusTypes = context.GameStatusTypes.ToDictionary(x => x.GameStatusCode);

            foreach (var feedGameStatusType in feed)
            {
                if (!dbGameStatusTypes.TryGetValue(feedGameStatusType.StatusCode, out Model.GameStatusType dbGameStatusType))
                {
                    dbGameStatusType = new Model.GameStatusType
                    {
                        GameStatusCode    = feedGameStatusType.StatusCode,
                        AbstractGameCode  = feedGameStatusType.AbstractGameCode,
                        AbstractGameState = feedGameStatusType.AbstractGameState,
                        CodedGameState    = feedGameStatusType.CodedGameState,
                        DetailedState     = feedGameStatusType.DetailedState,
                        Reason            = feedGameStatusType.Reason
                    };
                    dbGameStatusTypes.Add(dbGameStatusType.GameStatusCode, dbGameStatusType);
                    context.GameStatusTypes.Add(dbGameStatusType);
                }
                else
                {
                    ;                     // TODO: VERIFY NO CHANGES TO PROPERTIES
                }
            }
            context.SaveChanges();
        }
        public void Run(Model.MlbStatsContext context)
        {
            var url     = Feeds.SkyTypesFeed.GetFeedUrl();
            var rawJson = JsonUtility.GetRawJsonFromUrl(url);
            var feed    = Feeds.SkyTypesFeed.FromJson(rawJson);

            var dbSkyTypes = context.SkyTypes.ToDictionary(x => x.Code);

            foreach (var feedSkyType in feed)
            {
                if (!dbSkyTypes.TryGetValue(feedSkyType.Code, out Model.SkyType dbSkyType))
                {
                    dbSkyType = new Model.SkyType
                    {
                        Code        = feedSkyType.Code,
                        Description = feedSkyType.Description
                    };
                    dbSkyTypes.Add(feedSkyType.Code, dbSkyType);
                    context.SkyTypes.Add(dbSkyType);
                }
                else
                {
                    if (!string.Equals(dbSkyType.Description, feedSkyType.Description, StringComparison.InvariantCultureIgnoreCase))
                    {
                        dbSkyType.Description = feedSkyType.Description;
                    }
                }
            }
            context.SaveChanges();
        }
예제 #3
0
        public void Run(Model.MlbStatsContext context)
        {
            var url     = Feeds.VenuesFeed.GetFeedUrl();
            var rawJson = JsonUtility.GetRawJsonFromUrl(url);
            var feed    = Feeds.VenuesFeed.FromJson(rawJson);

            var dbVenues = context.Venues.ToDictionary(x => x.VenueID);

            foreach (var feedVenue in feed.Venues)
            {
                if (!dbVenues.TryGetValue(feedVenue.Id, out Model.Venue dbVenue))
                {
                    dbVenue = new Model.Venue
                    {
                        VenueID   = feedVenue.Id,
                        VenueName = feedVenue.Name,
                        VenueLink = feedVenue.Link
                    };
                    dbVenues.Add(dbVenue.VenueID, dbVenue);
                    context.Venues.Add(dbVenue);
                }

                if (dbVenue.VenueName != feedVenue.Name)
                {
                    dbVenue.VenueName = feedVenue.Name;
                }
            }
            context.SaveChanges();
        }
예제 #4
0
        public void Run(Model.MlbStatsContext context)
        {
            var url     = Feeds.PositionsFeed.GetFeedUrl();
            var rawJson = JsonUtility.GetRawJsonFromUrl(url);
            var feed    = Feeds.PositionsFeed.FromJson(rawJson);

            var dbPositions = context.Positions.ToDictionary(x => x.PositionAbbr);

            foreach (var feedPosition in feed)
            {
                if (!dbPositions.TryGetValue(feedPosition.Abbrev, out Model.Position dbPosition))
                {
                    dbPosition = new Model.Position
                    {
                        PositionAbbr = feedPosition.Abbrev,
                        ShortName    = feedPosition.ShortName,
                        FullName     = feedPosition.FullName,
                        FormalName   = feedPosition.FormalName,
                        DisplayName  = feedPosition.DisplayName,
                        PositionCode = feedPosition.Code,
                        IsFielder    = feedPosition.Fielder,
                        IsPitcher    = feedPosition.Pitcher,
                        IsOutfield   = feedPosition.Outfield,
                        PositionType = feedPosition.Type
                    };
                    dbPositions.Add(dbPosition.PositionAbbr, dbPosition);
                    context.Positions.Add(dbPosition);
                }
                else
                {
                    ;                     // TODO: ADD NO-CHANGE VALIDATION LOGIC
                }
            }
            context.SaveChanges();
        }
        public void Run(Model.MlbStatsContext context)
        {
            var url     = Feeds.GameSituationTypesFeed.GetFeedUrl();
            var rawJson = JsonUtility.GetRawJsonFromUrl(url);
            var feed    = Feeds.GameSituationTypesFeed.FromJson(rawJson);


            var dbGameSituationTypes = context.GameSituationTypes.ToDictionary(x => x.Code);

            foreach (var feedGameSituationType in feed)
            {
                if (!dbGameSituationTypes.TryGetValue(feedGameSituationType.Code, out Model.GameSituationType dbGameSituationType))
                {
                    dbGameSituationType = new Model.GameSituationType
                    {
                        Code         = feedGameSituationType.Code,
                        Description  = feedGameSituationType.Description,
                        IsBatting    = feedGameSituationType.Batting,
                        IsFielding   = feedGameSituationType.Fielding,
                        IsPitching   = feedGameSituationType.Pitching,
                        IsTeam       = feedGameSituationType.Team,
                        NavMenuGroup = feedGameSituationType.NavigationMenu,
                        SortOrder    = feedGameSituationType.SortOrder
                    };
                    dbGameSituationTypes.Add(dbGameSituationType.Code, dbGameSituationType);
                    context.GameSituationTypes.Add(dbGameSituationType);
                }
                else
                {
                    if (dbGameSituationType.Description != feedGameSituationType.Description ||
                        dbGameSituationType.IsBatting != feedGameSituationType.Batting ||
                        dbGameSituationType.IsFielding != feedGameSituationType.Fielding ||
                        dbGameSituationType.IsPitching != feedGameSituationType.Pitching ||
                        dbGameSituationType.IsTeam != feedGameSituationType.Team ||
                        dbGameSituationType.NavMenuGroup != feedGameSituationType.NavigationMenu ||
                        dbGameSituationType.SortOrder != feedGameSituationType.SortOrder)
                    {
                        dbGameSituationType.Code         = feedGameSituationType.Code;
                        dbGameSituationType.Description  = feedGameSituationType.Description;
                        dbGameSituationType.IsBatting    = feedGameSituationType.Batting;
                        dbGameSituationType.IsFielding   = feedGameSituationType.Fielding;
                        dbGameSituationType.IsPitching   = feedGameSituationType.Pitching;
                        dbGameSituationType.IsTeam       = feedGameSituationType.Team;
                        dbGameSituationType.NavMenuGroup = feedGameSituationType.NavigationMenu;
                        dbGameSituationType.SortOrder    = feedGameSituationType.SortOrder;
                    }
                }
            }
            context.SaveChanges();
        }
        public void Run(Model.MlbStatsContext context)
        {
            var url     = Feeds.StatTypesFeed.GetFeedUrl();
            var rawJson = JsonUtility.GetRawJsonFromUrl(url);
            var feed    = Feeds.StatTypesFeed.FromJson(rawJson);

            var dbStatTypes = context.StatTypes.ToDictionary(x => x.Lookup);

            foreach (var feedStatType in feed)
            {
                if (!dbStatTypes.TryGetValue(feedStatType.LookupParam, out Model.StatType dbStatType))
                {
                    dbStatType = new Model.StatType
                    {
                        Lookup     = feedStatType.LookupParam,
                        Name       = feedStatType.Name,
                        Label      = feedStatType.Label,
                        IsCounting = feedStatType.IsCounting,
                        IsCatching = feedStatType.StatGroups.Any(x => string.Equals(x.Name, "catching", StringComparison.InvariantCultureIgnoreCase)),
                        IsFielding = feedStatType.StatGroups.Any(x => string.Equals(x.Name, "fielding", StringComparison.InvariantCultureIgnoreCase)),
                        IsHitting  = feedStatType.StatGroups.Any(x => string.Equals(x.Name, "hitting", StringComparison.InvariantCultureIgnoreCase)),
                        IsPitching = feedStatType.StatGroups.Any(x => string.Equals(x.Name, "pitching", StringComparison.InvariantCultureIgnoreCase)),
                        IsRunning  = feedStatType.StatGroups.Any(x => string.Equals(x.Name, "running", StringComparison.InvariantCultureIgnoreCase)),
                        IsTeam     = feedStatType.StatGroups.Any(x => string.Equals(x.Name, "team", StringComparison.InvariantCultureIgnoreCase)),
                        IsGame     = feedStatType.StatGroups.Any(x => string.Equals(x.Name, "game", StringComparison.InvariantCultureIgnoreCase)),
                        IsStreak   = feedStatType.StatGroups.Any(x => string.Equals(x.Name, "streak", StringComparison.InvariantCultureIgnoreCase)),
                    };

                    if (feedStatType.StatGroups.Any(x => !dbStatType.IsCatching && !dbStatType.IsFielding && !dbStatType.IsHitting && !dbStatType.IsPitching &&
                                                    !dbStatType.IsRunning && !dbStatType.IsTeam && !dbStatType.IsGame && !dbStatType.IsStreak))
                    {
                        throw new ArgumentException("STATIS A STAT FOR NOTHINGNESS?!");
                    }
                    dbStatTypes.Add(dbStatType.Lookup, dbStatType);
                    context.StatTypes.Add(dbStatType);
                }
                else
                {
                    ;                     // TODO: PUT ADJUSTMENT CODE HERE TO VERIFY NO CHANGES HAVE HAPPENED
                }
            }
            context.SaveChanges();
        }
        public void Run(Model.MlbStatsContext context)
        {
            var url     = Feeds.AssociationsFeed.GetFeedUrl();
            var rawJson = JsonUtility.GetRawJsonFromUrl(url);
            var feed    = Feeds.AssociationsFeed.FromJson(rawJson);

            var dbAssociations = context.Associations.ToDictionary(x => x.AssociationID);

            foreach (var feedAssociation in feed.Associations)
            {
                if (!dbAssociations.TryGetValue(feedAssociation.Id, out Model.Association dbAssociation))
                {
                    dbAssociation = new Model.Association
                    {
                        AssociationID   = feedAssociation.Id,
                        AssociationName = feedAssociation.Name,
                        AssociationLink = feedAssociation.Link,
                        AssociationAbbr = feedAssociation.Abbreviation,
                        AssociationCode = feedAssociation.Code,
                        IsEnabled       = !readonlyDisabledAssociationIds.Contains(feedAssociation.Id)
                    };
                    dbAssociations.Add(feedAssociation.Id, dbAssociation);
                    context.Associations.Add(dbAssociation);
                }
                else
                {
                    if (!string.Equals(dbAssociation.AssociationName, feedAssociation.Name))
                    {
                        dbAssociation.AssociationName = feedAssociation.Name;
                    }
                    if (!string.Equals(dbAssociation.AssociationAbbr, feedAssociation.Abbreviation))
                    {
                        dbAssociation.AssociationAbbr = feedAssociation.Abbreviation;
                    }
                    if (!string.Equals(dbAssociation.AssociationCode, feedAssociation.Code))
                    {
                        dbAssociation.AssociationCode = feedAssociation.Code;
                    }
                }
            }
            context.SaveChanges();
        }
        public void Run(Model.MlbStatsContext context)
        {
            var url     = Feeds.JobTypesFeed.GetFeedUrl();
            var rawJson = JsonUtility.GetRawJsonFromUrl(url);
            var feed    = Feeds.JobTypesFeed.FromJson(rawJson);

            feed = feed.OrderBy(x => x.SortOrder.HasValue ? 1 : 2).ThenBy(y => y.SortOrder).ThenBy(z => z.Code).ToList();

            var dbJobTypes = context.JobTypes.ToDictionary(x => x.Code);

            foreach (var feedJobType in feed)
            {
                if (!dbJobTypes.TryGetValue(feedJobType.Code, out Model.JobType dbJobType))
                {
                    dbJobType = new Model.JobType
                    {
                        Code        = feedJobType.Code,
                        Description = feedJobType.Job,
                        SortOrder   = feedJobType.SortOrder
                    };
                    dbJobTypes.Add(feedJobType.Code, dbJobType);
                    context.JobTypes.Add(dbJobType);
                }
                else
                {
                    if (!string.Equals(dbJobType.Description, feedJobType.Job, StringComparison.InvariantCultureIgnoreCase))
                    {
                        dbJobType.Description = feedJobType.Job;
                    }
                    if (dbJobType.SortOrder != feedJobType.SortOrder)
                    {
                        dbJobType.SortOrder = feedJobType.SortOrder;
                    }
                }
            }
            context.SaveChanges();
        }
예제 #9
0
        public void Run(Model.MlbStatsContext context)
        {
            Console.WriteLine($"TeamsProcessor - {this.Season}");

            var url     = Feeds.TeamsFeed.GetFeedUrl(this.Season);
            var rawJson = JsonUtility.GetRawJsonFromUrl(url);
            var feed    = Feeds.TeamsFeed.FromJson(rawJson);

            var dbAssociations = context.Associations.ToDictionary(x => x.AssociationID);
            var dbLeagues      = context.Leagues.ToDictionary(x => x.LeagueID);
            var dbDivisions    = context.Divisions.ToDictionary(x => x.DivisionID);
            var dbVenues       = context.Venues.ToDictionary(x => x.VenueID);
            var dbTeams        = context.Teams.ToDictionary(x => x.TeamID);

            var dbVenueSeasons       = context.VenueSeasons.Where(x => x.Season == this.Season).ToDictionary(x => x.VenueID);
            var dbAssociationSeasons = context.AssociationSeasons.Where(x => x.Season == this.Season).ToDictionary(y => y.AssociationID);
            var dbLeagueSeasons      = context.LeagueSeasons.Where(x => x.Season == this.Season).ToDictionary(y => y.LeagueID);
            var dbDivisionSeasons    = context.DivisionSeasons.Where(x => x.Season == this.Season).ToDictionary(y => y.DivisionID);
            var dbTeamSeasons        = context.TeamSeasons.Where(x => x.Season == this.Season).ToDictionary(y => y.TeamID);

            var feedTeams = feed.Teams.OrderBy(x => x.ParentOrgId.HasValue ? 1 : 0).ThenBy(y => y.Sport.Id).ToList();

            foreach (var feedTeam in feedTeams)
            {
                if (!dbAssociations.TryGetValue(feedTeam.Sport.Id.Value, out Model.Association dbAssociation))
                {
                    dbAssociation = new Model.Association
                    {
                        AssociationID   = feedTeam.Sport.Id.Value,
                        AssociationName = feedTeam.Sport.Name,
                        AssociationLink = feedTeam.Sport.Link
                    };
                    dbAssociations.Add(dbAssociation.AssociationID, dbAssociation);
                    context.Associations.Add(dbAssociation);
                }

                Model.League dbLeague = null;
                if (feedTeam.League?.Id != null && !dbLeagues.TryGetValue(feedTeam.League.Id.Value, out dbLeague))
                {
                    dbLeague = new Model.League
                    {
                        LeagueID   = feedTeam.League.Id.Value,
                        LeagueName = feedTeam.League.Name,
                        LeagueLink = feedTeam.League.Link
                    };
                    dbLeagues.Add(dbLeague.LeagueID, dbLeague);
                    context.Leagues.Add(dbLeague);
                }

                Model.Division dbDivision = null;
                if (feedTeam.Division?.Id != null && !dbDivisions.TryGetValue(feedTeam.Division.Id.Value, out dbDivision))
                {
                    dbDivision = new Model.Division
                    {
                        DivisionID   = feedTeam.Division.Id.Value,
                        DivisionName = feedTeam.Division.Name,
                        DivisionLink = feedTeam.Division.Link
                    };
                    dbDivisions.Add(dbDivision.DivisionID, dbDivision);
                    context.Divisions.Add(dbDivision);
                }

                Model.Venue dbVenue = null;
                if (feedTeam.Venue?.Id != null && !dbVenues.TryGetValue(feedTeam.Venue.Id.Value, out dbVenue))
                {
                    dbVenue = new Model.Venue
                    {
                        VenueID   = feedTeam.Venue.Id.Value,
                        VenueName = feedTeam.Venue.Name,
                        VenueLink = feedTeam.Venue.Link
                    };
                    dbVenues.Add(dbVenue.VenueID, dbVenue);
                    context.Venues.Add(dbVenue);
                }

                Model.League dbSpringLeague = null;
                if (feedTeam.SpringLeague?.Id != null && !dbLeagues.TryGetValue(feedTeam.SpringLeague.Id.Value, out dbSpringLeague))
                {
                    dbSpringLeague = new Model.League
                    {
                        LeagueID   = feedTeam.SpringLeague.Id.Value,
                        LeagueName = feedTeam.SpringLeague.Name,
                        LeagueLink = feedTeam.SpringLeague.Link
                    };
                    dbLeagues.Add(dbSpringLeague.LeagueID, dbSpringLeague);
                    context.Leagues.Add(dbSpringLeague);
                }

                Model.Team dbParentOrg = null;
                if (feedTeam.ParentOrgId.HasValue && !dbTeams.TryGetValue(feedTeam.ParentOrgId.Value, out dbParentOrg))
                {
                    dbParentOrg = new Model.Team
                    {
                        TeamID       = feedTeam.ParentOrgId.Value,
                        TeamFullName = feedTeam.ParentOrgName
                    };
                    dbTeams.Add(dbParentOrg.TeamID, dbParentOrg);
                    context.Teams.Add(dbParentOrg);
                }

                if (!dbTeams.TryGetValue(feedTeam.Id, out Model.Team dbTeam))
                {
                    dbTeam = new Model.Team
                    {
                        TeamID       = feedTeam.Id,
                        FileCode     = feedTeam.FileCode,
                        FirstSeason  = feedTeam.FirstYearOfPlay,
                        IsActive     = feedTeam.Active,
                        IsAllStar    = feedTeam.IsAllStarTeam,
                        TeamAbbr     = feedTeam.Abbreviation,
                        TeamCode     = feedTeam.TeamCode,
                        TeamFullName = feedTeam.Name,
                        TeamLocation = feedTeam.LocationName,
                        TeamName     = feedTeam.Name,
                    };
                    dbTeams.Add(dbTeam.TeamID, dbTeam);
                    context.Teams.Add(dbTeam);
                }
                else if (this.IsCurrentSeason)                 // ONLY UPDATE TEAM ENTRY IF IT IS THE CURRENT SEASON
                {
                    if (dbTeam.FileCode != feedTeam.FileCode ||
                        dbTeam.FirstSeason != feedTeam.FirstYearOfPlay ||
                        dbTeam.IsActive != feedTeam.Active ||
                        dbTeam.IsAllStar != feedTeam.IsAllStarTeam ||
                        dbTeam.TeamAbbr != feedTeam.Abbreviation ||
                        dbTeam.TeamCode != feedTeam.TeamCode ||
                        dbTeam.TeamFullName != feedTeam.Name ||
                        dbTeam.TeamLocation != feedTeam.LocationName ||
                        dbTeam.TeamName != feedTeam.Name)
                    {
                        dbTeam.FileCode     = feedTeam.FileCode;
                        dbTeam.FirstSeason  = feedTeam.FirstYearOfPlay;
                        dbTeam.IsActive     = feedTeam.Active;
                        dbTeam.IsAllStar    = feedTeam.IsAllStarTeam;
                        dbTeam.TeamAbbr     = feedTeam.Abbreviation;
                        dbTeam.TeamCode     = feedTeam.TeamCode;
                        dbTeam.TeamFullName = feedTeam.Name;
                        dbTeam.TeamLocation = feedTeam.LocationName;
                        dbTeam.TeamName     = feedTeam.Name;
                    }
                }

                // ENTER SEASON BASED PROCESSING. CURRENT DATA CAN BE UPDATED ABOVE. SEASON BASED DATA SHOULD NEVER NEED TO BE UPDATED (FOR LEAGUE STRUCTURE)

                Model.VenueSeason dbVenueSeason = null;
                if (feedTeam.Venue?.Id != null && !dbVenueSeasons.TryGetValue(feedTeam.Venue.Id.Value, out dbVenueSeason))
                {
                    dbVenueSeason = new Model.VenueSeason
                    {
                        VenueID   = feedTeam.Venue.Id.Value,
                        Season    = this.Season,
                        VenueName = feedTeam.Venue.Name
                    };
                    dbVenueSeasons.Add(feedTeam.Venue.Id.Value, dbVenueSeason);
                    context.VenueSeasons.Add(dbVenueSeason);
                }

                if (!dbAssociationSeasons.TryGetValue(feedTeam.Sport.Id.Value, out Model.AssociationSeason dbAssociationSeason))
                {
                    dbAssociationSeason = new Model.AssociationSeason
                    {
                        Association     = dbAssociation,
                        Season          = this.Season,
                        AssociationName = feedTeam.Sport.Name
                    };
                    dbAssociationSeasons.Add(dbAssociation.AssociationID, dbAssociationSeason);
                    context.AssociationSeasons.Add(dbAssociationSeason);
                }

                Model.LeagueSeason dbLeagueSeason = null;
                if (feedTeam.League?.Id != null && !dbLeagueSeasons.TryGetValue(feedTeam.League.Id.Value, out dbLeagueSeason))
                {
                    dbLeagueSeason = new Model.LeagueSeason
                    {
                        League            = dbLeague,
                        Season            = this.Season,
                        LeagueName        = feedTeam.League.Name,
                        AssociationSeason = dbAssociationSeason
                    };
                    dbLeagueSeasons.Add(dbLeague.LeagueID, dbLeagueSeason);
                    context.LeagueSeasons.Add(dbLeagueSeason);
                }

                Model.LeagueSeason dbSpringLeagueSeason = null;
                if (feedTeam.SpringLeague?.Id != null && !dbLeagueSeasons.TryGetValue(feedTeam.SpringLeague.Id.Value, out dbSpringLeagueSeason))
                {
                    dbSpringLeagueSeason = new Model.LeagueSeason
                    {
                        League            = dbSpringLeague,
                        Season            = this.Season,
                        LeagueName        = feedTeam.SpringLeague.Name,
                        AssociationSeason = dbAssociationSeason
                    };
                    dbLeagueSeasons.Add(dbSpringLeague.LeagueID, dbSpringLeagueSeason);
                    context.LeagueSeasons.Add(dbSpringLeagueSeason);
                }

                Model.DivisionSeason dbDivisionSeason = null;
                if (feedTeam.Division?.Id != null && !dbDivisionSeasons.TryGetValue(feedTeam.Division.Id.Value, out dbDivisionSeason))
                {
                    dbDivisionSeason = new Model.DivisionSeason
                    {
                        Division     = dbDivision,
                        Season       = this.Season,
                        DivisionName = feedTeam.Division.Name,
                        LeagueSeason = dbLeagueSeason
                    };
                    dbDivisionSeasons.Add(dbDivision.DivisionID, dbDivisionSeason);
                    context.DivisionSeasons.Add(dbDivisionSeason);
                }

                Model.TeamSeason dbTeamSeason = null;
                if (!dbTeamSeasons.TryGetValue(feedTeam.Id, out dbTeamSeason))
                {
                    dbTeamSeason = new Model.TeamSeason
                    {
                        Team               = dbTeam,
                        Season             = this.Season,
                        AssociationSeason  = dbAssociationSeason,
                        LeagueSeason       = dbLeagueSeason,
                        DivisionSeason     = dbDivisionSeason,
                        VenueSeason        = dbVenueSeason,
                        FileCode           = feedTeam.FileCode,
                        FullName           = feedTeam.Name,
                        SpringLeagueSeason = dbSpringLeagueSeason,
                        TeamAbbr           = feedTeam.Abbreviation,
                        TeamCode           = feedTeam.TeamCode,
                        TeamLocation       = feedTeam.LocationName,
                        TeamName           = feedTeam.TeamName
                    };
                    dbTeamSeasons.Add(dbTeam.TeamID, dbTeamSeason);
                    context.TeamSeasons.Add(dbTeamSeason);
                }
            }

            var feedChildTeams = feed.Teams.Where(x => x.ParentOrgId.HasValue);

            foreach (var feedChildTeam in feedChildTeams)
            {
                var dbChildTeamSeason = dbTeamSeasons[feedChildTeam.Id];
                if (!dbTeamSeasons.TryGetValue(feedChildTeam.ParentOrgId.Value, out Model.TeamSeason dbParentTeamSeason))
                {
                    dbParentTeamSeason = new Model.TeamSeason
                    {
                        TeamID   = feedChildTeam.ParentOrgId.Value,
                        Season   = this.Season,
                        TeamName = feedChildTeam.ParentOrgName
                    };
                    dbTeamSeasons.Add(feedChildTeam.ParentOrgId.Value, dbParentTeamSeason);
                    context.TeamSeasons.Add(dbParentTeamSeason);
                }
                dbChildTeamSeason.ParentOrgSeason = dbParentTeamSeason;
            }

            context.SaveChanges();
        }
        public void Run(Model.MlbStatsContext context)
        {
            Feeds.PlayByPlayFeed feed;
            using (var client = new WebClient())
            {
                var    url     = Feeds.PlayByPlayFeed.GetFeedUrl(this.GameId);
                string rawJson = JsonUtility.GetRawJsonFromUrl(url);;
                if (rawJson == null)
                {
                    return;
                }
                feed = Feeds.PlayByPlayFeed.FromJson(rawJson);

                if (feed != null && feed.AllPlays != null && feed.AllPlays.Count > 0)
                {
                    var dbGame = context.Games.SingleOrDefault(x => x.GameID == this.GameId);
                    if (dbGame == null)
                    {
                        throw new NullReferenceException($"GAME NOT FOUND IN DB: {this.GameId}");
                    }
                    int season = dbGame.Season;

                    var dbTrajectoriesDict = context.HitTrajectoryTypes.ToDictionary(x => x.Code, y => y.HitTrajectoryTypeID);
                    var dbPitchResultsDict = context.PitchResultTypes.ToDictionary(x => x.Code, y => y.PitchResultTypeID);
                    var dbPitchTypesDict   = context.PitchTypes.ToDictionary(x => x.Code, y => y.PitchTypeID);

                    var dbPlaysDict          = context.GamePlays.Where(x => x.GameID == dbGame.GameID).ToDictionary(x => x.GamePlayIndex);
                    var dbPlayRunnersLookup  = context.GamePlayRunners.Include("FieldingCredits").Where(x => x.GamePlay.GameID == dbGame.GameID).ToLookup(x => x.PlayIndex);
                    var dbPlayPitchesLookup  = context.GamePlayPitches.Where(x => x.GamePlay.GameID == dbGame.GameID).ToLookup(x => x.GamePlay.GamePlayIndex).ToDictionary(x => x.Key, y => y.ToDictionary(z => (int)z.GamePlayEventIndex, z => z));
                    var dbPlayActionsLookup  = context.GamePlayActions.Where(x => x.GamePlay.GameID == dbGame.GameID).ToLookup(x => x.GamePlay.GamePlayIndex).ToDictionary(x => x.Key, y => y.ToDictionary(z => (int)z.GamePlayEventIndex, z => z));
                    var dbPlayPickoffsLookup = context.GamePlayPickoffs.Where(x => x.GamePlay.GameID == dbGame.GameID).ToLookup(x => x.GamePlay.GamePlayIndex).ToDictionary(x => x.Key, y => y.ToDictionary(z => (int)z.GamePlayEventIndex, z => z));

                    var feedPlayers = feed.AllPlays.Where(x => x.Matchup?.Pitcher != null && x.Matchup?.Batter != null)
                                      .SelectMany(x => new[] {
                        new {
                            IsHome   = x.About.HalfInning != "top",
                            PlayerId = x.Matchup.Batter.Id,
                            Name     = x.Matchup.Batter.FullName,
                            Link     = x.Matchup.Batter.Link
                        },
                        new {
                            IsHome   = x.About.HalfInning == "top",
                            PlayerId = x.Matchup.Pitcher.Id,
                            Name     = x.Matchup.Pitcher.FullName,
                            Link     = x.Matchup.Pitcher.Link
                        }
                    })
                                      .GroupBy(x => x.PlayerId)
                                      .Select(x => x.FirstOrDefault())
                                      .Where(x => x != null)
                                      .ToList();
                    var feedPlayerIds = feedPlayers.Select(x => x.PlayerId).ToList();
                    var dbPlayersDict = context.Players.Where(x => feedPlayerIds.Contains(x.PlayerID)).ToDictionary(x => x.PlayerID);
                    foreach (var feedPlayer in feedPlayers)
                    {
                        if (!dbPlayersDict.ContainsKey(feedPlayer.PlayerId))
                        {
                            int teamId   = feedPlayer.IsHome ? dbGame.HomeTeamID.Value : dbGame.AwayTeamID.Value;
                            var dbPlayer = new Player
                            {
                                PlayerID   = feedPlayer.PlayerId,
                                PlayerLink = feedPlayer.Link,
                                FullName   = feedPlayer.Name
                            };
                            dbPlayersDict.Add(dbPlayer.PlayerID, dbPlayer);
                            context.Players.Add(dbPlayer);
                            var pts = new PlayerTeamSeason {
                                Player = dbPlayer, TeamID = teamId, Season = season
                            };
                            context.PlayerTeamSeasons.Add(pts);
                        }
                    }
                    context.SaveChanges();


                    // TODO: IF ANY PLAY HAS CHANGED, DELETE ALL PLAYS AND REPROCESS FROM SCRATCH

                    Player pitcher = null;
                    foreach (var feedPlay in feed.AllPlays)
                    {
                        short playIndex = feedPlay.AtBatIndex;

                        byte           outCount = 0;
                        RunnerLocation startRunners = RunnerLocation.None, endRunners = RunnerLocation.None;
                        if (feedPlay.Runners != null && feedPlay.Runners.Count > 0)
                        {
                            outCount = (byte)feedPlay.Runners.Count(x => x.Movement.IsOut ?? false);
                            var feedRunnersByRunnerId = feedPlay.Runners.GroupBy(x => x.Details.Runner.Id).ToList();
                            foreach (var feedRunner in feedRunnersByRunnerId)
                            {
                                var start = (RunnerLocation)feedRunner.Select(x => GetRunnerLocationFromString(x.Movement?.Start, true)).Min(x => (int)x);
                                var end   = (RunnerLocation)feedRunner.Select(x => GetRunnerLocationFromString(x.Movement?.End, false)).Max(x => (int)x);
                                if (start != RunnerLocation.Home_End)
                                {
                                    startRunners = startRunners | start;
                                }
                                if (end != RunnerLocation.Home_End)
                                {
                                    endRunners = endRunners | end;
                                }
                            }
                        }

                        bool isNew    = !dbPlaysDict.TryGetValue(feedPlay.AtBatIndex, out GamePlay dbPlay);
                        if (isNew)
                        {
                            dbPlay = new GamePlay
                            {
                                Game          = dbGame,
                                GamePlayIndex = playIndex,
                                Season        = season,
                                IsInningTop   = string.Equals(feedPlay.About.HalfInning, "top"),
                                Inning        = feedPlay.About.Inning,
                            };
                            dbPlaysDict.Add(playIndex, dbPlay);
                            context.GamePlays.Add(dbPlay);
                        }

                        bool isUpdate = false;
                        if (!isNew)
                        {
                            isUpdate = CheckPlayForUpdate(feedPlay, dbPlay, outCount, startRunners, endRunners);
                        }

                        var feedPitcher = feedPlay.Matchup.Pitcher;
                        if (feedPitcher != null && (pitcher == null || pitcher.PlayerID != feedPitcher.Id))
                        {
                            pitcher = dbPlayersDict[feedPitcher.Id];
                        }

                        var feedBatter = feedPlay.Matchup.Batter;
                        if (!dbPlayersDict.TryGetValue(feedBatter.Id, out Player batter))
                        {
                            batter = dbPlayersDict[feedPlay.Matchup.Batter.Id];
                        }

                        if (isNew || isUpdate)
                        {
                            dbPlay.StartTime           = feedPlay.About.StartTime;
                            dbPlay.EndTime             = feedPlay.About.EndTime;
                            dbPlay.IsReview            = feedPlay.About.HasReview;
                            dbPlay.PlayType            = feedPlay.Result.Type;
                            dbPlay.PlayEvent           = feedPlay.Result.Event;
                            dbPlay.PlayEventType       = feedPlay.Result.EventType;
                            dbPlay.GamePlayDescription = feedPlay.Result.Description;
                            dbPlay.ScoreAway           = feedPlay.Result.AwayScore;
                            dbPlay.ScoreHome           = feedPlay.Result.HomeScore;
                            dbPlay.RunsScored          = feedPlay.Result.Rbi;
                            dbPlay.RunnerStatusStart   = startRunners;
                            dbPlay.RunnerStatusEnd     = endRunners;
                            dbPlay.BatterID            = batter.PlayerID;
                            dbPlay.PitcherID           = pitcher.PlayerID;
                            dbPlay.BatterHand          = feedPlay.Matchup.BatSide.Code[0];
                            dbPlay.PitcherHand         = feedPlay.Matchup.PitchHand.Code[0];
                            dbPlay.BatterSplit         = feedPlay.Matchup.Splits?.Batter;
                            dbPlay.PitcherSplit        = feedPlay.Matchup.Splits?.Pitcher;
                            dbPlay.Strikes             = (byte)feedPlay.Count.Strikes;
                            dbPlay.Balls     = (byte)feedPlay.Count.Balls;
                            dbPlay.OutsEnd   = (byte)feedPlay.Count.Outs;
                            dbPlay.OutsStart = (byte)(feedPlay.Count.Outs - outCount);
                        }

                        var dbPlayRunners = dbPlayRunnersLookup[playIndex];
                        var feedRunners   = feedPlay.Runners;
                        if (feedRunners != null && feedRunners.Count > 0)
                        {
                            foreach (var feedRunner in feedRunners)
                            {
                                if (feedRunner.Movement != null && feedRunner.Details != null)
                                {
                                    var runnerId      = feedRunner.Details.Runner.Id;
                                    var startLocation = GetRunnerLocationFromString(feedRunner.Movement.Start, true);
                                    var endLocation   = GetRunnerLocationFromString(feedRunner.Movement.Start, false);
                                    var dbPlayRunner  = dbPlayRunners.SingleOrDefault(x => x.RunnerID == runnerId && x.StartRunnerLocation == startLocation);

                                    bool isRunnerNew = false;
                                    if (dbPlayRunner == null)
                                    {
                                        isRunnerNew  = true;
                                        dbPlayRunner = new GamePlayRunner
                                        {
                                            GamePlay            = dbPlay,
                                            RunnerID            = runnerId,
                                            StartRunnerLocation = startLocation,
                                            EndRunnerLocation   = endLocation
                                        };
                                        if (dbPlay.Runners == null)
                                        {
                                            dbPlay.Runners = new List <GamePlayRunner>();
                                        }
                                        dbPlay.Runners.Add(dbPlayRunner);
                                    }

                                    bool isRunnerUpdate = false;
                                    if (!isNew)
                                    {
                                        isRunnerUpdate = CheckPlayRunnerForUpdate(feedRunner, dbPlayRunner, startLocation, endLocation);
                                    }

                                    if (isRunnerNew || isRunnerUpdate)
                                    {
                                        dbPlayRunner.IsEarned       = feedRunner.Details.Earned;
                                        dbPlayRunner.IsOut          = feedRunner.Movement.IsOut;
                                        dbPlayRunner.IsScore        = endLocation == RunnerLocation.Home_End;
                                        dbPlayRunner.IsTeamUnearned = feedRunner.Details.TeamUnearned;
                                        dbPlayRunner.MovementReason = feedRunner.Details.MovementReason;
                                        dbPlayRunner.OutLocation    = (dbPlayRunner.IsOut ?? false)
                                                                                                                                        ? GetRunnerLocationFromString(feedRunner.Movement.OutBase, false)
                                                                                                                                        : (RunnerLocation?)null;
                                        dbPlayRunner.OutNumber            = feedRunner.Movement.OutNumber;
                                        dbPlayRunner.PlayEvent            = feedRunner.Details.Event;
                                        dbPlayRunner.PlayEventType        = feedRunner.Details.EventType;
                                        dbPlayRunner.PlayIndex            = feedRunner.Details.PlayIndex;
                                        dbPlayRunner.PitcherResponsibleID = feedRunner.Details.ResponsiblePitcher?.Id;
                                        if (feedRunner.Credits != null && feedRunner.Credits.Count > 0)
                                        {
                                            if (dbPlayRunner.FieldingCredits == null)
                                            {
                                                dbPlayRunner.FieldingCredits = new List <GamePlayFieldingCredit>();
                                            }

                                            var dbCreditsToDelete = dbPlayRunner.FieldingCredits.ToList();                                             // EAGER LOAD
                                            foreach (var feedCredit in feedRunner.Credits)
                                            {
                                                var creditType = GetCreditTypeFromString(feedCredit.CreditCredit);
                                                var dbCredit   = dbPlayRunner.FieldingCredits.SingleOrDefault(x => x.FielderID == feedCredit.Player.Id && x.CreditType == creditType);
                                                if (dbCredit != null)
                                                {
                                                    dbCreditsToDelete.Remove(dbCredit);
                                                    dbCredit.CreditType = creditType;
                                                    dbCredit.FielderID  = feedCredit.Player.Id;
                                                    dbCredit.PosAbbr    = feedCredit.Position?.Abbreviation;
                                                    context.SaveChanges();
                                                }
                                                else
                                                {
                                                    dbCredit = new GamePlayFieldingCredit
                                                    {
                                                        PlayRunner   = dbPlayRunner,
                                                        PlayRunnerID = dbPlayRunner.GamePlayRunnerID,
                                                        CreditType   = creditType,
                                                        FielderID    = feedCredit.Player.Id,
                                                        PosAbbr      = feedCredit.Position?.Abbreviation
                                                    };
                                                    context.GamePlayFieldingCredits.Add(dbCredit);
                                                    context.SaveChanges();
                                                }
                                            }
                                            foreach (var dbCredit in dbCreditsToDelete)
                                            {
                                                context.GamePlayFieldingCredits.Remove(dbCredit);
                                                context.SaveChanges();
                                            }
                                        }
                                    }
                                }
                            }
                        }

                        var dbPlayPitchesDict  = dbPlayPitchesLookup.ContainsKey(playIndex) ? dbPlayPitchesLookup[playIndex] : null;
                        var dbPlayActionsDict  = dbPlayActionsLookup.ContainsKey(playIndex) ? dbPlayActionsLookup[playIndex] : null;
                        var dbPlayPickoffsDict = dbPlayPickoffsLookup.ContainsKey(playIndex) ? dbPlayPickoffsLookup[playIndex] : null;
                        var feedPlayEvents     = feedPlay.PlayEvents;
                        if (feedPlayEvents != null && feedPlayEvents.Count > 0)
                        {
                            foreach (var feedPlayEvent in feedPlayEvents)
                            {
                                if (string.Equals(feedPlayEvent.Type, "pitch", StringComparison.InvariantCultureIgnoreCase))
                                {
                                    bool isNewPitch = false;
                                    if (dbPlayPitchesDict == null || !dbPlayPitchesDict.TryGetValue(feedPlayEvent.Index, out GamePlayPitch dbPitch))
                                    {
                                        isNewPitch = true;
                                        dbPitch    = new GamePlayPitch
                                        {
                                            Batter             = batter,
                                            BatterID           = batter.PlayerID,
                                            Pitcher            = pitcher,
                                            PitcherID          = pitcher.PlayerID,
                                            GamePlay           = dbPlay,
                                            GamePlayID         = dbPlay.GamePlayID,
                                            GamePlayEventIndex = feedPlayEvent.Index,
                                            MlbPlayID          = feedPlayEvent.PlayId,
                                            PfxId = feedPlayEvent.PfxId
                                        };
                                        context.GamePlayPitches.Add(dbPitch);
                                    }

                                    bool isUpdatedPitch = false;
                                    // TODO: CHECK FOR UPDATES TO PITCH

                                    if (isNewPitch || isUpdatedPitch)
                                    {
                                        dbPitch.PitchNumber = feedPlayEvent.PitchNumber;

                                        dbPitch.Balls   = feedPlayEvent.Count?.Balls;
                                        dbPitch.Strikes = feedPlayEvent.Count?.Strikes;
                                        dbPitch.Outs    = feedPlayEvent.Count?.Outs;

                                        dbPitch.StartSpeed       = feedPlayEvent.PitchData?.StartSpeed;
                                        dbPitch.StrikeZoneBottom = feedPlayEvent.PitchData?.StrikeZoneBottom;
                                        dbPitch.StrikeZoneTop    = feedPlayEvent.PitchData?.StrikeZoneTop;
                                        dbPitch.EndSpeed         = feedPlayEvent.PitchData?.EndSpeed;
                                        dbPitch.NastyFactor      = feedPlayEvent.PitchData?.NastyFactor;

                                        dbPitch.P_A_X   = feedPlayEvent.PitchData?.Coordinates.A_X;
                                        dbPitch.P_A_Y   = feedPlayEvent.PitchData?.Coordinates.A_Y;
                                        dbPitch.P_A_Z   = feedPlayEvent.PitchData?.Coordinates.A_Z;
                                        dbPitch.P_PFX_X = feedPlayEvent.PitchData?.Coordinates.PFX_X;
                                        dbPitch.P_PFX_Z = feedPlayEvent.PitchData?.Coordinates.PFX_Z;
                                        dbPitch.P_P_X   = feedPlayEvent.PitchData?.Coordinates.P_X;
                                        dbPitch.P_P_Z   = feedPlayEvent.PitchData?.Coordinates.P_Z;
                                        dbPitch.P_V_X0  = feedPlayEvent.PitchData?.Coordinates.V_X0;
                                        dbPitch.P_V_Y0  = feedPlayEvent.PitchData?.Coordinates.V_Y0;
                                        dbPitch.P_V_Z0  = feedPlayEvent.PitchData?.Coordinates.V_Z0;
                                        dbPitch.P_X     = feedPlayEvent.PitchData?.Coordinates.X;
                                        dbPitch.P_X0    = feedPlayEvent.PitchData?.Coordinates.X0;
                                        dbPitch.P_Y     = feedPlayEvent.PitchData?.Coordinates.Y;
                                        dbPitch.P_Y0    = feedPlayEvent.PitchData?.Coordinates.Y0;
                                        dbPitch.P_Z0    = feedPlayEvent.PitchData?.Coordinates.Z0;

                                        dbPitch.P_BreakAngle    = feedPlayEvent.PitchData?.Breaks?.BreakAngle;
                                        dbPitch.P_BreakLength   = feedPlayEvent.PitchData?.Breaks?.BreakLength;
                                        dbPitch.P_Break_Y       = feedPlayEvent.PitchData?.Breaks?.BreakY;
                                        dbPitch.P_SpinDirection = feedPlayEvent.PitchData?.Breaks?.SpinDirection;
                                        dbPitch.P_SpinRate      = feedPlayEvent.PitchData?.Breaks?.SpinRate;

                                        dbPitch.P_Zone           = feedPlayEvent.PitchData?.Zone;
                                        dbPitch.P_TypeConfidence = feedPlayEvent.PitchData?.TypeConfidence;

                                        dbPitch.H_Coord_X = feedPlayEvent.HitData?.Coordinates?.CoordX;
                                        dbPitch.H_Coord_Y = feedPlayEvent.HitData?.Coordinates?.CoordY;

                                        dbPitch.H_Hardness      = feedPlayEvent.HitData?.Hardness;
                                        dbPitch.H_LaunchAngle   = feedPlayEvent.HitData?.LaunchAngle;
                                        dbPitch.H_LaunchSpeed   = feedPlayEvent.HitData?.LaunchSpeed;
                                        dbPitch.H_TotalDistance = feedPlayEvent.HitData?.TotalDistance;
                                        dbPitch.H_Location      = feedPlayEvent.HitData?.Location;

                                        dbPitch.HasReview = feedPlayEvent.Details?.HasReview;
                                        dbPitch.IsBall    = feedPlayEvent.Details?.IsBall;
                                        dbPitch.IsInPlay  = feedPlayEvent.Details?.IsInPlay;
                                        dbPitch.IsStrike  = feedPlayEvent.Details?.IsStrike;

                                        dbPitch.TimeSec = feedPlayEvent.StartTime.HasValue && feedPlayEvent.EndTime.HasValue
                                                                                                                        ? (short?)(feedPlayEvent.EndTime.Value - feedPlayEvent.StartTime.Value).TotalSeconds
                                                                                                                        : null;

                                        var trajectoryKey = feedPlayEvent.HitData?.Trajectory;
                                        dbPitch.H_TrajectoryTypeID = (!string.IsNullOrEmpty(trajectoryKey) && dbTrajectoriesDict.TryGetValue(trajectoryKey, out byte b1)) ? b1 : (byte?)null;

                                        var pitchResultKey = feedPlayEvent.Details?.Code;
                                        dbPitch.PitchResultTypeID = (!string.IsNullOrEmpty(pitchResultKey) && dbPitchResultsDict.TryGetValue(pitchResultKey, out byte b2)) ? b2 : (byte?)null;

                                        var pitchTypeKey = feedPlayEvent?.Details?.Type?.Code;
                                        dbPitch.PitchTypeID = (!string.IsNullOrEmpty(pitchTypeKey) && dbPitchTypesDict.TryGetValue(pitchTypeKey, out byte b3)) ? b3 : (byte?)null;
                                    }
                                }
                                else if (string.Equals(feedPlayEvent.Type, "action", StringComparison.InvariantCultureIgnoreCase))
                                {
                                }
                                else if (string.Equals(feedPlayEvent.Type, "pickoff", StringComparison.InvariantCultureIgnoreCase))
                                {
                                }
                                else
                                {
                                    throw new ArgumentException("UNEXPECTED PLAY EVENT TYPE");
                                }
                            }
                        }
                    }
                    context.SaveChanges();
                }
            }
        }
예제 #11
0
        public void Run(Model.MlbStatsContext context)
        {
            var dbAssociations         = context.Associations.ToDictionary(x => x.AssociationID);
            var dbSeasonsByAssociation = context.AssociationSeasons.ToLookup(x => x.AssociationID, y => y.Season).ToDictionary(x => x.Key, y => y.ToList());
            var dbGameStatusIds        = context.GameStatusTypes.ToDictionary(x => x.GameStatusCode, y => y.GameStatusTypeID);
            var dbVenues         = context.Venues.ToDictionary(x => x.VenueID);
            var dbSeasonsByVenue = context.VenueSeasons.ToLookup(x => x.VenueID, y => y.Season).ToDictionary(x => x.Key, y => y.ToList());
            var dbTeams          = context.Teams.ToDictionary(x => x.TeamID);
            var dbSeasonsByTeam  = context.TeamSeasons.ToLookup(x => x.TeamID, y => y.Season).ToDictionary(x => x.Key, y => y.ToList());
            var dbAllGameIds     = context.Games.Select(x => x.GameID).ToList();

            var newTeams              = new List <Team>();
            var newTeamSeasons        = new List <TeamSeason>();
            var newVenues             = new List <Venue>();
            var newVenueSeasons       = new List <VenueSeason>();
            var newGames              = new List <Game>();
            var newAssociations       = new List <Association>();
            var newAssociationSeasons = new List <AssociationSeason>();

            foreach (var associationId in this.AssociationIds)
            {
                Console.WriteLine($"GameScheduleProcessor - {this.Year} - {associationId}");

                var dbGames = context.Games.Where(x => x.GameTime.Year == this.Year && x.AssociationID == associationId).ToDictionary(x => x.GameID);

                var url     = Feeds.GameScheduleFeed.GetFeedUrl(this.Year, associationId);
                var rawJson = JsonUtility.GetRawJsonFromUrl(url);
                var feed    = Feeds.GameScheduleFeed.FromJson(rawJson);

                if (feed?.Dates != null && feed.Dates.Count > 0)
                {
                    if (!dbAssociations.TryGetValue(associationId, out Model.Association dbAssociation))
                    {
                        dbAssociation = new Model.Association
                        {
                            AssociationID = associationId,
                            IsEnabled     = false
                        };
                        dbAssociations.Add(associationId, dbAssociation);
                        newAssociations.Add(dbAssociation);
                        dbSeasonsByAssociation[associationId] = new List <int>();
                    }

                    var feedSeasonOptions = feed.Dates.SelectMany(x => x.Games.Select(y => y.Season));
                    foreach (var feedSeasonOption in feedSeasonOptions)
                    {
                        if (!dbSeasonsByAssociation.ContainsKey(associationId))
                        {
                            dbSeasonsByAssociation[associationId] = new List <int>();
                        }
                        if (!dbSeasonsByAssociation[associationId].Contains(feedSeasonOption))
                        {
                            var dbAssociationSeason = new Model.AssociationSeason
                            {
                                AssociationID = associationId,
                                Season        = feedSeasonOption
                            };
                            newAssociationSeasons.Add(dbAssociationSeason);
                            dbSeasonsByAssociation[associationId].Add(feedSeasonOption);
                        }
                    }

                    foreach (var feedDate in feed.Dates)
                    {
                        if (feedDate?.Games != null && feedDate.Games.Count > 0)
                        {
                            foreach (var feedGame in feedDate.Games)
                            {
                                Model.Venue dbVenue = null;
                                if (feedGame.Venue?.Id != null && !dbVenues.TryGetValue(feedGame.Venue.Id, out dbVenue))
                                {
                                    dbVenue = new Model.Venue
                                    {
                                        VenueID   = feedGame.Venue.Id,
                                        VenueName = feedGame.Venue.Name,
                                        VenueLink = feedGame.Venue.Link
                                    };
                                    newVenues.Add(dbVenue);
                                    dbVenues.Add(dbVenue.VenueID, dbVenue);
                                }

                                Model.VenueSeason dbVenueSeason = null;
                                if (!dbSeasonsByVenue.ContainsKey(feedGame.Venue.Id))
                                {
                                    // THIS MAY BE THE FIRST VenueSeason.
                                    dbSeasonsByVenue[feedGame.Venue.Id] = new List <int>();
                                }
                                if (!dbSeasonsByVenue[feedGame.Venue.Id].Contains(feedGame.Season))
                                {
                                    dbVenueSeason = new Model.VenueSeason
                                    {
                                        VenueID   = feedGame.Venue.Id,
                                        Season    = feedGame.Season,
                                        VenueName = feedGame.Venue.Name
                                    };
                                    newVenueSeasons.Add(dbVenueSeason);
                                    dbSeasonsByVenue[feedGame.Venue.Id].Add(feedGame.Season);
                                }

                                var        feedAwayTeam = feedGame.Teams?.Away?.Team;
                                Model.Team dbAwayTeam   = null;
                                if (feedAwayTeam?.Id != null && !dbTeams.TryGetValue(feedGame.Teams.Away.Team.Id, out dbAwayTeam))
                                {
                                    // TODO: MAKE CALL TO TEAM API TO FILL IN FULL TEAM DATA
                                    dbAwayTeam = new Model.Team
                                    {
                                        TeamID       = feedAwayTeam.Id,
                                        IsActive     = false,
                                        IsAllStar    = false,
                                        FirstSeason  = null,
                                        TeamFullName = feedAwayTeam.Name,
                                        TeamName     = feedAwayTeam.Name
                                    };
                                    newTeams.Add(dbAwayTeam);
                                    dbTeams.Add(dbAwayTeam.TeamID, dbAwayTeam);
                                }

                                Model.TeamSeason dbAwayTeamSeason = null;
                                if (dbAwayTeam != null)
                                {
                                    if (!dbSeasonsByTeam.ContainsKey(feedAwayTeam.Id))
                                    {
                                        dbSeasonsByTeam[feedAwayTeam.Id] = new List <int>();
                                    }
                                    if (!dbSeasonsByTeam[feedAwayTeam.Id].Contains(feedGame.Season))
                                    {
                                        dbAwayTeamSeason = new Model.TeamSeason
                                        {
                                            TeamID        = feedAwayTeam.Id,
                                            Season        = feedGame.Season,
                                            FullName      = feedAwayTeam.Name,
                                            TeamName      = feedAwayTeam.Name,
                                            AssociationID = associationId
                                        };
                                        newTeamSeasons.Add(dbAwayTeamSeason);
                                        dbSeasonsByTeam[feedAwayTeam.Id].Add(feedGame.Season);
                                    }
                                }

                                var        feedHomeTeam = feedGame.Teams?.Home?.Team;
                                Model.Team dbHomeTeam   = null;
                                if (feedHomeTeam?.Id != null && !dbTeams.TryGetValue(feedGame.Teams.Home.Team.Id, out dbHomeTeam))
                                {
                                    // TODO: MAKE CALL TO TEAM API TO FILL IN FULL TEAM DATA
                                    dbHomeTeam = new Model.Team
                                    {
                                        TeamID       = feedHomeTeam.Id,
                                        IsActive     = false,
                                        IsAllStar    = false,
                                        FirstSeason  = null,
                                        TeamFullName = feedHomeTeam.Name,
                                        TeamName     = feedHomeTeam.Name
                                    };
                                    newTeams.Add(dbHomeTeam);
                                    dbTeams.Add(dbHomeTeam.TeamID, dbHomeTeam);
                                }

                                Model.TeamSeason dbHomeTeamSeason = null;
                                if (dbHomeTeam != null)
                                {
                                    if (!dbSeasonsByTeam.ContainsKey(feedHomeTeam.Id))
                                    {
                                        dbSeasonsByTeam[feedHomeTeam.Id] = new List <int>();
                                    }
                                    if (!dbSeasonsByTeam[feedHomeTeam.Id].Contains(feedGame.Season))
                                    {
                                        dbHomeTeamSeason = new Model.TeamSeason
                                        {
                                            TeamID        = feedHomeTeam.Id,
                                            Season        = feedGame.Season,
                                            FullName      = feedHomeTeam.Name,
                                            TeamName      = feedHomeTeam.Name,
                                            AssociationID = associationId
                                        };
                                        newTeamSeasons.Add(dbHomeTeamSeason);
                                        dbSeasonsByTeam[feedHomeTeam.Id].Add(feedGame.Season);
                                    }
                                }

                                if (!dbGames.TryGetValue(feedGame.GamePk, out Model.Game dbGame))
                                {
                                    if (dbAllGameIds.Contains(feedGame.GamePk))
                                    {
                                        // GAME IS RETURNED FOR MULTIPLE ASSOCIATIONS
                                        dbGame = context.Games.SingleOrDefault(x => x.GameID == feedGame.GamePk);
                                        if (dbGame == null)
                                        {
                                            dbGame = newGames.SingleOrDefault(x => x.GameID == feedGame.GamePk);
                                        }
                                        if (dbGame == null)
                                        {
                                            throw new NullReferenceException("GameID BUT NO GAME.... WTF?!");
                                        }
                                        if (dbGame.AltAssociationID.HasValue && dbGame.AltAssociationID.Value != associationId)
                                        {
                                            throw new ArgumentException(string.Format($"GAME HAS MORE THAN 2 ASSOCIATIONS. WTF?! - {feedGame.GamePk}"));
                                        }
                                        dbGame.AltAssociationID = associationId;
                                    }
                                    else
                                    {
                                        dbGame = new Model.Game
                                        {
                                            GameID                 = feedGame.GamePk,
                                            Season                 = feedGame.Season,
                                            AssociationID          = associationId,
                                            GameTypeID             = feedGame.GameType,
                                            AwayTeamID             = feedGame.Teams?.Away?.Team?.Id,
                                            HomeTeamID             = feedGame.Teams?.Home?.Team?.Id,
                                            VenueID                = feedGame.Venue.Id,
                                            GameTime               = feedGame.GameDate,
                                            GameStatus             = dbGameStatusIds[feedGame.Status.StatusCode],
                                            AwayScore              = (byte?)feedGame.Teams?.Away?.Score,
                                            HomeScore              = (byte?)feedGame.Teams?.Home?.Score,
                                            IsTie                  = feedGame.IsTie ?? false,
                                            IsDoubleHeader         = feedGame.IsDoubleHeader,
                                            DayGameNum             = (byte)feedGame.GameNumber,
                                            IsDayGame              = feedGame.IsDayGame,
                                            IsTBD                  = feedGame.Status?.StartTimeTbd ?? false,
                                            IsIfNecessary          = feedGame.IfNecessary,
                                            IfNecessaryDescription = feedGame.IfNecessaryDescription,
                                            ScheduledLength        = (byte)feedGame.ScheduledInnings,
                                            SeriesLength           = (byte?)feedGame.GamesInSeries,
                                            SeriesGameNum          = (byte?)feedGame.SeriesGameNumber,
                                            SeriesDescription      = feedGame.SeriesDescription,
                                            RecordSource           = feedGame.RecordSource,
                                            AwaySeriesNum          = (byte?)feedGame.Teams?.Away?.SeriesNumber,
                                            AwayWins               = (byte?)feedGame.Teams?.Away?.LeagueRecord?.Wins,
                                            AwayLosses             = (byte?)feedGame.Teams?.Away?.LeagueRecord?.Losses,
                                            IsAwaySplitSquad       = feedGame.Teams?.Away?.SplitSquad,
                                            HomeSeriesNum          = (byte?)feedGame.Teams?.Home?.SeriesNumber,
                                            HomeWins               = (byte?)feedGame.Teams?.Home?.LeagueRecord?.Wins,
                                            HomeLosses             = (byte?)feedGame.Teams?.Home?.LeagueRecord?.Losses,
                                            IsHomeSplitSquad       = feedGame.Teams?.Home?.SplitSquad,
                                            AltAssociationID       = null,
                                            RawSeason              = feedGame.RawSeason,
                                            RescheduledDate        = feedGame.RescheduleDate,
                                            RescheduledFromDate    = feedGame.RescheduledFrom,
                                            ResumeDate             = feedGame.ResumeDate,
                                            ResumedFrom            = feedGame.ResumedFrom
                                        };
                                        newGames.Add(dbGame);
                                        dbGames.Add(dbGame.GameID, dbGame);
                                        dbAllGameIds.Add(dbGame.GameID);
                                    }
                                }
                                else
                                {
                                    ;                                     // TODO: UPDATE GAME VALUES
                                }
                            }
                        }
                    }
                    context.SaveChanges();
                }
            }
            context.Associations.AddRange(newAssociations);
            context.Teams.AddRange(newTeams);
            context.Venues.AddRange(newVenues);
            context.SaveChanges();
            context.AssociationSeasons.AddRange(newAssociationSeasons);
            context.VenueSeasons.AddRange(newVenueSeasons);
            context.SaveChanges();
            context.TeamSeasons.AddRange(newTeamSeasons);
            context.SaveChanges();
            context.Games.AddRange(newGames);
            context.SaveChanges();
        }