public static ElectionResultsData CombineResults(ElectionResultsData firstResultsSet, ElectionResultsData secondResultsSet) { var candidates = new List <CandidateConfig>(); if (firstResultsSet?.Candidates == null) { return(secondResultsSet); } if (secondResultsSet?.Candidates == null) { return(firstResultsSet); } foreach (var candidate in firstResultsSet.Candidates) { candidates.Add(new CandidateConfig { Id = candidate.Id, CsvId = candidate.CsvId, ImageUrl = candidate.ImageUrl, Name = candidate.Name, Votes = candidate.Votes + secondResultsSet.Candidates.FirstOrDefault(c => c.Id == candidate.Id)?.Votes ?? 0, Percentage = candidate.Percentage, Counties = candidate.Counties }); } candidates = CalculatePercentagesForCandidates(candidates, candidates.Sum(c => c.Votes)); return(new ElectionResultsData { Candidates = candidates }); }
public async Task <Result <ElectionResultsData> > Parse(ElectionResultsData electionResultsData, string csvContent, ElectionResultsFile file) { if (electionResultsData == null) { electionResultsData = new ElectionResultsData(); } var electionsConfigResponse = _electionConfigurationSource.GetElectionById(file.ElectionId); if (electionsConfigResponse.IsFailure) { return(Result.Failure <ElectionResultsData>(electionsConfigResponse.Error)); } var electionsConfig = electionsConfigResponse.Value; electionResultsData.Candidates = electionsConfig.Candidates.Select(c => new CandidateConfig { Id = c.CsvId, ImageUrl = c.ImageUrl, Name = c.Name }).ToList(); await PopulateCandidatesListWithVotes(csvContent, electionResultsData, file); var sumOfVotes = electionResultsData.Candidates.Sum(c => c.Votes); electionResultsData.Candidates = StatisticsAggregator.CalculatePercentagesForCandidates(electionResultsData.Candidates, sumOfVotes); return(Result.Ok(electionResultsData)); }
public void combine_candidate_votes_by_id() { var localResults = new ElectionResultsData(); var diasporaResults = new ElectionResultsData(); localResults.Candidates = new List <CandidateConfig> { new CandidateConfig { Id = "L1", Votes = 1 }, new CandidateConfig { Id = "L2", Votes = 2 }, }; diasporaResults.Candidates = new List <CandidateConfig> { new CandidateConfig { Id = "L2", Votes = 5 }, new CandidateConfig { Id = "L1", Votes = 10 }, }; var combinedVotes = StatisticsAggregator.CombineResults(localResults, diasporaResults); combinedVotes.Candidates[0].Id.Should().Be("L1"); combinedVotes.Candidates[0].Votes.Should().Be(11); combinedVotes.Candidates[1].Id.Should().Be("L2"); combinedVotes.Candidates[1].Votes.Should().Be(7); }
public async Task <Result <ElectionResultsData> > Parse(ElectionResultsData electionResultsData, string csvContent) { try { if (electionResultsData == null) { electionResultsData = new ElectionResultsData(); } var electionsConfig = DeserializeElectionsConfig(); var pollingStations = await CalculateVotesByCounty(csvContent, electionsConfig); var sumOfVotes = electionResultsData.Candidates.Sum(c => c.Votes); electionResultsData.Candidates = StatisticsAggregator.CalculatePercentagesForCandidates(electionResultsData.Candidates, sumOfVotes); var counties = pollingStations.GroupBy(g => g.County).Select(c => c.Key).OrderBy(c => c).ToList(); foreach (var candidate in electionResultsData.Candidates) { foreach (var county in counties) { var votesForCandidate = pollingStations.Where(p => p.County == county) .Sum(p => p.Candidates.FirstOrDefault(c => c.Id == candidate.Id)?.Votes ?? 0); candidate.Counties[county] = votesForCandidate; } } return(Result.Ok(electionResultsData)); } catch (Exception e) { Console.WriteLine(e); return(Result.Failure <ElectionResultsData>(e.Message)); } }
public Task <Result <ElectionResultsData> > Parse(ElectionResultsData electionResultsData, string csvContent, ElectionResultsFile file) { WasInvoked = true; electionResultsData.Candidates = new List <CandidateConfig>(); return(Task.FromResult(Result.Ok(electionResultsData))); }
private async Task <ElectionResultsData> CombineAllSources(ResultsQuery resultsQuery) { var electionGetResult = _electionConfigurationSource.GetElectionById(resultsQuery.ElectionId); if (electionGetResult.IsFailure) { Log.LogWarning($"Could not retrieve election with id {resultsQuery.ElectionId} due to error {electionGetResult.Error}"); return(ElectionResultsData.Default); } var availableSources = electionGetResult.Value.Files.Where(f => f.Active && f.FileType == FileType.Results).Select(f => f.Name).ToList(); var data = new ElectionResultsData(); if (availableSources.Count == 0) { return(CreateEmptyElectionResultsData(resultsQuery, data)); } foreach (var source in availableSources) { var resultsResponse = await _resultsRepository.Get(resultsQuery.ElectionId, source, FileType.Results.ConvertEnumToString()); if (resultsResponse.IsSuccess) { var deserializedData = JsonConvert.DeserializeObject <ElectionResultsData>(resultsResponse.Value.StatisticsJson); data = StatisticsAggregator.CombineResults(data, deserializedData); } } if (data?.Candidates?.Count == 0) { return(CreateEmptyElectionResultsData(resultsQuery, data)); } return(data); }
public static ElectionResultsData CombineResults(ElectionResultsData localResults, ElectionResultsData diasporaResults) { var candidates = new List <CandidateConfig>(); for (int i = 0; i < localResults.Candidates.Count; i++) { var candidate = localResults.Candidates[i]; candidates.Add(new CandidateConfig { Id = candidate.Id, CsvId = candidate.CsvId, ImageUrl = candidate.ImageUrl, Name = candidate.Name, Votes = candidate.Votes + diasporaResults.Candidates.FirstOrDefault(c => c.Id == candidate.Id).Votes, Percentage = candidate.Percentage, Counties = candidate.Counties }); } candidates = CalculatePercentagesForCandidates(candidates, candidates.Sum(c => c.Votes)); return(new ElectionResultsData { Candidates = candidates }); }
public static void CalculatePercentagesForCandidates(ElectionResultsData electionResultsData, int sumOfVotes) { foreach (var candidate in electionResultsData.Candidates) { decimal percentage = Math.Round((decimal)candidate.Votes / sumOfVotes * 100, 2); candidate.Percentage = percentage; } }
public static void CalculatePercentagesForCandidates(ElectionResultsData electionResultsData, int sumOfVotes) { foreach (var candidate in electionResultsData.Candidates) { decimal percentage = Math.Round((decimal)candidate.Votes / sumOfVotes * 100, 2); candidate.Percentage = percentage; } electionResultsData.Candidates = electionResultsData.Candidates.OrderByDescending(c => c.Percentage).ToList(); }
public static ElectionResultsData CombineResults(ElectionResultsData localResults, ElectionResultsData diasporaResults) { for (int i = 0; i < localResults.Candidates.Count; i++) { localResults.Candidates[i].Votes += diasporaResults.Candidates[i].Votes; } CalculatePercentagesForCandidates(localResults, localResults.Candidates.Sum(c => c.Votes)); return(localResults); }
public async Task <Result <ElectionResultsData> > RetrieveElectionData(string csvContent) { var electionResults = new ElectionResultsData(); foreach (var csvParser in CsvParsers) { await csvParser.Parse(electionResults, csvContent); } return(Result.Ok(electionResults)); }
public static ElectionStatistics BuildElectionStatistics(string fileName, ElectionResultsData electionResultsData) { var electionStatistics = new ElectionStatistics(); var fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileName); electionStatistics.Id = $"{DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks:D19}"; var attributes = fileNameWithoutExtension.Split('_'); electionStatistics.Type = attributes[0]; electionStatistics.Location = attributes[1]; electionStatistics.Timestamp = long.Parse(attributes[2]); electionStatistics.StatisticsJson = JsonConvert.SerializeObject(electionResultsData); return(electionStatistics); }
public async Task set_percentages_for_each_candidate(int c1Votes, decimal c1Percentage, int c2Votes, decimal c2Percentage, int c3Votes, decimal c3Percentage) { var candidatesResultsParser = new TestableCandidatesResultsParser(); candidatesResultsParser.ParsedCandidates = CreateListOfCandidatesWithVotes(c1Votes, c2Votes, c3Votes); var electionResultsData = new ElectionResultsData(); await candidatesResultsParser.Parse(electionResultsData, ""); electionResultsData.Candidates[0].Percentage.Should().Be(c1Percentage); electionResultsData.Candidates[1].Percentage.Should().Be(c2Percentage); electionResultsData.Candidates[2].Percentage.Should().Be(c3Percentage); }
private List <CandidateModel> ConvertCandidates(ElectionResultsData electionResultsData) { electionResultsData.Candidates = StatisticsAggregator.CalculatePercentagesForCandidates( electionResultsData.Candidates, electionResultsData.Candidates.Sum(c => c.Votes)); var candidates = electionResultsData.Candidates.Select(c => new CandidateModel { Id = c.Id, ImageUrl = c.ImageUrl, Name = c.Name, Percentage = c.Percentage, Votes = c.Votes }).ToList(); return(candidates); }
public async Task <Result <ElectionResultsData> > Parse(ElectionResultsData electionResultsData, string csvContent) { if (electionResultsData == null) { electionResultsData = new ElectionResultsData(); } Candidates = Config.Candidates; await PopulateCandidatesListWithVotes(csvContent); electionResultsData.Candidates = Candidates; var sumOfVotes = electionResultsData.Candidates.Sum(c => c.Votes); StatisticsAggregator.CalculatePercentagesForCandidates(electionResultsData, sumOfVotes); return(Result.Ok(electionResultsData)); }
private LiveResultsResponse CreateLiveResultsResponse(ElectionResultsData electionResultsData) { var candidates = ConvertCandidates(electionResultsData); var counties = electionResultsData?.Candidates?.FirstOrDefault()?.Counties.Select(c => new County { Label = c.Key, Id = "national", CountyName = c.Key }).ToList(); var liveResultsResponse = new LiveResultsResponse { Candidates = candidates }; liveResultsResponse.Counties = counties ?? new List <County>(); return(liveResultsResponse); }
public void set_percentages_for_each_candidate(int c1Votes, decimal c1Percentage, int c2Votes, decimal c2Percentage, int c3Votes, decimal c3Percentage) { var candidatesResultsParser = new TestableCandidatesResultsParser(null) { ParsedCandidates = CreateListOfCandidatesWithVotes(c1Votes, c2Votes, c3Votes) }; var electionResultsData = new ElectionResultsData { Candidates = CreateListOfCandidatesWithVotes(c1Votes, c2Votes, c3Votes) }; var sumOfVotes = candidatesResultsParser.ParsedCandidates.Sum(c => c.Votes); StatisticsAggregator.CalculatePercentagesForCandidates(electionResultsData, sumOfVotes); electionResultsData.Candidates[0].Percentage.Should().Be(c1Percentage); electionResultsData.Candidates[1].Percentage.Should().Be(c2Percentage); electionResultsData.Candidates[2].Percentage.Should().Be(c3Percentage); }
protected virtual async Task PopulateCandidatesListWithVotes(string csvContent, ElectionResultsData electionResultsData, ElectionResultsFile file) { try { TextReader sr = new StringReader(csvContent); var csvParser = new CsvParser(sr, CultureInfo.CurrentCulture); var headers = (await csvParser.ReadAsync()).ToList(); var totalCanceledVotes = 0; do { var rowValues = await csvParser.ReadAsync(); if (rowValues == null) { break; } var canceledVotesColumn = "d"; if (file.ResultsSource == "mail") { canceledVotesColumn = "d2"; } foreach (var candidate in electionResultsData.Candidates) { var votes = int.Parse(rowValues[headers.IndexOf(file.Prefix + candidate.Id)]); candidate.Votes += votes; } var canceledVotes = int.Parse(rowValues[headers.IndexOf(canceledVotesColumn)]); totalCanceledVotes += canceledVotes; } while (true); if (file.ElectionId == Consts.SecondElectionRound) { Console.WriteLine($"Canceled votes for {file.URL} is {totalCanceledVotes}"); } electionResultsData.CanceledVotes = totalCanceledVotes; } catch (Exception e) { Log.LogError(e, $"Couldn't populate list with votes for file {file.URL} and election {file.ElectionId}"); } }
public async Task <Result <ElectionResultsData> > RetrieveElectionData(string csvContent) { _logger.LogInformation($"Retrieving data from csv"); try { var electionResults = new ElectionResultsData(); foreach (var csvParser in CsvParsers) { await csvParser.Parse(electionResults, csvContent); } return(Result.Ok(electionResults)); } catch (Exception e) { _logger.LogError(e, "Failed to process data from csv"); _logger.LogInformation(csvContent.Substring(0, 1000)); return(Result.Failure <ElectionResultsData>(e.Message)); } }
private async Task <ElectionResultsData> CombineAllSources(ResultsQuery resultsQuery) { var files = _electionConfigurationSource.GetListOfFilesWithElectionResults(); var availableSources = files.Where(f => f.Active && f.FileType == FileType.Results).Select(f => f.Name); var data = new ElectionResultsData(); foreach (var source in availableSources) { var resultsResponse = await _resultsRepository.Get(resultsQuery.ElectionId, source, FileType.Results.ConvertEnumToString()); if (resultsResponse.IsSuccess) { var deserializedData = JsonConvert.DeserializeObject <ElectionResultsData>(resultsResponse.Value.StatisticsJson); data = StatisticsAggregator.CombineResults(data, deserializedData); } } return(data); }
public async Task <Result <ElectionResultsData> > Parse(ElectionResultsData electionResultsData, string csvContent) { if (electionResultsData == null) { electionResultsData = new ElectionResultsData(); } Candidates = Config.Candidates; await PopulateCandidatesListWithVotes(csvContent); electionResultsData.Candidates = Candidates; var sumOfVotes = electionResultsData.Candidates.Sum(c => c.Votes); foreach (var candidate in electionResultsData.Candidates) { decimal percentage = Math.Round((decimal)candidate.Votes / sumOfVotes * 100, 2); candidate.Percentage = percentage; } return(Result.Ok(electionResultsData)); }
public async Task <Result <ElectionResultsData> > Parse(ElectionResultsData electionResultsData, string csvContent) { if (electionResultsData == null) { electionResultsData = new ElectionResultsData(); } var electionsConfig = DeserializeElectionsConfig(); electionResultsData.Candidates = electionsConfig.Candidates.Select(c => new CandidateStatistics { Id = c.CsvId, ImageUrl = c.ImageUrl, Name = c.Name }).ToList(); await PopulateCandidatesListWithVotes(csvContent, electionResultsData.Candidates); var sumOfVotes = electionResultsData.Candidates.Sum(c => c.Votes); StatisticsAggregator.CalculatePercentagesForCandidates(electionResultsData, sumOfVotes); return(Result.Ok(electionResultsData)); }
protected override Task PopulateCandidatesListWithVotes(string csvContent, ElectionResultsData electionResultsData, ElectionResultsFile file) { return(Task.CompletedTask); }
private ElectionResultsData CreateEmptyElectionResultsData(ResultsQuery resultsQuery, ElectionResultsData data) { var currentElectionResult = _electionConfigurationSource.GetElectionById(resultsQuery.ElectionId); if (currentElectionResult.IsSuccess) { data.Candidates = currentElectionResult.Value.Candidates; return(data); } else { Log.LogWarning(currentElectionResult.Error); return(ElectionResultsData.Default); } }
public Task <Result <ElectionResultsData> > Parse(ElectionResultsData electionResultsData, string csvContent) { electionResultsData.PollingStations = new List <PollingStation>(); return(Task.FromResult(Result.Ok(electionResultsData))); }
public static ElectionStatistics BuildElectionStatistics(ElectionResultsFile file, ElectionResultsData electionResultsData) { var electionStatistics = new ElectionStatistics(); electionStatistics.Id = $"{DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks:D19}"; electionStatistics.Type = file.FileType.ConvertEnumToString(); electionStatistics.Source = file.ResultsSource; electionStatistics.Timestamp = file.Timestamp; electionStatistics.StatisticsJson = JsonConvert.SerializeObject(electionResultsData); electionStatistics.ElectionId = file.ElectionId; return(electionStatistics); }
public Task <Result <ElectionResultsData> > Parse(ElectionResultsData electionResultsData, string csvContent, ElectionResultsFile file) { return(Task.FromResult(Result.Ok(electionResultsData))); }