/// ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- /// <name>SaveAthleteSeasonData</name> /// <date>30/03/15</date> /// <summary> /// Reads the athlete season details xml from file and decodes it. /// </summary> /// <param name="fileName">name of xml file</param> /// <returns>decoded athlete's details</returns> /// ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- public List <IAthleteSeasonDetails> LoadAthleteSeasonData( string fileName, IResultsConfigMngr resultsConfigurationManager) { List <IAthleteSeasonDetails> seasonDetails = new List <IAthleteSeasonDetails>(); try { XDocument reader = XDocument.Load(fileName); XElement rootElement = reader.Root; var athleteList = from Athlete in rootElement.Elements(c_athleteElement) select new { key = (int)Athlete.Attribute(c_keyAttribute), name = (string)Athlete.Attribute(c_nameAttribute), runningNumbers = from RunningNumbers in Athlete.Elements(c_runningNumbersElement) select new { numbers = from Numbers in RunningNumbers.Elements(c_numberElement) select new { number = (string)Numbers.Attribute(c_numberAttribute) } }, eventTimes = from EventTimes in Athlete.Elements(c_timesElement) select new { events = from Times in EventTimes.Elements(c_eventTimeElement) select new { time = (string)Times.Attribute(c_eventTimeAttribute), date = (string)Times.Attribute(c_eventDateAttribute) } }, mobTrophyPoints = from Points in Athlete.Elements(MobTrophyPointsElement) select new { point = from Point in Points.Elements(c_eventPointsElement) select new { finishing = (int)Point.Attribute(c_finishingPoints), position = (int)Point.Attribute(c_positionPoints), best = (int)Point.Attribute(c_bestPoints), date = (string)Point.Attribute(c_eventDateAttribute) } }, teamTrophyPoints = from Points in Athlete.Elements(TeamTrophyPointsElement) select new { point = from Point in Points.Elements(c_eventPointsElement) select new { teamTrophyPoint = (int)Point.Attribute(TeamTrophyPointsAttribute), date = (string)Point.Attribute(c_eventDateAttribute) } } }; foreach (var athlete in athleteList) { AthleteSeasonDetails athleteDetails = new AthleteSeasonDetails( athlete.key, athlete.name); foreach (var eventTms in athlete.eventTimes) { foreach (var times in eventTms.events) { athleteDetails.AddNewTime(new Appearances(new RaceTimeType(times.time), new DateType(times.date))); } } foreach (var points in athlete.mobTrophyPoints) { foreach (var point in points.point) { DateType eventDate = new DateType( point.date); CommonPoints commonPoints = new CommonPoints( point.finishing, point.position, point.best, eventDate); athleteDetails.Points.AddNewEvent(commonPoints); // TODO, should probably check that there are the correct number read from the xml file. // i.e. there is one for each event in the currently loaded season. // Will want to change it to proper serialisation at some point. } } foreach (var points in athlete.teamTrophyPoints) { foreach (var point in points.point) { DateType date = new DateType(point.date); IAthleteTeamTrophyPoints newEvent = new AthleteTeamTrophyPoints( point.teamTrophyPoint, date); athleteDetails.TeamTrophyPoints.AddNewEvent(newEvent); } } seasonDetails.Add(athleteDetails); } } catch (Exception ex) { this.logger.WriteLog("Error reading athlete data: " + ex.ToString()); seasonDetails = new List <IAthleteSeasonDetails>(); } return(seasonDetails); }
/// <summary> /// Loop through the results and work out all the points for the Team Trophy. /// </summary> /// <param name="resultsTable">results table</param> /// <param name="currentDate">date of the event</param> private void CalculateTeamTrophyPoints( EventResults resultsTable, DateType currentDate) { // Next score is used to complete the Team Trophy by filling in any blank spots. // The position is used to assign points to an athlete in the Team Trophy. int teamTrophyCompetitionPosition = 0; int nextScore = 1; resultsTable.OrderByFinishingTime(); Dictionary <string, ITeamTrophyEvent> eventDictionary = new Dictionary <string, ITeamTrophyEvent>(); foreach (IClubSeasonDetails club in this.Model.CurrentSeason.Clubs) { ITeamTrophyEvent newEvent = new TeamTrophyEvent( currentDate, this.resultsConfiguration.ResultsConfigurationDetails.NumberInTeamTrophyTeam); eventDictionary.Add( club.Name, newEvent); } foreach (ResultsTableEntry result in resultsTable.Entries) { IAthleteTeamTrophyPoints athletePoints; IAthleteSeasonDetails athlete = this.Model.CurrentSeason.Athletes.Find( a => a.Key == result.Key); if (athlete == null) { this.logger.WriteLog( $"Calculate Results Manager - Can'f find athlete {result.Key}"); continue; } if (result.Club == string.Empty || result.FirstTimer) { result.TeamTrophyPoints = TeamTrophyNoScore; athletePoints = new AthleteTeamTrophyPoints( TeamTrophyNoScore, currentDate); athlete.TeamTrophyPoints.AddNewEvent(athletePoints); // Not part of the Team Trophy, move onto the next loop. continue; } ++teamTrophyCompetitionPosition; ITeamTrophyEvent clubEvent = eventDictionary[result.Club]; ICommonTeamTrophyPoints clubPoint = new CommonTeamTrophyPoints( teamTrophyCompetitionPosition, result.Name, result.Key, true, currentDate); // Attempt to add point to the club. It will fail if the team is already full. bool success = clubEvent.AddPoint(clubPoint); if (success) { nextScore = teamTrophyCompetitionPosition + 1; result.TeamTrophyPoints = teamTrophyCompetitionPosition; } else { // Add points failed, revert the Team Trophy position. --teamTrophyCompetitionPosition; result.TeamTrophyPoints = TeamTrophyNoScore; } athletePoints = new AthleteTeamTrophyPoints( result.TeamTrophyPoints, currentDate); athlete.TeamTrophyPoints.AddNewEvent(athletePoints); } List <ITeamTrophyEvent> orderedEvent = new List <ITeamTrophyEvent>(); foreach (KeyValuePair <string, ITeamTrophyEvent> entry in eventDictionary) { entry.Value.Complete( this.resultsConfiguration.ResultsConfigurationDetails.NumberInTeamTrophyTeam, nextScore); orderedEvent.Add(entry.Value); } // Apply the score for each team as defined by the configuration file. // To order the teams, they've needed to be pulled out from the dictionary into a list. orderedEvent = orderedEvent.OrderBy(e => e.TotalAthletePoints).ToList(); int lastPoints = -1; int lastScoringIndex = 0; for (int index = 0; index < orderedEvent.Count; ++index) { if (orderedEvent[index].NumberOfAthletes == 0) { break; } if (orderedEvent[index].TotalAthletePoints == lastPoints) { orderedEvent[index].Score = this.resultsConfiguration.ResultsConfigurationDetails.TeamTrophyPoints[lastScoringIndex]; } else if (index < this.resultsConfiguration.ResultsConfigurationDetails.TeamTrophyPoints.Count) { orderedEvent[index].Score = this.resultsConfiguration.ResultsConfigurationDetails.TeamTrophyPoints[index]; lastScoringIndex = index; } lastPoints = orderedEvent[index].TotalAthletePoints; } foreach (KeyValuePair <string, ITeamTrophyEvent> entry in eventDictionary) { this.Model.CurrentSeason.AddNewClubPoints(entry.Key, entry.Value); } }