PastResultsController.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. package controllers;
  2. import java.math.BigDecimal;
  3. import java.math.RoundingMode;
  4. import java.net.URL;
  5. import java.text.DecimalFormat;
  6. import java.util.AbstractMap.SimpleEntry;
  7. import java.util.ArrayList;
  8. import java.util.HashMap;
  9. import java.util.List;
  10. import java.util.Map;
  11. import java.util.Optional;
  12. import java.util.ResourceBundle;
  13. import org.apache.commons.lang3.NotImplementedException;
  14. import com.google.common.collect.Lists;
  15. import data.GuiMysql;
  16. import javafx.collections.FXCollections;
  17. import javafx.collections.ObservableList;
  18. import javafx.event.ActionEvent;
  19. import javafx.fxml.FXML;
  20. import javafx.fxml.Initializable;
  21. import javafx.scene.control.ComboBox;
  22. import javafx.scene.control.DatePicker;
  23. import javafx.scene.control.TableColumn;
  24. import javafx.scene.control.TableView;
  25. import javafx.scene.control.cell.MapValueFactory;
  26. import javafx.scene.layout.AnchorPane;
  27. import javafx.scene.text.Text;
  28. import objects.Constants;
  29. import objects.SoccerMatch;
  30. @SuppressWarnings("rawtypes") public class PastResultsController implements Initializable {
  31. @FXML AnchorPane basePane;
  32. @FXML TableView<Map<String, Object>> matchTable;
  33. @FXML DatePicker date;
  34. @FXML ComboBox<String> countrySelector;
  35. @FXML ComboBox<String> leagueSelector;
  36. @FXML TableColumn<Map, String> gameDateColumn = new TableColumn<>("Gamedate");
  37. @FXML TableColumn<Map, String> homeTeamColumn = new TableColumn<>("Home Team");
  38. @FXML TableColumn<Map, String> awayTeamColumn = new TableColumn<>("Away Team");
  39. @FXML TableColumn<Map, Float> odds1Column = new TableColumn<>("odds 1");
  40. @FXML TableColumn<Map, Float> oddsXColumn = new TableColumn<>("odds X");
  41. @FXML TableColumn<Map, Float> odds2Column = new TableColumn<>("odds 2");
  42. @FXML TableColumn<Map, Float> goalsHomeColumn = new TableColumn<>("Goals home");
  43. @FXML TableColumn<Map, Float> goalsAwayColumn = new TableColumn<>("Goals away");
  44. @FXML TableColumn<Map, Float> goalDiff = new TableColumn<>("Difference");
  45. @FXML TableColumn<Map, Float> avgScoreHomeColumn = new TableColumn<>("Avg score home");
  46. @FXML TableColumn<Map, Float> avgConcededHomeColumn = new TableColumn<>("Avg conceded home");
  47. @FXML TableColumn<Map, Float> avgScoreAwayColumn = new TableColumn<>("Avg score away");
  48. @FXML TableColumn<Map, Float> avgConcededAwayColumn = new TableColumn<>("Avg conceded away");
  49. @FXML TableColumn<Map, String> avgHomeScoredSeason = new TableColumn<>("AvgHomeScoredThisSeason");
  50. @FXML TableColumn<Map, String> avgHomeConcededSeason = new TableColumn<>("AvgHomeConcededThisSeason");
  51. @FXML TableColumn<Map, String> avgAwayScoredSeason = new TableColumn<>("AvgAwayScoredThisSeason");
  52. @FXML TableColumn<Map, String> avgAwayConcededSeason = new TableColumn<>("AvgAwayConcededThisSeason");
  53. @FXML TableColumn<Map, String> sumScoringColumn = new TableColumn<>("Sum scoring");
  54. @FXML TableColumn<Map, String> drawColumn = new TableColumn<>("draw");
  55. @FXML TableColumn<Map, String> awayWinColumn = new TableColumn<>(Constants.AWAY_WIN);
  56. @FXML Text homeTeamPastResultsText;
  57. @FXML Text awayTeamPastResultsText;
  58. @FXML Text previousMeetingsText;
  59. ObservableList<String> sports = FXCollections.observableArrayList();
  60. ObservableList<String> countries = FXCollections.observableArrayList();
  61. ObservableList<String> leagues = FXCollections.observableArrayList();
  62. private final ArrayList<SimpleEntry<Integer, String>> sportsList = Lists.newArrayList();
  63. private final ArrayList<SimpleEntry<Integer, String>> countriesList = Lists.newArrayList();
  64. private final ArrayList<SimpleEntry<Integer, String>> leaguesList = Lists.newArrayList();
  65. GuiMysql db = GuiMysql.getInstance();
  66. @Override public void initialize(URL arg0, ResourceBundle arg1) {
  67. gameDateColumn.setCellValueFactory(new MapValueFactory<>("gameDate"));
  68. homeTeamColumn.setCellValueFactory(new MapValueFactory<>("homeTeam"));
  69. awayTeamColumn.setCellValueFactory(new MapValueFactory<>("awayTeam"));
  70. odds1Column.setCellValueFactory(new MapValueFactory<>("odds1"));
  71. oddsXColumn.setCellValueFactory(new MapValueFactory<>("oddsX"));
  72. odds2Column.setCellValueFactory(new MapValueFactory<>("odds2"));
  73. goalsHomeColumn.setCellValueFactory(new MapValueFactory<>("goalsHome"));
  74. goalsAwayColumn.setCellValueFactory(new MapValueFactory<>("goalsAway"));
  75. goalDiff.setCellValueFactory(new MapValueFactory<>("goalDiff"));
  76. avgScoreHomeColumn.setCellValueFactory(new MapValueFactory<>("avgScoreHome"));
  77. avgConcededHomeColumn.setCellValueFactory(new MapValueFactory<>("avgConcededHome"));
  78. avgScoreAwayColumn.setCellValueFactory(new MapValueFactory<>("avgScoreAway"));
  79. avgConcededAwayColumn.setCellValueFactory(new MapValueFactory<>("avgConcededAway"));
  80. avgHomeScoredSeason.setCellValueFactory(new MapValueFactory<>("avgScoredHomeSeason"));
  81. avgHomeConcededSeason.setCellValueFactory(new MapValueFactory<>("avgConcededHomeSeason"));
  82. avgAwayScoredSeason.setCellValueFactory(new MapValueFactory<>("avgScoredAwaySeason"));
  83. avgAwayConcededSeason.setCellValueFactory(new MapValueFactory<>("avgConcededAwaySeason"));
  84. sumScoringColumn.setCellValueFactory(new MapValueFactory<>("sumScoring"));
  85. drawColumn.setCellValueFactory(new MapValueFactory<>("draw"));
  86. awayWinColumn.setCellValueFactory(new MapValueFactory<>(Constants.AWAY_WIN));
  87. basePane.setPrefWidth(0.0);
  88. basePane.setPrefHeight(0.0);
  89. date.valueProperty().addListener((ov, oldValue, newValue) -> {
  90. clear();
  91. getCountriesAtDate();
  92. });
  93. sportsList.addAll(GuiMysql.getInstance().getSports());
  94. sports.add(MainController.SPORT);
  95. for (final SimpleEntry<Integer, String> entry : sportsList) {
  96. if (entry.getValue().equals("soccer")) { // Anv�nder just nu bara Soccer
  97. sports.add(entry.getValue());
  98. }
  99. }
  100. countrySelector.setItems(countries);
  101. leagueSelector.setItems(leagues);
  102. matchTable.getSelectionModel().selectedItemProperty().addListener((obs, oldSelection, newSelection) -> {
  103. updateMatchStats(newSelection);
  104. });
  105. }
  106. private void updateMatchStats(Map<String, Object> newSelection) {
  107. if (newSelection != null) {
  108. Map<String, String> previousMatches = db.getPreviousMatches(5, newSelection.get("homeTeam").toString(),
  109. newSelection.get("awayTeam").toString(), date.getValue().toString(), getCountryIdFromSelector(), getLeagueIdFromSelector());
  110. homeTeamPastResultsText.setText(previousMatches.get("PrevHomeTeam"));
  111. awayTeamPastResultsText.setText(previousMatches.get("PrevAwayTeam"));
  112. previousMeetingsText.setText(previousMatches.get("PrevCombined"));
  113. }
  114. }
  115. private void clear() {
  116. matchTable.getItems().clear();
  117. countriesList.clear();
  118. leaguesList.clear();
  119. countries.clear();
  120. leagues.clear();
  121. }
  122. private void getCountriesAtDate() {
  123. countriesList.clear();
  124. countriesList.addAll(GuiMysql.getInstance().getCountriesBySport(db.getSportId(MainController.SPORT), date.getValue().toString()));
  125. countriesList.forEach(c -> countries.add(c.getValue()));
  126. }
  127. private void getLeaguesAtDate(int countryId) {
  128. leaguesList.clear();
  129. leaguesList.addAll(db.getLeaguesByDate(db.getSportId("soccer"), countryId, date.getValue().toString()));
  130. leaguesList.forEach(l -> leagues.add(l.getValue()));
  131. }
  132. @FXML private void getResults() {
  133. throw new NotImplementedException();
  134. }
  135. @FXML private void countrySelected(ActionEvent event) {
  136. if (getCountryIdFromSelector() != null) {
  137. getLeaguesAtDate(getCountryIdFromSelector());
  138. leagueSelector.setDisable(false);
  139. }
  140. }
  141. private Integer getCountryIdFromSelector() {
  142. Optional<SimpleEntry<Integer, String>> o = countriesList.stream().filter(p -> p.getValue().equals(countrySelector.getValue())).findFirst();
  143. return o.isPresent() ? o.get().getKey() : null;
  144. }
  145. private Integer getLeagueIdFromSelector() {
  146. Optional<SimpleEntry<Integer, String>> o = leaguesList.stream().filter(p -> p.getValue().equals(leagueSelector.getValue())).findFirst();
  147. return o.isPresent() ? o.get().getKey() : null;
  148. }
  149. @FXML private void leagueSelected(ActionEvent event) {
  150. if (getCountryIdFromSelector() != null) {
  151. List<SoccerMatch> matchesList = db.getMatches(db.getSportId(MainController.SOCCER), getCountryIdFromSelector(),
  152. db.getLeagueId(db.getSportId(MainController.SOCCER), getCountryIdFromSelector(), leagueSelector.getValue()),
  153. date.getValue().toString(), "ASC", true);
  154. ObservableList<Map<String, Object>> matches = FXCollections.<Map<String, Object>>observableArrayList();
  155. for (final SoccerMatch soccerMatch : matchesList) {
  156. final Map<String, Object> match = new HashMap<>();
  157. match.put("homeTeam", soccerMatch.getHomeTeam().getTeamName());
  158. match.put("awayTeam", soccerMatch.getAwayTeam().getTeamName());
  159. match.put("odds1", soccerMatch.getOdds1());
  160. match.put("oddsX", soccerMatch.getOddsX());
  161. match.put("odds2", soccerMatch.getOdds2());
  162. final List<Float> avgHomeTeamGoals = calculateAvgHomeScore(soccerMatch.getHomeTeam().getTeamId());
  163. final List<Float> avgAwayTeamGoals = calculateAvgAwayScore(soccerMatch.getAwayTeam().getTeamId());
  164. final List<Float> avgHomeTeamGoalsThisSeason = calculateAvgHomeScoreThisSeason(soccerMatch.getHomeTeam().getTeamId(),
  165. soccerMatch.getHomeTeam().getCountryId(), soccerMatch.getHomeTeam().getTeamLeagueId());
  166. final List<Float> avgAwayTeamGoalsThisSeason = calculateAvgAwayScoreThisSeason(soccerMatch.getAwayTeam().getTeamId(),
  167. soccerMatch.getAwayTeam().getCountryId(), soccerMatch.getAwayTeam().getTeamLeagueId());
  168. match.put("gameDate", soccerMatch.getGameDate().toString());
  169. match.put("avgScoreHome", avgHomeTeamGoals.get(0));
  170. match.put("avgConcededHome", avgHomeTeamGoals.get(1));
  171. match.put("avgScoreAway", avgAwayTeamGoals.get(0));
  172. match.put("avgConcededAway", avgAwayTeamGoals.get(1));
  173. match.put("avgScoredHomeSeason", avgHomeTeamGoalsThisSeason.get(0));
  174. match.put("avgConcededHomeSeason", avgHomeTeamGoalsThisSeason.get(1));
  175. match.put("avgScoredAwaySeason", avgAwayTeamGoalsThisSeason.get(0));
  176. match.put("avgConcededAwaySeason", avgAwayTeamGoalsThisSeason.get(1));
  177. match.put("sumScoring", avgHomeTeamGoalsThisSeason.get(0) * avgAwayTeamGoalsThisSeason.get(1)
  178. + avgAwayTeamGoalsThisSeason.get(0) * avgHomeTeamGoalsThisSeason.get(1));
  179. match.put("goalsHome",
  180. GuiMysql.getInstance().round(BigDecimal.valueOf(avgHomeTeamGoalsThisSeason.get(0) + avgAwayTeamGoalsThisSeason.get(1)),
  181. GuiMysql.getInstance().getIncrement(), RoundingMode.HALF_UP));
  182. match.put("goalsAway",
  183. GuiMysql.getInstance().round(BigDecimal.valueOf(avgAwayTeamGoalsThisSeason.get(0) + avgHomeTeamGoalsThisSeason.get(1)),
  184. GuiMysql.getInstance().getIncrement(), RoundingMode.HALF_UP));
  185. match.put("goalDiff",
  186. GuiMysql.getInstance()
  187. .round(BigDecimal.valueOf((avgHomeTeamGoalsThisSeason.get(0) * avgAwayTeamGoalsThisSeason.get(1))
  188. + (avgAwayTeamGoalsThisSeason.get(0) * avgHomeTeamGoalsThisSeason.get(1))),
  189. GuiMysql.getInstance().getIncrement(), RoundingMode.HALF_UP));
  190. match.put("country", soccerMatch.getHomeTeam().getCountryName());
  191. match.put(Constants.LEAGUE, soccerMatch.getHomeTeam().getTeamLeague());
  192. final DecimalFormat df = new DecimalFormat("#.##");
  193. df.setRoundingMode(RoundingMode.CEILING);
  194. // final League leagueInfo = GuiMysql.getInstance().getLeagueInfo(soccerMatch.getHomeTeam().getTeamLeague());
  195. matches.add(match);
  196. }
  197. matchTable.getItems().addAll(matches);
  198. }
  199. }
  200. private List<Float> calculateAvgHomeScore(int teamId) {
  201. return GuiMysql.getInstance().getAvgHomeScore(teamId);
  202. }
  203. private List<Float> calculateAvgAwayScore(int teamId) {
  204. return GuiMysql.getInstance().getAvgAwayScore(teamId);
  205. }
  206. private List<Float> calculateAvgHomeScoreThisSeason(int teamId, int countryId, int leagueId) {
  207. return GuiMysql.getInstance().getAvgHomeScoreThisSeason(teamId, countryId, leagueId, date.getValue().toString());
  208. }
  209. private List<Float> calculateAvgAwayScoreThisSeason(int teamId, int countryId, int leagueId) {
  210. return GuiMysql.getInstance().getAvgAwayScoreThisSeason(teamId, countryId, leagueId, date.getValue().toString());
  211. }
  212. @FXML private void updateStatsTable() {
  213. StatisticsTabController.getInstance().setOverUnderTable(getLeagueIdFromSelector(), date.getValue().toString());
  214. }
  215. @FXML private void updateStandingsTable() {
  216. String seasonFromDate = GuiMysql.getInstance().getSeasonFromDate(getCountryIdFromSelector(), getLeagueIdFromSelector(),
  217. date.getValue().toString());
  218. MatchStatTabController.getInstance().setLeagueStandingsTable(getLeagueIdFromSelector(), seasonFromDate, getCountryIdFromSelector(),
  219. date.getValue().toString());
  220. }
  221. }