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);
        }
Beispiel #4
0
        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));
            }
        }
Beispiel #5
0
 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
            });
        }
Beispiel #8
0
 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();
 }
Beispiel #10
0
        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);
        }
Beispiel #11
0
        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));
        }
Beispiel #12
0
        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);
        }
Beispiel #13
0
        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);
        }
Beispiel #15
0
        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);
        }
Beispiel #17
0
        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);
        }
Beispiel #21
0
        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));
        }
Beispiel #22
0
        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)));
 }