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); }
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); }
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); }
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); }
/** * 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); }
/** * 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); }
/** * 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); }
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); }
public IActionResult SearchForClubs([FromQuery] ClubSearchCriteria clubSearchCriteria, int id) { return(Ok(_clubLogic.HandleClubSearchAlgorithm(clubSearchCriteria, id))); }
//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()); }
/** * 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); }
/** * 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); }