示例#1
0
        public void SearchForClubWithCountry()
        {
            //Arrange
            ClubSearchCriteria cc = new ClubSearchCriteria();

            cc.Country = "Denmark";

            var playerRepos = new Mock <IPlayerRepository <Player> >();

            playerRepos.Setup(x => x.GetById(1)).Returns(new Player {
                Id = 1
            });

            var clubRepos = new Mock <IClubRepository <Club> >();

            clubRepos.Setup(x => x.GetBySearchCriteriaWithJobPosition("asd"))
            .Returns(new List <Club>
            {
                new Club {
                    Id = 1, Country = "Sweden"
                },
                new Club {
                    Id = 2, Country = "Denmark"
                },
                new Club {
                    Id = 3, Country = "Norway"
                }
            });

            ClubLogic cl = new ClubLogic(clubRepos.Object, playerRepos.Object, null);

            var list = cl.HandleClubSearchAlgorithm(cc, 1);

            Assert.Equal("Denmark", list[0].Country);
        }
示例#2
0
        public void SearchForClubWithNoCriteria()
        {
            //Arrange
            var clubRepos         = new Mock <IClubRepository <Club> >();
            ClubSearchCriteria cc = new ClubSearchCriteria();

            clubRepos.Setup(x => x.GetAll(""))
            .Returns(new List <Club>
            {
                new Club {
                    Id = 1, Country = "Denmark"
                },
                new Club {
                    Id = 2, Country = "Sweden"
                },
                new Club {
                    Id = 3, Country = "Sweden"
                }
            });

            ClubLogic cl = new ClubLogic(clubRepos.Object, null, null);

            var list = cl.HandleClubSearchAlgorithm(cc, 0);

            Assert.Equal(3, list.Count);
        }
示例#3
0
        public void SearchForClubWithJobPositionAndValues()
        {
            //Arrange Search Criterias
            List <string> values = new List <string>();

            values.Add("Hard working");
            values.Add("Social cohesion");
            ClubSearchCriteria cc = new ClubSearchCriteria();

            cc.ValuesList = values;
            JobPosition jp = new JobPosition {
                Position      = "Left back",
                Height        = 190,
                PreferredHand = " Right hand"
            };
            List <JobPosition> l = new List <JobPosition> {
                jp
            };
            JobPosition jp2 = new JobPosition {
                Position      = "Right back",
                Height        = 200,
                PreferredHand = "Right hand"
            };
            List <JobPosition> l2 = new List <JobPosition> {
                jp2
            };


            //Arrange Player used to match with club jobposition
            var playerRepos = new Mock <IPlayerRepository <Player> >();

            playerRepos.Setup(x => x.GetById(1)).Returns(new Player {
                Id = 1, PrimaryPosition = "Left back", Height = 195, PreferredHand = "Left hand"
            });

            //Arrange Club
            var clubRepos = new Mock <IClubRepository <Club> >();

            clubRepos.Setup(x => x.GetBySearchCriteriaWithJobPoisitionValue(" v.name = 'Hard working' and c.isAvailable = 1  or v.name = 'Social cohesion' and c.isAvailable = 1 ", ""))
            .Returns(new List <Club>
            {
                new Club {
                    Id = 1, Country = "Sweden", League = "First League"
                },
                new Club {
                    Id = 2, Country = "Denmark", League = "Second League", JobPositionsList = l, ValuesList = values
                },
                new Club {
                    Id = 3, Country = "Norway", League = "First League", JobPositionsList = l2, ValuesList = values
                }
            });


            ClubLogic cl = new ClubLogic(clubRepos.Object, playerRepos.Object, null);

            var list = cl.HandleClubSearchAlgorithm(cc, 1);

            Assert.Equal(80, list[0].SearchPercentage);
        }
示例#4
0
        public void SearchForClubWithJobPositionWith5OutOf6CriteriaMatch()
        {
            //Arrange Search Criterias
            ClubSearchCriteria cc = new ClubSearchCriteria();

            cc.Country  = "Denmark";
            cc.League   = "Second League";
            cc.Position = "Left back";
            JobPosition jp = new JobPosition {
                Position      = "Left back",
                Height        = 190,
                PreferredHand = " Right hand"
            };
            List <JobPosition> l = new List <JobPosition>();

            l.Add(jp);

            //Arrange Player used to match with club jobposition
            var playerRepos = new Mock <IPlayerRepository <Player> >();

            playerRepos.Setup(x => x.GetById(1)).Returns(new Player {
                Id = 1, PrimaryPosition = "Left back", Height = 191, PreferredHand = "Left hand"
            });

            //Arrange Club
            var clubRepos = new Mock <IClubRepository <Club> >();

            clubRepos.Setup(x => x.GetBySearchCriteriaWithJobPosition(" c.isAvailable = 1  and c.league = 'Second League' " +
                                                                      "and isavailable = 1  and c.country = 'Denmark' and isavailable = 1  and jp.position = 'Left back' and isavailable = 1 "))
            .Returns(new List <Club>
            {
                new Club {
                    Id = 1, Country = "Sweden", League = "First League"
                },
                new Club {
                    Id = 2, Country = "Denmark", League = "Second League", JobPositionsList = l
                },
                new Club {
                    Id = 3, Country = "Norway", League = "First League"
                }
            });


            ClubLogic cl = new ClubLogic(clubRepos.Object, playerRepos.Object, null);

            var list = cl.HandleClubSearchAlgorithm(cc, 1);

            Assert.Equal(83, list[0].SearchPercentage);
        }
示例#5
0
        /**
         * Helping method used to get the SQL for season
         */
        private string GetSeasonSql(ClubSearchCriteria criterias)
        {
            string sql = "";

            if (criterias.Season == "Current year")
            {
                sql += " and jp.Season = 'Current year' ";
            }
            else if (criterias.Season == "Next year")
            {
                sql += " and jp.Season = 'Next year' ";
            }

            return(sql);
        }
示例#6
0
        /**
         * Helping method used to get the SQL for values
         */
        private string GetValueSql(ClubSearchCriteria criterias)
        {
            string sqlValue = "";

            foreach (string value in criterias.ValuesList)
            {
                if (sqlValue == "")
                {
                    sqlValue += " v.name = '" + value + "' and c.isAvailable = 1 ";
                }
                else
                {
                    sqlValue += " or v.name = '" + value + "' and c.isAvailable = 1 ";
                }
            }
            return(sqlValue);
        }
示例#7
0
        /**
         * Helping method used to get the SQL for preferences
         */
        private string GetPreferenceSql(ClubSearchCriteria criterias)
        {
            string sqlPreference = "";

            foreach (string preference in criterias.PreferencesList)
            {
                if (sqlPreference == "")
                {
                    sqlPreference += " p.name = '" + preference + "' and c.isAvailable = 1 ";
                }
                else
                {
                    sqlPreference += " or p.name = '" + preference + "' and c.isAvailable = 1 ";
                }
            }
            return(sqlPreference);
        }
示例#8
0
        public void SearchForClubWithCountryLeague()
        {
            //Arrange Search Criterias
            ClubSearchCriteria cc = new ClubSearchCriteria();

            cc.Country = "Denmark";
            cc.League  = "Second League";

            //Arrange Player used to match with club jobposition
            var playerRepos = new Mock <IPlayerRepository <Player> >();

            playerRepos.Setup(x => x.GetById(1)).Returns(new Player {
                Id = 1
            });

            //Arrange Club
            var clubRepos = new Mock <IClubRepository <Club> >();

            clubRepos.Setup(x => x.GetBySearchCriteriaWithJobPosition(" c.isAvailable = 1  and c.league = 'Second League' and isavailable = 1  and c.country = 'Denmark' and isavailable = 1 "))
            .Returns(new List <Club>
            {
                new Club {
                    Id = 1, Country = "Sweden", League = "First League"
                },
                new Club {
                    Id = 2, Country = "Denmark", League = "Second League"
                },
                new Club {
                    Id = 3, Country = "Norway", League = "First League"
                }
            });

            ClubLogic cl = new ClubLogic(clubRepos.Object, playerRepos.Object, null);

            var list = cl.HandleClubSearchAlgorithm(cc, 1);

            Assert.Equal(2, list[0].Id);
        }
示例#9
0
 public IActionResult SearchForClubs([FromQuery] ClubSearchCriteria clubSearchCriteria, int id)
 {
     return(Ok(_clubLogic.HandleClubSearchAlgorithm(clubSearchCriteria, id)));
 }
示例#10
0
        //Calculates criterias and matches on jobposition and return them in a List
        private List <int> CalculateJobPosition(JobPosition jobPosition, ClubSearchCriteria criterias, Player player)
        {
            int amountOfCriterias = 0; // how many criterias is selected
            int amountOfMatches   = 0; // how many criterias matches with club
            int playerAge         = DateTime.Now.Year - player.Year;

            if (jobPosition.Position != null)
            {
                amountOfCriterias++;
                if (player.PrimaryPosition == jobPosition.Position)
                {
                    amountOfMatches++;
                }
            }
            if (criterias.Position != null)
            {
                amountOfCriterias++;
                if (criterias.Position == jobPosition.Position)
                {
                    amountOfMatches++;
                }
            }
            if (jobPosition.League != null)
            {
                amountOfCriterias++;
                if (player.League == jobPosition.League)
                {
                    amountOfMatches++;
                }
            }
            if (jobPosition.PreferredHand != null)
            {
                amountOfCriterias++;
                if (jobPosition.PreferredHand == "None")
                {
                    amountOfMatches++;
                }
                else if (player.PreferredHand == jobPosition.PreferredHand)
                {
                    amountOfMatches++;
                }
                else if (player.PreferredHand == "Both")
                {
                    amountOfMatches++;
                }
            }
            if (jobPosition.Height != null)
            {
                amountOfCriterias++;
                if (player.Height >= jobPosition.Height)
                {
                    amountOfMatches++;
                }
            }
            if (jobPosition.MinAge != null)
            {
                amountOfCriterias++;
                if (playerAge > jobPosition.MinAge)
                {
                    amountOfMatches++;
                }
            }
            if (jobPosition.MaxAge != null)
            {
                amountOfCriterias++;
                if (playerAge < jobPosition.MaxAge)
                {
                    amountOfMatches++;
                }
            }
            if (jobPosition.ContractStatus != null)
            {
                amountOfCriterias++;
                if (jobPosition.ContractStatus == "None")
                {
                    amountOfMatches++;
                }
                else if (player.ContractStatus == jobPosition.ContractStatus)
                {
                    amountOfMatches++;
                }
            }
            if (jobPosition.StrengthsList.Count > 0)
            {
                foreach (string jobStrength in jobPosition.StrengthsList)
                {
                    amountOfCriterias++;
                    foreach (string playerStrength in player.StrengthList)
                    {
                        if (playerStrength == jobStrength)
                        {
                            amountOfMatches++;
                        }
                    }
                }
            }
            int[] array = { amountOfCriterias, amountOfMatches };
            return(array.ToList());
        }
示例#11
0
 /**
  * Helping method used to calculate match percentage
  * If criteria is not null, amountOfCriterias + 1
  * If criteria match with club, amountofMatches + 1
  */
 private List <Club> CalculateCriteriaMatchPercentage(List <Club> clubs, ClubSearchCriteria criterias, Player player)
 {
     foreach (Club club in clubs)
     {
         int  amountOfCriterias = 0; // how many criterias is selected
         int  amountOfMatches   = 0; // how many criterias matches with club
         bool secondaryPosition = false;
         bool mainPosition      = false;
         if (club.JobPositionsList.Count > 0)
         {
             foreach (JobPosition jobPosition in club.JobPositionsList)
             {
                 //If theres a primary position match we calculate percentage only for 1 jobposition
                 if (player.PrimaryPosition == jobPosition.Position && !mainPosition || criterias.Position == jobPosition.Position && !mainPosition)
                 {
                     mainPosition = true;
                     //if there has been a secondary position in the list before we get here, we reset the values.
                     if (secondaryPosition)
                     {
                         amountOfCriterias = 0;
                         amountOfMatches   = 0;
                     }
                     List <int> list = CalculateJobPosition(jobPosition, criterias, player);
                     amountOfCriterias = list[0];
                     amountOfMatches   = list[1];
                 }
                 else if (player.SecondaryPosition == jobPosition.Position && !mainPosition)
                 {
                     secondaryPosition = true;
                     List <int> list = CalculateJobPosition(jobPosition, criterias, player);
                     amountOfCriterias = list[0];
                     amountOfMatches   = list[1];
                 }
             }
         }
         if (criterias.PreferencesList.Count > 0)
         {
             foreach (string criteriaPreference in criterias.PreferencesList)
             {
                 amountOfCriterias++;
                 foreach (string clubPrefernce in club.PreferenceList)
                 {
                     if (criteriaPreference == clubPrefernce)
                     {
                         amountOfMatches++;
                     }
                 }
             }
         }
         if (criterias.ValuesList.Count > 0)
         {
             foreach (string criteriaValue in criterias.ValuesList)
             {
                 amountOfCriterias++;
                 foreach (string clubValue in club.ValuesList)
                 {
                     if (criteriaValue == clubValue)
                     {
                         amountOfMatches++;
                     }
                 }
             }
         }
         if (criterias.Country != null)
         {
             amountOfCriterias++;
             if (criterias.Country == club.Country)
             {
                 amountOfMatches++;
             }
         }
         if (criterias.League != null)
         {
             amountOfCriterias++;
             if (criterias.League == club.League)
             {
                 amountOfMatches++;
             }
         }
         club.CalculatePercentage(amountOfMatches, amountOfCriterias);
     }
     return(clubs);
 }
示例#12
0
        /**
         * Search for clubs based on the search criteria
         * Only gets neccessary club info based on the search criteria
         * Sorts the list based on Match Percentage and returns the list
         */
        public List <Club> HandleClubSearchAlgorithm(ClubSearchCriteria criterias, int id)
        {
            string      sql           = "";
            string      sqlPreference = "";
            string      sqlValue      = "";
            string      sqlSeason     = "";
            List <Club> clubs         = new List <Club>();

            // If no criteria is selected all clubs is returned with season match
            // Since no criteria is selected, all clubs match 100%
            if (criterias.Country == null && criterias.League == null &&
                criterias.Position == null && criterias.PreferencesList.Count == 0 &&
                criterias.ValuesList.Count == 0)
            {
                string seasonSql = "";
                if (criterias.Season == "Current year")
                {
                    seasonSql = "and jp.season = 'Current year'";
                }
                else if (criterias.Season == "Next year")
                {
                    seasonSql = "and jp.season = 'Next year'";
                }
                return((List <Club>)_clubRepos.GetAll(seasonSql));
            }

            // Country, league and position is a must-match when selected
            // Get all clubs with matching league, country and/or position
            if (criterias.Country != null || criterias.League != null || criterias.Position != null)
            {
                sql += GetSeasonSql(criterias);
                if (criterias.League != null)
                {
                    sql += " and c.league = '" + criterias.League + "' and isAvailable = 1 ";
                }
                if (criterias.Country != null)
                {
                    sql += " and c.country = '" + criterias.Country + "' and isAvailable = 1 ";
                }
                if (criterias.Position != null)
                {
                    sql += " and jp.position = '" + criterias.Position + "' and isAvailable = 1 ";
                }
                clubs = _clubRepos.GetBySearchCriteria(sql).ToList();
            }
            // If Country, League and Position is not selected as a criteria
            // We continue to match with the 'less important' criterias

            // If only preference, season and value is selected
            else if (criterias.PreferencesList.Count > 0 && criterias.ValuesList.Count > 0)
            {
                sqlPreference = GetPreferenceSql(criterias);
                sqlValue      = GetValueSql(criterias);
                sqlSeason     = GetSeasonSql(criterias);

                clubs = _clubRepos.GetBySearchCriteriaWithJobPositionPreferenceValue(sqlPreference, sqlValue, sqlSeason).ToList();
            }
            // If only season and value is selected
            else if (criterias.ValuesList.Count > 0)
            {
                sqlValue  = GetValueSql(criterias);
                sqlSeason = GetSeasonSql(criterias);

                clubs = _clubRepos.GetBySearchCriteriaWithJobPoisitionValue(sqlValue, sqlSeason).ToList();
            }
            // If only season and preference is selected
            else if (criterias.PreferencesList.Count > 0)
            {
                sqlPreference = GetPreferenceSql(criterias);
                sqlSeason     = GetSeasonSql(criterias);

                clubs = _clubRepos.GetBySearchCriteriaWithJobPoisitionPreference(sqlPreference, sqlSeason).ToList();
            }
            // If only preference and value is selected
            else if (criterias.PreferencesList.Count > 0 && criterias.ValuesList.Count > 0)
            {
                sqlPreference = GetPreferenceSql(criterias);
                sqlValue      = GetValueSql(criterias);
                sqlSeason     = GetSeasonSql(criterias);

                clubs = _clubRepos.GetBySearchCriteriaWithJobPositionPreferenceValue(sqlPreference, sqlValue, sqlSeason).ToList();
            }
            // When the clubs list is build it is ready to be sorted by match percentage
            // Since we match player with open job positions, we need to get the player first
            Player player = _playerRepos.GetById(id);

            // Calculate match percentage, sort by match percentage and return the list
            clubs = CalculateCriteriaMatchPercentage(clubs, criterias, player);
            SortListByPercentage sort = new SortListByPercentage();

            clubs.Sort(sort.CompareClub);
            return(clubs);
        }