public MatchHeaderInfo[] BuildMatches(CompetitionType competitionType, CompetitionDetails competitionDetails)
        {
            var helper = new KnockoutMatchProvisioningEngineHelper();
            var pMatches = helper.ProvisionMatches(competitionType.PlayersCount,
                                                  competitionType.QualifyingToFinalPlayersCount,
                                                  competitionDetails.Players.Length);
            var fMatches = pMatches.Where(m => m.SectionCode == "MD").ToArray();
            var qMatches = pMatches.Where(m => m.SectionCode == "Q").ToArray();

            var rankedPlayersCount = competitionType.PlayersCount - competitionType.QualifyingToFinalPlayersCount;
            var qPlayersCount = competitionDetails.Players.Length - rankedPlayersCount;
            if (qPlayersCount <= competitionType.QualifyingToFinalPlayersCount)
            {
                qPlayersCount = 0;
            }
            var matches = new List<MatchHeaderInfo>();
            var finalPlayersCount = PlayersCountCalculator.CalculatePlayersCount(rankedPlayersCount);
            var qualifyingPlayersCount = PlayersCountCalculator.CalculatePlayersCount(qPlayersCount);
            var finalSectionMatches = CreateSectionMatches(finalPlayersCount, CompetitionSection.Final).ToArray();
            var qualifyingSectionMatches = CreateSectionMatches(qualifyingPlayersCount, CompetitionSection.Qualifying, competitionType.QualifyingToFinalPlayersCount).ToArray();
            var consolationSectionMatches = CreateConselationMatches(finalPlayersCount);

            for (var i = 0; i < fMatches.Length; i++)
            {
                finalSectionMatches[i].Player1Code = fMatches[i].Player1Code;
                finalSectionMatches[i].Player2Code = fMatches[i].Player2Code;
            }
            for (var i = 0; i < qMatches.Length; i++)
            {
                qualifyingSectionMatches[i].Player1Code = qMatches[i].Player1Code;
                qualifyingSectionMatches[i].Player2Code = qMatches[i].Player2Code;
            }

            matches.AddRange(qualifyingSectionMatches);
            matches.AddRange(finalSectionMatches);
            matches.AddRange(consolationSectionMatches);
            return matches.ToArray();
        }
예제 #2
0
    public UpdatePlayerPositionInfo[] PositionPlayers(CompetitionDetails details, CompetitionSection section)
    {
        var helper       = new KnockoutMatchProvisioningEngineHelper();
        var engine       = new KnockoutCalculationEngine();
        var output       = engine.Calculate(details.Type.PlayersCount, details.Type.QualifyingToFinalPlayersCount, details.Players.Length);
        var sectionCodes =
            section == CompetitionSection.Final
                ? helper.GenerateMainDrawCodesQueue(output.TotalMainDrawPlayers, output.ActualMainDrawPlayers,
                                                    details.Type.QualifyingToFinalPlayersCount)
                : helper.GenerateQualifyingDrawCodes(output.TotalQualifyingPlayers, output.ActualQualifyingPlayers);

        var sectionPlayers = details.Players.Where(p => p.Section == section);
        var items          = new List <UpdatePlayerPositionInfo>();

        if (sectionCodes.Count > 0 && sectionPlayers.Any())
        {
            var map = new Dictionary <string, int>();
            foreach (var competitionPlayer in sectionPlayers)
            {
                map[sectionCodes.Dequeue()] = competitionPlayer.Id;
            }
            var sectionMatches = details.Matches.Where(m => m.Section == section);



            foreach (
                var match in sectionMatches.Where(m => m.Player1Code.NotNullOrEmpty() || m.Player2Code.NotNullOrEmpty())
                )
            {
                int playerId;
                if (match.Player1Code.NotNullOrEmpty())
                {
                    if (map.TryGetValue(match.Player1Code, out playerId))
                    {
                        items.Add(new UpdatePlayerPositionInfo()
                        {
                            MatchId  = match.Id,
                            PlayerId = playerId,
                            Position = 0
                        });
                    }
                }
                if (match.Player2Code.NotNullOrEmpty())
                {
                    if (map.TryGetValue(match.Player2Code, out playerId))
                    {
                        items.Add(new UpdatePlayerPositionInfo()
                        {
                            MatchId  = match.Id,
                            PlayerId = playerId,
                            Position = 1
                        });
                    }
                }
            }
        }
        return(items.ToArray());

        if (details.Type.QualifyingPlayersCount > 0 && section == CompetitionSection.Qualifying)
        {
            items.AddRange(this.GetQualifyingPlayersPositions(details));
        }
        if (section == CompetitionSection.Final)
        {
            items.AddRange(this.GetFinalPlayersPositions(details));
        }
        return((from item in items
                where item.IsNotNull <UpdatePlayerPositionInfo>()
                select item).ToArray <UpdatePlayerPositionInfo>());
    }
    public UpdatePlayerPositionInfo[] PositionPlayers(CompetitionDetails details, CompetitionSection section)
    {
        var helper = new KnockoutMatchProvisioningEngineHelper();
        var engine = new KnockoutCalculationEngine();
        var output = engine.Calculate(details.Type.PlayersCount, details.Type.QualifyingToFinalPlayersCount, details.Players.Length);
        var sectionCodes =
            section == CompetitionSection.Final
                ? helper.GenerateMainDrawCodesQueue(output.TotalMainDrawPlayers, output.ActualMainDrawPlayers,
                                                    details.Type.QualifyingToFinalPlayersCount)
                : helper.GenerateQualifyingDrawCodes(output.TotalQualifyingPlayers, output.ActualQualifyingPlayers);

        var sectionPlayers = details.Players.Where(p => p.Section == section);
        var items = new List<UpdatePlayerPositionInfo>();
        if (sectionCodes.Count > 0 && sectionPlayers.Any())
        {
            var map = new Dictionary<string, int>();
            foreach (var competitionPlayer in sectionPlayers)
            {
                map[sectionCodes.Dequeue()] = competitionPlayer.Id;
            }
            var sectionMatches = details.Matches.Where(m => m.Section == section);



            foreach (
                var match in sectionMatches.Where(m => m.Player1Code.NotNullOrEmpty() || m.Player2Code.NotNullOrEmpty())
                )
            {
                int playerId;
                if (match.Player1Code.NotNullOrEmpty())
                {
                    if (map.TryGetValue(match.Player1Code, out playerId))
                    {
                        items.Add(new UpdatePlayerPositionInfo()
                                      {
                                          MatchId = match.Id,
                                          PlayerId = playerId,
                                          Position = 0
                                      });
                    }
                }
                if (match.Player2Code.NotNullOrEmpty())
                {
                    if (map.TryGetValue(match.Player2Code, out playerId))
                    {
                        items.Add(new UpdatePlayerPositionInfo()
                                      {
                                          MatchId = match.Id,
                                          PlayerId = playerId,
                                          Position = 1
                                      });
                    }
                }


            }
        }
        return items.ToArray();
        
        if (details.Type.QualifyingPlayersCount > 0 && section == CompetitionSection.Qualifying)
        {
            items.AddRange(this.GetQualifyingPlayersPositions(details));
        }
        if (section == CompetitionSection.Final)
        {
            items.AddRange(this.GetFinalPlayersPositions(details));
        }
        return (from item in items
            where item.IsNotNull<UpdatePlayerPositionInfo>()
            select item).ToArray<UpdatePlayerPositionInfo>();
    }