Axel Nordh 3 tahun lalu
induk
melakukan
b28bd5de62

+ 8 - 13
Odds/src/mysql/Mysql.java

@@ -69,8 +69,7 @@ public class Mysql {
 		leagueName = leagueName.replace("\\.", "");
 		final int sportId = addSport(sport);
 		final int countryId = addCountry(country);
-		final String sql = "INSERT INTO League (name, sportId, countryId) VALUES (?, ?, ?) "
-				+ "ON DUPLICATE KEY UPDATE name = ?";
+		final String sql = "INSERT INTO League (name, sportId, countryId) VALUES (?, ?, ?) " + "ON DUPLICATE KEY UPDATE name = ?";
 		try (PreparedStatement stat = conn.prepareStatement(sql)) {
 			stat.setString(1, leagueName);
 			stat.setInt(2, sportId);
@@ -180,12 +179,10 @@ public class Mysql {
 //			int awayScore, boolean overtime, float odds1, float oddsX, float odds2, int countryId, String season,
 //			int leagueId, int sportId) throws SQLException {
 
-		final int homeTeamId = getOrInsertTeam(result.getHomeTeam(), result.getCountryId(), result.getLeagueId(),
-				result.getSportId());
-		final int awayTeamId = getOrInsertTeam(result.getAwayTeam(), result.getCountryId(), result.getLeagueId(),
-				result.getSportId());
+		final int homeTeamId = getOrInsertTeam(result.getHomeTeam(), result.getCountryId(), result.getLeagueId(), result.getSportId());
+		final int awayTeamId = getOrInsertTeam(result.getAwayTeam(), result.getCountryId(), result.getLeagueId(), result.getSportId());
 
-		final String selectSql = "SELECT id FROM SoccerResults WHERE homeTeamId = ? AND awayTeamId = ? AND DATE(gameDate) = ?";
+		final String selectSql = "SELECT id FROM SoccerResults WHERE homeTeamId = ? AND awayTeamId = ? AND DATE(gameDate) = DATE(?)";
 		final ResultSet rs;
 		int gameId = -1;
 		final String date = result.getGameDate().format(DateTimeFormatter.ISO_DATE);
@@ -201,8 +198,7 @@ public class Mysql {
 		}
 
 		if (gameId != -1) {
-			final String sql = "UPDATE " + result.getTableName()
-					+ " SET homeScore = ?, awayScore = ?, overtime = ?, odds1 = ?, oddsX = ?, odds2 = ? "
+			final String sql = "UPDATE " + result.getTableName() + " SET homeScore = ?, awayScore = ?, overtime = ?, odds1 = ?, oddsX = ?, odds2 = ? "
 					+ "WHERE homeTeamId = ? AND awayTeamId = ? AND DATE(gameDate) = ?";
 
 			try (PreparedStatement stat = conn.prepareStatement(sql)) {
@@ -268,8 +264,7 @@ public class Mysql {
 		return teamId;
 	}
 
-	public void setParsingForLeague(int leagueId, int sportId, int countryId, LocalDateTime gameDate,
-			int currentParsePage, String parsedYear) {
+	public void setParsingForLeague(int leagueId, int sportId, int countryId, LocalDateTime gameDate, int currentParsePage, String parsedYear) {
 		final String sql = "UPDATE League SET parsedYear = ?, parsedPage = ?, lastParsedGameDate = ? WHERE sportId = ? AND countryId = ? AND id = ?";
 		try (PreparedStatement stat = conn.prepareStatement(sql)) {
 			stat.setString(1, parsedYear);
@@ -281,8 +276,8 @@ public class Mysql {
 
 			stat.executeUpdate();
 		} catch (final SQLException e) {
-			Log.getLog().info("Failing sql: %s, %s, %s, %s, %s, %s, %s", sql, parsedYear, currentParsePage,
-					gameDate.toString(), sportId, countryId, leagueId);
+			Log.getLog().info("Failing sql: %s, %s, %s, %s, %s, %s, %s", sql, parsedYear, currentParsePage, gameDate.toString(), sportId, countryId,
+					leagueId);
 			e.printStackTrace();
 		}
 	}

+ 19 - 18
Odds/src/parser/OddsPortal.java

@@ -5,6 +5,7 @@ import java.sql.SQLException;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Locale;
 import java.util.logging.Level;
@@ -146,11 +147,10 @@ public class OddsPortal implements ParserJoinedFunctions {
 
 						}
 					} catch (final NumberFormatException e) {
-						Log.getLog().info(
+						Log.getLog().info(String.format(
 								"Failed to get the match between %s and %s at %s odds1 %s oddsX %s odds2 %s homeScore %s awayScore %s overtime %s",
-								teams[0].trim(), teams[1].trim(),
-								baseDate.withHour(Integer.valueOf(time[0])).withMinute(Integer.valueOf(time[1])), odds1,
-								oddsX, odds2, homeScore, awayScore, (overtime ? "true" : "false"));
+								teams[0].trim(), teams[1].trim(), baseDate.withHour(Integer.valueOf(time[0])).withMinute(Integer.valueOf(time[1])),
+								odds1, oddsX, odds2, homeScore, awayScore, (overtime ? "true" : "false")));
 						continue;
 					}
 
@@ -164,16 +164,19 @@ public class OddsPortal implements ParserJoinedFunctions {
 
 					// String season = mysql.getLastParsedYear(leagueName, countryId); // TODO This
 					// don't work
-					String season = String
-							.valueOf(LocalDate.parse(date, DateTimeFormatter.ofPattern(DATE_PATTERN)).getYear());
+					String season = String.valueOf(LocalDate.parse(date, DateTimeFormatter.ofPattern(DATE_PATTERN)).getYear());
 					if (Strings.isNullOrEmpty(season)) {
 						season = String.valueOf(LocalDateTime.now().getYear());
 					}
 
-					final LocalDateTime dt = baseDate.withHour(Integer.valueOf(time[0]))
-							.withMinute(Integer.valueOf(time[1])).withSecond(0).withNano(0);
-					mysql.addResult(new ResultDTO("SoccerResults", dt, teams[0].trim(), teams[1].trim(), homeScore,
-							awayScore, overtime, odds1, oddsX, odds2, countrysId, season, leaguesId, sportsId));
+					final LocalDateTime dt = baseDate.withHour(Integer.valueOf(time[0])).withMinute(Integer.valueOf(time[1])).withSecond(0)
+							.withNano(0);
+					if (teams.length != 2) {
+						System.out.println("Something wrong with teams " + Arrays.toString(teams));
+					} else {
+						mysql.addResult(new ResultDTO("SoccerResults", dt, teams[0].trim(), teams[1].trim(), homeScore, awayScore, overtime, odds1,
+								oddsX, odds2, countrysId, season, leaguesId, sportsId));
+					}
 				}
 			}
 		} catch (FailingHttpStatusCodeException | IOException | SQLException e) {
@@ -212,8 +215,7 @@ public class OddsPortal implements ParserJoinedFunctions {
 			leagueId = mysql.getLeagueId(sportId, countryId, league);
 			String season = "";
 
-			final HtmlPage leaguePage = webClient
-					.getPage(url + "/" + sport + "/" + country + "/" + league + urlYearPart + resultsPage);
+			final HtmlPage leaguePage = webClient.getPage(url + "/" + sport + "/" + country + "/" + league + urlYearPart + resultsPage);
 			final List<HtmlAnchor> yearFilter = leaguePage.getByXPath("//ul[contains(@class,'main-filter')]//a");
 			for (final HtmlAnchor a : yearFilter) {
 				final String active = ((HtmlSpan) a.getParentNode().getParentNode()).getAttribute(CLASS);
@@ -241,8 +243,7 @@ public class OddsPortal implements ParserJoinedFunctions {
 
 					tournamentTableDiv = leaguePage.getHtmlElementById("tournamentTable");
 					tournamentTable = (HtmlTable) tournamentTableDiv.getFirstChild();
-					parseTournamentTable(sportId, countryId, leagueId, season, tournamentTable, gameDate,
-							dateFormatter);
+					parseTournamentTable(sportId, countryId, leagueId, season, tournamentTable, gameDate, dateFormatter);
 					currentParsePage = parsePage;
 				}
 				// process new tournament table content
@@ -257,8 +258,8 @@ public class OddsPortal implements ParserJoinedFunctions {
 		Log.getLog().info("DONE with " + country + " (" + countryId + ") league " + league + "(" + leagueId + ")");
 	}
 
-	private void parseTournamentTable(int sportId, int countryId, int leagueId, String season,
-			HtmlTable tournamentTable, LocalDateTime gameDate, DateTimeFormatter dateFormatter) throws SQLException {
+	private void parseTournamentTable(int sportId, int countryId, int leagueId, String season, HtmlTable tournamentTable, LocalDateTime gameDate,
+			DateTimeFormatter dateFormatter) throws SQLException {
 		for (final HtmlTableRow tr : tournamentTable.getRows()) {
 			if (tr.getAttribute(CLASS).contains("deactivate")) {
 				String homeTeam;
@@ -323,8 +324,8 @@ public class OddsPortal implements ParserJoinedFunctions {
 
 				if (gameDate != null && homeTeam != null && awayTeam != null && odds1 != 0 && oddsX != 0 && odds2 != 0
 						&& !Strings.isNullOrEmpty(season)) { // All set.. update sql result table
-					Mysql.getInstance().addResult(new ResultDTO("SoccerResults", gameDate, homeTeam, awayTeam,
-							homeScore, awayScore, overtime, odds1, oddsX, odds2, countryId, season, leagueId, sportId));
+					Mysql.getInstance().addResult(new ResultDTO("SoccerResults", gameDate, homeTeam, awayTeam, homeScore, awayScore, overtime, odds1,
+							oddsX, odds2, countryId, season, leagueId, sportId));
 				}
 
 			} else if (tr.getAttribute(CLASS).contains("center nob-border")) { // Datum rader

+ 1 - 0
Odds/testSqler.sql

@@ -0,0 +1 @@
+SELECT sr.*, ht.name, atm.name FROM `SoccerResults` sr inner join Team ht on homeTeamId = ht.id inner JOIN Team atm on awayTeamId = atm.id WHERE sr.leagueId = (SELECT id FROM League WHere name = 'mls') AND (awayScore = -1 OR homeScore = -1) AND DATE(gameDate) < DATE(NOW());

+ 31 - 43
OddsJavaFx/src/controllers/MatchTabController.java

@@ -80,6 +80,7 @@ import objects.TeamResults;
 
 	private ObservableList<Map<String, Object>> coutryFilteredMatches;
 	private List<SoccerMatch> upcomingMatches;
+	private int countryId;
 	private static final String FLOAT_FORMAT = "%.02f";
 
 	@Override public void initialize(URL arg0, ResourceBundle arg1) {
@@ -132,31 +133,25 @@ import objects.TeamResults;
 
 	private void makeColumnsEditable() {
 		betSeries.setCellFactory(TextFieldTableCell.forTableColumn(new IntegerStringConverter()));
-		betSeries.setOnEditCommit(
-				e -> e.getTableView().getItems().get(e.getTablePosition().getRow()).setBetSeries(e.getNewValue()));
+		betSeries.setOnEditCommit(e -> e.getTableView().getItems().get(e.getTablePosition().getRow()).setBetSeries(e.getNewValue()));
 
-		gameDate.setCellFactory(TextFieldTableCell.forTableColumn());
-		gameDate.setOnEditCommit(
-				e -> e.getTableView().getItems().get(e.getTablePosition().getRow()).setGameDate(e.getNewValue()));
+//		gameDate.setCellFactory(TextFieldTableCell.forTableColumn());
+//		gameDate.setOnEditCommit(e -> e.getTableView().getItems().get(e.getTablePosition().getRow()).setGameDate(e.getNewValue()));
 
 		match.setCellFactory(TextFieldTableCell.forTableColumn());
-		match.setOnEditCommit(
-				e -> e.getTableView().getItems().get(e.getTablePosition().getRow()).setMatch(e.getNewValue()));
+		match.setOnEditCommit(e -> e.getTableView().getItems().get(e.getTablePosition().getRow()).setMatch(e.getNewValue()));
 		betType.setCellFactory(TextFieldTableCell.forTableColumn());
-		betType.setOnEditCommit(
-				e -> e.getTableView().getItems().get(e.getTablePosition().getRow()).setBetType(e.getNewValue()));
+		betType.setOnEditCommit(e -> e.getTableView().getItems().get(e.getTablePosition().getRow()).setBetType(e.getNewValue()));
 		bet.setCellFactory(TextFieldTableCell.forTableColumn(new FloatStringConverter()));
-		bet.setOnEditCommit(
-				e -> e.getTableView().getItems().get(e.getTablePosition().getRow()).setBet(e.getNewValue()));
+		bet.setOnEditCommit(e -> e.getTableView().getItems().get(e.getTablePosition().getRow()).setBet(e.getNewValue()));
 		odds.setCellFactory(TextFieldTableCell.forTableColumn(new FloatStringConverter()));
-		odds.setOnEditCommit(
-				e -> e.getTableView().getItems().get(e.getTablePosition().getRow()).setOdds(e.getNewValue()));
+		odds.setOnEditCommit(e -> e.getTableView().getItems().get(e.getTablePosition().getRow()).setOdds(e.getNewValue()));
 	}
 
 	private void addSubmitButtonToTable() {
 		Callback<TableColumn<BetDTO, Void>, TableCell<BetDTO, Void>> cellFactory = new Callback<TableColumn<BetDTO, Void>, TableCell<BetDTO, Void>>() {
 			@Override public TableCell<BetDTO, Void> call(final TableColumn<BetDTO, Void> param) {
-				final TableCell<BetDTO, Void> cell = new TableCell<BetDTO, Void>() {
+				return new TableCell<BetDTO, Void>() {
 
 					private final Button btn = new Button("Submit");
 					{
@@ -175,7 +170,6 @@ import objects.TeamResults;
 						}
 					}
 				};
-				return cell;
 			}
 		};
 
@@ -204,12 +198,10 @@ import objects.TeamResults;
 			match.put("avgConcededHome", avgHomeTeamGoals.get(1));
 			match.put("avgScoreAway", avgAwayTeamGoals.get(0));
 			match.put("avgConcededAway", avgAwayTeamGoals.get(1));
-			match.put("goalsHome",
-					GuiMysql.getInstance().round(BigDecimal.valueOf(avgHomeTeamGoals.get(0) + avgAwayTeamGoals.get(1)),
-							GuiMysql.getInstance().getIncrement(), RoundingMode.HALF_UP));
-			match.put("goalsAway",
-					GuiMysql.getInstance().round(BigDecimal.valueOf(avgAwayTeamGoals.get(0) + avgHomeTeamGoals.get(1)),
-							GuiMysql.getInstance().getIncrement(), RoundingMode.HALF_UP));
+			match.put("goalsHome", GuiMysql.getInstance().round(BigDecimal.valueOf(avgHomeTeamGoals.get(0) + avgAwayTeamGoals.get(1)),
+					GuiMysql.getInstance().getIncrement(), RoundingMode.HALF_UP));
+			match.put("goalsAway", GuiMysql.getInstance().round(BigDecimal.valueOf(avgAwayTeamGoals.get(0) + avgHomeTeamGoals.get(1)),
+					GuiMysql.getInstance().getIncrement(), RoundingMode.HALF_UP));
 
 			match.put("country", soccerMatch.getHomeTeam().getCountryName());
 			match.put(Constants.LEAGUE, soccerMatch.getHomeTeam().getTeamLeague());
@@ -233,10 +225,8 @@ import objects.TeamResults;
 				betMargin = 1.1f; // Default value???
 			}
 
-			final TeamResults homeTeamResults = GuiMysql.getInstance()
-					.getTeamResults(soccerMatch.getHomeTeam().getTeamId(), lookBack, true);
-			final TeamResults awayTeamResults = GuiMysql.getInstance()
-					.getTeamResults(soccerMatch.getAwayTeam().getTeamId(), lookBack, false);
+			final TeamResults homeTeamResults = GuiMysql.getInstance().getTeamResults(soccerMatch.getHomeTeam().getTeamId(), lookBack, true);
+			final TeamResults awayTeamResults = GuiMysql.getInstance().getTeamResults(soccerMatch.getAwayTeam().getTeamId(), lookBack, false);
 
 			final float homeWinPercent = (homeTeamResults.getWins() + awayTeamResults.getLosses())
 					/ Float.valueOf(homeTeamResults.getCount() + Float.valueOf(awayTeamResults.getCount())) * 100;
@@ -245,19 +235,16 @@ import objects.TeamResults;
 			final float awayWinPercent = (homeTeamResults.getLosses() + awayTeamResults.getWins())
 					/ Float.valueOf(homeTeamResults.getCount() + Float.valueOf(awayTeamResults.getCount())) * 100;
 
-			match.put(Constants.HOME_WIN, String.format(FLOAT_FORMAT, homeWinPercent) + "("
-					+ String.format(FLOAT_FORMAT, (100 / homeWinPercent) * betMargin) + ")");
-			match.put("draw", String.format(FLOAT_FORMAT, drawPercent) + "("
-					+ String.format(FLOAT_FORMAT, (100 / drawPercent) * betMargin) + ")");
-			match.put(Constants.AWAY_WIN, String.format(FLOAT_FORMAT, awayWinPercent) + "("
-					+ String.format(FLOAT_FORMAT, (100 / awayWinPercent) * betMargin) + ")");
+			match.put(Constants.HOME_WIN,
+					String.format(FLOAT_FORMAT, homeWinPercent) + "(" + String.format(FLOAT_FORMAT, (100 / homeWinPercent) * betMargin) + ")");
+			match.put("draw", String.format(FLOAT_FORMAT, drawPercent) + "(" + String.format(FLOAT_FORMAT, (100 / drawPercent) * betMargin) + ")");
+			match.put(Constants.AWAY_WIN,
+					String.format(FLOAT_FORMAT, awayWinPercent) + "(" + String.format(FLOAT_FORMAT, (100 / awayWinPercent) * betMargin) + ")");
 
-			List<Float> avgHomeScoreThisSeason = GuiMysql.getInstance().getAvgHomeScoreThisSeason(
-					soccerMatch.getHomeTeam().getTeamId(), soccerMatch.getHomeTeam().getCountryId(),
-					soccerMatch.getHomeTeam().getTeamLeagueId());
-			List<Float> avgAwayScoreThisSeason = GuiMysql.getInstance().getAvgAwayScoreThisSeason(
-					soccerMatch.getAwayTeam().getTeamId(), soccerMatch.getAwayTeam().getCountryId(),
-					soccerMatch.getAwayTeam().getTeamLeagueId());
+			List<Float> avgHomeScoreThisSeason = GuiMysql.getInstance().getAvgHomeScoreThisSeason(soccerMatch.getHomeTeam().getTeamId(),
+					soccerMatch.getHomeTeam().getCountryId(), soccerMatch.getHomeTeam().getTeamLeagueId());
+			List<Float> avgAwayScoreThisSeason = GuiMysql.getInstance().getAvgAwayScoreThisSeason(soccerMatch.getAwayTeam().getTeamId(),
+					soccerMatch.getAwayTeam().getCountryId(), soccerMatch.getAwayTeam().getTeamLeagueId());
 
 			match.put("scoringScore", (avgHomeScoreThisSeason.get(0) * avgAwayScoreThisSeason.get(1))
 					+ (avgAwayScoreThisSeason.get(0) * avgHomeScoreThisSeason.get(1)));
@@ -265,8 +252,8 @@ import objects.TeamResults;
 			match.put("goalDiff",
 					GuiMysql.getInstance()
 							.round(BigDecimal.valueOf((avgHomeScoreThisSeason.get(0) * avgAwayScoreThisSeason.get(1))
-									+ (avgAwayScoreThisSeason.get(0) * avgHomeScoreThisSeason.get(1))),
-									GuiMysql.getInstance().getIncrement(), RoundingMode.HALF_UP));
+									+ (avgAwayScoreThisSeason.get(0) * avgHomeScoreThisSeason.get(1))), GuiMysql.getInstance().getIncrement(),
+									RoundingMode.HALF_UP));
 			match.put("addToBetslip", false);
 
 			matches.add(match);
@@ -275,16 +262,15 @@ import objects.TeamResults;
 	}
 
 	public void filterLeagueMatches(String filterByName, int countryId) {
-		List<SoccerMatch> filteredMatches = upcomingMatches.stream()
-				.filter(p -> p.getHomeTeam().getCountryId() == countryId)
+		List<SoccerMatch> filteredMatches = upcomingMatches.stream().filter(p -> p.getHomeTeam().getCountryId() == countryId)
 				.filter(p -> p.getHomeTeam().getTeamLeague().equals(filterByName)).toList();
+		this.countryId = countryId;
 		matchTable.getItems().clear();
 		setMatches(new ArrayList<>(filteredMatches));
 	}
 
 	public void filterCountryMatches(String filterByName) {
-		List<SoccerMatch> filteredMatches = upcomingMatches.stream()
-				.filter(p -> p.getHomeTeam().getCountryName().equals(filterByName)).toList();
+		List<SoccerMatch> filteredMatches = upcomingMatches.stream().filter(p -> p.getHomeTeam().getCountryName().equals(filterByName)).toList();
 
 		matchTable.getItems().clear();
 		setMatches(new ArrayList<>(filteredMatches));
@@ -338,6 +324,8 @@ import objects.TeamResults;
 		if (selectedCells.size() > 0) {
 			Map<String, Object> selectedRow = matchTable.getItems().get(selectedCells.get(0).getRow());
 			BetDTO betDTO = new BetDTO();
+			betDTO.setCountryId(countryId);
+			betDTO.setLeague(selectedRow.get("league").toString());
 			betDTO.setHomeTeam(selectedRow.get("homeTeam").toString());
 			betDTO.setAwayTeam(selectedRow.get("awayTeam").toString());
 			betDTO.setGameDate(selectedRow.get("gameDate").toString());

+ 35 - 30
OddsJavaFx/src/controllers/PastResultsController.java

@@ -28,6 +28,7 @@ import javafx.scene.control.TableColumn;
 import javafx.scene.control.TableView;
 import javafx.scene.control.cell.MapValueFactory;
 import javafx.scene.layout.AnchorPane;
+import javafx.scene.text.Text;
 import objects.Constants;
 import objects.SoccerMatch;
 
@@ -63,6 +64,10 @@ import objects.SoccerMatch;
 	@FXML TableColumn<Map, String> drawColumn = new TableColumn<>("draw");
 	@FXML TableColumn<Map, String> awayWinColumn = new TableColumn<>(Constants.AWAY_WIN);
 
+	@FXML Text homeTeamPastResultsText;
+	@FXML Text awayTeamPastResultsText;
+	@FXML Text previousMeetingsText;
+
 	ObservableList<String> sports = FXCollections.observableArrayList();
 	ObservableList<String> countries = FXCollections.observableArrayList();
 	ObservableList<String> leagues = FXCollections.observableArrayList();
@@ -116,6 +121,17 @@ import objects.SoccerMatch;
 		countrySelector.setItems(countries);
 		leagueSelector.setItems(leagues);
 
+		matchTable.getSelectionModel().selectedItemProperty().addListener((obs, oldSelection, newSelection) -> {
+			updateMatchStats(newSelection);
+		});
+	}
+
+	private void updateMatchStats(Map<String, Object> newSelection) {
+		Map<String, String> previousMatches = db.getPreviousMatches(5, newSelection.get("homeTeam").toString(),
+				newSelection.get("awayTeam").toString(), date.getValue().toString(), getCountryIdFromSelector(), getLeagueIdFromSelector());
+		homeTeamPastResultsText.setText(previousMatches.get("PrevHomeTeam"));
+		awayTeamPastResultsText.setText(previousMatches.get("PrevAwayTeam"));
+		previousMeetingsText.setText(previousMatches.get("PrevCombined"));
 	}
 
 	private void clear() {
@@ -128,8 +144,7 @@ import objects.SoccerMatch;
 
 	private void getCountriesAtDate() {
 		countriesList.clear();
-		countriesList.addAll(GuiMysql.getInstance().getCountriesBySport(db.getSportId(MainController.SPORT),
-				date.getValue().toString()));
+		countriesList.addAll(GuiMysql.getInstance().getCountriesBySport(db.getSportId(MainController.SPORT), date.getValue().toString()));
 
 		countriesList.forEach(c -> countries.add(c.getValue()));
 	}
@@ -153,22 +168,19 @@ import objects.SoccerMatch;
 	}
 
 	private Integer getCountryIdFromSelector() {
-		Optional<SimpleEntry<Integer, String>> o = countriesList.stream()
-				.filter(p -> p.getValue().equals(countrySelector.getValue())).findFirst();
+		Optional<SimpleEntry<Integer, String>> o = countriesList.stream().filter(p -> p.getValue().equals(countrySelector.getValue())).findFirst();
 		return o.isPresent() ? o.get().getKey() : null;
 	}
 
 	private Integer getLeagueIdFromSelector() {
-		Optional<SimpleEntry<Integer, String>> o = leaguesList.stream()
-				.filter(p -> p.getValue().equals(leagueSelector.getValue())).findFirst();
+		Optional<SimpleEntry<Integer, String>> o = leaguesList.stream().filter(p -> p.getValue().equals(leagueSelector.getValue())).findFirst();
 		return o.isPresent() ? o.get().getKey() : null;
 	}
 
 	@FXML private void leagueSelected(ActionEvent event) {
 		if (getCountryIdFromSelector() != null) {
-			List<SoccerMatch> matchesList = db.getMatches(db.getSportId(MainController.SOCCER),
-					getCountryIdFromSelector(), db.getLeagueId(db.getSportId(MainController.SOCCER),
-							getCountryIdFromSelector(), leagueSelector.getValue()),
+			List<SoccerMatch> matchesList = db.getMatches(db.getSportId(MainController.SOCCER), getCountryIdFromSelector(),
+					db.getLeagueId(db.getSportId(MainController.SOCCER), getCountryIdFromSelector(), leagueSelector.getValue()),
 					date.getValue().toString(), "ASC", true);
 
 			ObservableList<Map<String, Object>> matches = FXCollections.<Map<String, Object>>observableArrayList();
@@ -185,12 +197,10 @@ import objects.SoccerMatch;
 				final List<Float> avgHomeTeamGoals = calculateAvgHomeScore(soccerMatch.getHomeTeam().getTeamId());
 				final List<Float> avgAwayTeamGoals = calculateAvgAwayScore(soccerMatch.getAwayTeam().getTeamId());
 
-				final List<Float> avgHomeTeamGoalsThisSeason = calculateAvgHomeScoreThisSeason(
-						soccerMatch.getHomeTeam().getTeamId(), soccerMatch.getHomeTeam().getCountryId(),
-						soccerMatch.getHomeTeam().getTeamLeagueId());
-				final List<Float> avgAwayTeamGoalsThisSeason = calculateAvgAwayScoreThisSeason(
-						soccerMatch.getAwayTeam().getTeamId(), soccerMatch.getAwayTeam().getCountryId(),
-						soccerMatch.getAwayTeam().getTeamLeagueId());
+				final List<Float> avgHomeTeamGoalsThisSeason = calculateAvgHomeScoreThisSeason(soccerMatch.getHomeTeam().getTeamId(),
+						soccerMatch.getHomeTeam().getCountryId(), soccerMatch.getHomeTeam().getTeamLeagueId());
+				final List<Float> avgAwayTeamGoalsThisSeason = calculateAvgAwayScoreThisSeason(soccerMatch.getAwayTeam().getTeamId(),
+						soccerMatch.getAwayTeam().getCountryId(), soccerMatch.getAwayTeam().getTeamLeagueId());
 
 				match.put("gameDate", soccerMatch.getGameDate().toString());
 				match.put("avgScoreHome", avgHomeTeamGoals.get(0));
@@ -208,20 +218,17 @@ import objects.SoccerMatch;
 						+ avgAwayTeamGoalsThisSeason.get(0) * avgHomeTeamGoalsThisSeason.get(1));
 
 				match.put("goalsHome",
-						GuiMysql.getInstance()
-								.round(BigDecimal
-										.valueOf(avgHomeTeamGoalsThisSeason.get(0) + avgAwayTeamGoalsThisSeason.get(1)),
-										GuiMysql.getInstance().getIncrement(), RoundingMode.HALF_UP));
+						GuiMysql.getInstance().round(BigDecimal.valueOf(avgHomeTeamGoalsThisSeason.get(0) + avgAwayTeamGoalsThisSeason.get(1)),
+								GuiMysql.getInstance().getIncrement(), RoundingMode.HALF_UP));
 				match.put("goalsAway",
+						GuiMysql.getInstance().round(BigDecimal.valueOf(avgAwayTeamGoalsThisSeason.get(0) + avgHomeTeamGoalsThisSeason.get(1)),
+								GuiMysql.getInstance().getIncrement(), RoundingMode.HALF_UP));
+
+				match.put("goalDiff",
 						GuiMysql.getInstance()
-								.round(BigDecimal
-										.valueOf(avgAwayTeamGoalsThisSeason.get(0) + avgHomeTeamGoalsThisSeason.get(1)),
+								.round(BigDecimal.valueOf((avgHomeTeamGoalsThisSeason.get(0) * avgAwayTeamGoalsThisSeason.get(1))
+										+ (avgAwayTeamGoalsThisSeason.get(0) * avgHomeTeamGoalsThisSeason.get(1))),
 										GuiMysql.getInstance().getIncrement(), RoundingMode.HALF_UP));
-
-				match.put("goalDiff", GuiMysql.getInstance().round(
-						BigDecimal.valueOf((avgHomeTeamGoalsThisSeason.get(0) * avgAwayTeamGoalsThisSeason.get(1))
-								+ (avgAwayTeamGoalsThisSeason.get(0) * avgHomeTeamGoalsThisSeason.get(1))),
-						GuiMysql.getInstance().getIncrement(), RoundingMode.HALF_UP));
 				match.put("country", soccerMatch.getHomeTeam().getCountryName());
 				match.put(Constants.LEAGUE, soccerMatch.getHomeTeam().getTeamLeague());
 
@@ -245,13 +252,11 @@ import objects.SoccerMatch;
 	}
 
 	private List<Float> calculateAvgHomeScoreThisSeason(int teamId, int countryId, int leagueId) {
-		return GuiMysql.getInstance().getAvgHomeScoreThisSeason(teamId, countryId, leagueId,
-				date.getValue().toString());
+		return GuiMysql.getInstance().getAvgHomeScoreThisSeason(teamId, countryId, leagueId, date.getValue().toString());
 	}
 
 	private List<Float> calculateAvgAwayScoreThisSeason(int teamId, int countryId, int leagueId) {
-		return GuiMysql.getInstance().getAvgAwayScoreThisSeason(teamId, countryId, leagueId,
-				date.getValue().toString());
+		return GuiMysql.getInstance().getAvgAwayScoreThisSeason(teamId, countryId, leagueId, date.getValue().toString());
 	}
 
 	@FXML private void updateStatsTable() {

+ 140 - 70
OddsJavaFx/src/data/GuiMysql.java

@@ -59,8 +59,7 @@ public class GuiMysql extends Mysql {
 			final ResultSet rs = stat.executeQuery();
 
 			while (rs.next()) {
-				final SimpleEntry<Integer, String> entry = new SimpleEntry<>(rs.getInt(Constants.ID),
-						rs.getString("name"));
+				final SimpleEntry<Integer, String> entry = new SimpleEntry<>(rs.getInt(Constants.ID), rs.getString("name"));
 				sports.add(entry);
 			}
 		} catch (final SQLException e) {
@@ -79,8 +78,7 @@ public class GuiMysql extends Mysql {
 			final ResultSet rs = stat.executeQuery();
 
 			while (rs.next()) {
-				final SimpleEntry<Integer, String> entry = new SimpleEntry<>(rs.getInt(Constants.ID),
-						rs.getString("name"));
+				final SimpleEntry<Integer, String> entry = new SimpleEntry<>(rs.getInt(Constants.ID), rs.getString("name"));
 				countries.add(entry);
 			}
 		} catch (final SQLException e) {
@@ -100,8 +98,7 @@ public class GuiMysql extends Mysql {
 			final ResultSet rs = stat.executeQuery();
 
 			while (rs.next()) {
-				final SimpleEntry<Integer, String> entry = new SimpleEntry<>(rs.getInt(Constants.ID),
-						rs.getString("name"));
+				final SimpleEntry<Integer, String> entry = new SimpleEntry<>(rs.getInt(Constants.ID), rs.getString("name"));
 				leagues.add(entry);
 			}
 		} catch (final SQLException e) {
@@ -116,14 +113,11 @@ public class GuiMysql extends Mysql {
 		dateSql = " AND DATE(gameDate) >= DATE(now())";
 
 		final String sql = "SELECT res.id, homeTeamId, awayTeamId, homeScore, awayScore, overtime, odds1, oddsX, odds2, gameDate, season, res.leagueId, res.countryId, "
-				+ "hTeam.name as homeTeamName, aTeam.name as awayTeamName, " + "league.name as leagueName, "
-				+ "country.name as countryName, " + "country.prio as prio " + "FROM " + sportResultTable + " as res "
-				+ "Join Team as hTeam ON res.homeTeamId = hTeam.id "
-				+ "Join Team as aTeam ON res.awayTeamId = aTeam.id "
-				+ "Join League as league ON res.leagueId = league.id "
+				+ "hTeam.name as homeTeamName, aTeam.name as awayTeamName, " + "league.name as leagueName, " + "country.name as countryName, "
+				+ "country.prio as prio " + "FROM " + sportResultTable + " as res " + "Join Team as hTeam ON res.homeTeamId = hTeam.id "
+				+ "Join Team as aTeam ON res.awayTeamId = aTeam.id " + "Join League as league ON res.leagueId = league.id "
 				+ "Join Country as country ON res.countryId = country.id " + "where homeScore = -1 " + dateSql
-				+ "AND league.name NOT LIKE '%cup%' AND league.name NOT LIKE '%group%' "
-				+ "ORDER BY country.prio DESC, country.name ASC";
+				+ "AND league.name NOT LIKE '%cup%' AND league.name NOT LIKE '%group%' " + "ORDER BY country.prio DESC, country.name ASC";
 
 		try (PreparedStatement stat = conn.prepareStatement(sql)) {
 
@@ -197,8 +191,7 @@ public class GuiMysql extends Mysql {
 		try (PreparedStatement stat = conn.prepareStatement(sql)) {
 			stat.setInt(1, teamId);
 
-			if (Strings.isNullOrEmpty(gameDate)
-					|| getSeasonFromDate(countryId, leagueId, gameDate).equals(getLastSeason(countryId, leagueId))) {
+			if (Strings.isNullOrEmpty(gameDate) || getSeasonFromDate(countryId, leagueId, gameDate).equals(getLastSeason(countryId, leagueId))) {
 				stat.setString(2, getLastSeason(countryId, leagueId));
 			} else {
 				String seasonFromDate = getSeasonFromDate(countryId, leagueId, gameDate);
@@ -275,8 +268,7 @@ public class GuiMysql extends Mysql {
 		final String sql = "SELECT AVG(homeScore) as avgConcededSeason, AVG(awayScore) as avgScoredSeason FROM SoccerResults WHERE awayScore != -1 AND awayTeamId = ? AND season = ? AND DATE(gameDate) < ? ORDER BY gameDate ASC";
 		try (PreparedStatement stat = conn.prepareStatement(sql)) {
 			stat.setInt(1, teamId);
-			if (Strings.isNullOrEmpty(gameDate)
-					|| getSeasonFromDate(countryId, leagueId, gameDate).equals(getLastSeason(countryId, leagueId))) {
+			if (Strings.isNullOrEmpty(gameDate) || getSeasonFromDate(countryId, leagueId, gameDate).equals(getLastSeason(countryId, leagueId))) {
 				stat.setString(2, getLastSeason(countryId, leagueId));
 			} else {
 				String seasonFromDate = getSeasonFromDate(countryId, leagueId, gameDate);
@@ -381,8 +373,7 @@ public class GuiMysql extends Mysql {
 				+ "FROM SoccerResults "
 				+ "INNER JOIN (SELECT homeTeamId, AVG(homeScore) as avgScored, AVG(awayScore) as avgConceded FROM SoccerResults WHERE homeScore != -1 AND homeTeamId = SoccerResults.homeTeamId AND DATE(gameDate) < ? AND season = ? AND leagueId = ? GROUP BY homeTeamId) as sHome ON SoccerResults.homeTeamId = sHome.homeTeamId "
 				+ "INNER JOIN (SELECT awayTeamId, AVG(homeScore) as avgConceded, AVG(awayScore) as avgScored FROM SoccerResults WHERE awayScore != -1 AND awayTeamId = SoccerResults.awayTeamId AND DATE(gameDate) < ? AND season = ? AND leagueId = ? GROUP BY awayTeamId) as sAway ON SoccerResults.awayTeamId = sAway.awayTeamId "
-				+ "WHERE homeScore != -1 AND awayScore != -1 AND leagueId = ? AND DATE(gameDate) < ? AND season = ? "
-				+ "ORDER BY diff ASC";
+				+ "WHERE homeScore != -1 AND awayScore != -1 AND leagueId = ? AND DATE(gameDate) < ? AND season = ? " + "ORDER BY diff ASC";
 		List<String> allSeasons = getAllSeasons(leagueId);
 
 		try (PreparedStatement stat = conn.prepareStatement(sql)) {
@@ -409,11 +400,10 @@ public class GuiMysql extends Mysql {
 				while (rs.next()) {
 					final float diff = rs.getFloat("diff");
 					final int numGoals = rs.getInt("numGoals");
-					final Float formatted = round(BigDecimal.valueOf(diff), INCREMENT, RoundingMode.HALF_UP)
-							.floatValue();
+					final Float formatted = round(BigDecimal.valueOf(diff), INCREMENT, RoundingMode.HALF_UP).floatValue();
 
-					final OverUnder entry = result.stream().filter(ou -> ou.getKey().compareTo(formatted) == 0)
-							.findFirst().orElse(new OverUnder(formatted));
+					final OverUnder entry = result.stream().filter(ou -> ou.getKey().compareTo(formatted) == 0).findFirst()
+							.orElse(new OverUnder(formatted));
 					entry.addGoalStat(numGoals);
 					result.add(entry);
 				}
@@ -443,16 +433,14 @@ public class GuiMysql extends Mysql {
 		final ArrayList<TeamStanding> result = Lists.newArrayList();
 
 		final String sql = "SELECT teamName.name as teamName, count(*) played, count(case when homeScore > awayScore then 1 end) wins, "
-				+ "count(case when awayScore> homeScore then 1 end) lost, "
-				+ "count(case when homeScore = awayScore then 1 end) draws, " + "sum(homeScore) homeScore, "
-				+ "sum(awayScore) awayScore, " + "sum(homeScore) - sum(awayScore) goal_diff, "
-				+ "sum(case when homeScore > awayScore then 3 else 0 end  + case "
-				+ "WHEN homeScore = awayScore then 1 else 0 end) score, " + "season FROM "
+				+ "count(case when awayScore> homeScore then 1 end) lost, " + "count(case when homeScore = awayScore then 1 end) draws, "
+				+ "sum(homeScore) homeScore, " + "sum(awayScore) awayScore, " + "sum(homeScore) - sum(awayScore) goal_diff, "
+				+ "sum(case when homeScore > awayScore then 3 else 0 end  + case " + "WHEN homeScore = awayScore then 1 else 0 end) score, "
+				+ "season FROM "
 				+ "(select hometeamId team, homeScore, awayScore, season, leagueId as league, countryId as country FROM SoccerResults "
 				+ "union all SELECT awayteamId, awayScore, homeScore, season, leagueId as league, countryId as country FROM SoccerResults) a "
-				+ "INNER JOIN Team teamName ON team = teamName.id " + "WHERE season = ? " + "AND league = ? "
-				+ "AND country = ? " + "AND homeScore != -1 " + "AND awayScore != -1 " + "group by team "
-				+ "order by score desc, goal_diff desc";
+				+ "INNER JOIN Team teamName ON team = teamName.id " + "WHERE season = ? " + "AND league = ? " + "AND country = ? "
+				+ "AND homeScore != -1 " + "AND awayScore != -1 " + "group by team " + "order by score desc, goal_diff desc";
 		try (PreparedStatement stat = conn.prepareStatement(sql)) {
 
 			stat.setString(1, season);
@@ -461,9 +449,8 @@ public class GuiMysql extends Mysql {
 
 			final ResultSet rs = stat.executeQuery();
 			while (rs.next()) {
-				final TeamStanding ts = new TeamStanding(rs.getString("teamName"), rs.getInt("wins"), rs.getInt("lost"),
-						rs.getInt("draws"), rs.getInt("score"), rs.getFloat(Constants.HOME_SCORE),
-						rs.getFloat(Constants.AWAY_SCORE), rs.getFloat("goal_diff"));
+				final TeamStanding ts = new TeamStanding(rs.getString("teamName"), rs.getInt("wins"), rs.getInt("lost"), rs.getInt("draws"),
+						rs.getInt("score"), rs.getFloat(Constants.HOME_SCORE), rs.getFloat(Constants.AWAY_SCORE), rs.getFloat("goal_diff"));
 				result.add(ts);
 			}
 
@@ -518,16 +505,12 @@ public class GuiMysql extends Mysql {
 		final String sql;
 		final TeamResults tr = new TeamResults();
 		if (isHomeTeam) {
-			sql = "SELECT count(case when homeScore > awayScore then 1 end) wins, "
-					+ "count(case when awayScore > homeScore then 1 end) lost, "
-					+ "count(case when homeScore = awayScore then 1 end) draws "
-					+ "FROM (SELECT * FROM SoccerResults WHERE homeTeamId = ? AND "
+			sql = "SELECT count(case when homeScore > awayScore then 1 end) wins, " + "count(case when awayScore > homeScore then 1 end) lost, "
+					+ "count(case when homeScore = awayScore then 1 end) draws " + "FROM (SELECT * FROM SoccerResults WHERE homeTeamId = ? AND "
 					+ "HomeScore >= 0 AND awayScore >= 0 AND DATE(gameDate) < DATE(NOW()) ORDER BY gameDate DESC LIMIT ?) as t";
 		} else {
-			sql = "SELECT count(case when homeScore < awayScore then 1 end) wins, "
-					+ "count(case when awayScore < homeScore then 1 end) lost, "
-					+ "count(case when homeScore = awayScore then 1 end) draws "
-					+ "FROM (SELECT * FROM SoccerResults WHERE awayTeamId = ? AND "
+			sql = "SELECT count(case when homeScore < awayScore then 1 end) wins, " + "count(case when awayScore < homeScore then 1 end) lost, "
+					+ "count(case when homeScore = awayScore then 1 end) draws " + "FROM (SELECT * FROM SoccerResults WHERE awayTeamId = ? AND "
 					+ "HomeScore >= 0 AND awayScore >= 0 AND DATE(gameDate) < DATE(NOW()) ORDER BY gameDate DESC LIMIT ?) as t";
 		}
 
@@ -556,16 +539,12 @@ public class GuiMysql extends Mysql {
 		final String sql;
 		final TeamResults tr = new TeamResults();
 		if (isHomeTeam) {
-			sql = "SELECT count(case when homeScore > awayScore then 1 end) wins, "
-					+ "count(case when awayScore > homeScore then 1 end) lost, "
-					+ "count(case when homeScore = awayScore then 1 end) draws "
-					+ "FROM (SELECT * FROM SoccerResults WHERE homeTeamId = ? AND "
+			sql = "SELECT count(case when homeScore > awayScore then 1 end) wins, " + "count(case when awayScore > homeScore then 1 end) lost, "
+					+ "count(case when homeScore = awayScore then 1 end) draws " + "FROM (SELECT * FROM SoccerResults WHERE homeTeamId = ? AND "
 					+ "HomeScore >= 0 AND awayScore >= 0 AND DATE(gameDate) < ? ORDER BY gameDate DESC LIMIT ?) as t";
 		} else {
-			sql = "SELECT count(case when homeScore < awayScore then 1 end) wins, "
-					+ "count(case when awayScore < homeScore then 1 end) lost, "
-					+ "count(case when homeScore = awayScore then 1 end) draws "
-					+ "FROM (SELECT * FROM SoccerResults WHERE awayTeamId = ? AND "
+			sql = "SELECT count(case when homeScore < awayScore then 1 end) wins, " + "count(case when awayScore < homeScore then 1 end) lost, "
+					+ "count(case when homeScore = awayScore then 1 end) draws " + "FROM (SELECT * FROM SoccerResults WHERE awayTeamId = ? AND "
 					+ "HomeScore >= 0 AND awayScore >= 0 AND DATE(gameDate) < ? ORDER BY gameDate DESC LIMIT ?) as t";
 		}
 
@@ -625,8 +604,7 @@ public class GuiMysql extends Mysql {
 			final ResultSet rs = stat.executeQuery();
 
 			while (rs.next()) {
-				final SimpleEntry<Integer, String> entry = new SimpleEntry<>(rs.getInt(Constants.ID),
-						rs.getString("name"));
+				final SimpleEntry<Integer, String> entry = new SimpleEntry<>(rs.getInt(Constants.ID), rs.getString("name"));
 				leagues.add(entry);
 			}
 		} catch (final SQLException e) {
@@ -635,8 +613,7 @@ public class GuiMysql extends Mysql {
 		return leagues;
 	}
 
-	public List<SoccerMatch> getMatches(int sportId, Integer countryId, Integer leagueId, String date, String order,
-			boolean exactDate) {
+	public List<SoccerMatch> getMatches(int sportId, Integer countryId, Integer leagueId, String date, String order, boolean exactDate) {
 		final ArrayList<SoccerMatch> matches = Lists.newArrayList();
 		final String dateSql;
 		final String orderSql = " ORDER BY gameDate " + order;
@@ -649,10 +626,9 @@ public class GuiMysql extends Mysql {
 				dateSql = "DATE(gameDate) <= '" + date + "' ";
 			}
 		}
-		final String sql = "SELECT res.*, " + "hTeam.name as homeTeamName, aTeam.name as awayTeamName "
-				+ "FROM SoccerResults as res " + "Join Team as hTeam ON res.homeTeamId = hTeam.id "
-				+ "Join Team as aTeam ON res.awayTeamId = aTeam.id " + "WHERE " + dateSql + "AND res.leagueId = ? "
-				+ "AND res.countryId = ? " + orderSql;
+		final String sql = "SELECT res.*, " + "hTeam.name as homeTeamName, aTeam.name as awayTeamName " + "FROM SoccerResults as res "
+				+ "Join Team as hTeam ON res.homeTeamId = hTeam.id " + "Join Team as aTeam ON res.awayTeamId = aTeam.id " + "WHERE " + dateSql
+				+ "AND res.leagueId = ? " + "AND res.countryId = ? " + orderSql;
 
 		try (PreparedStatement stat = conn.prepareStatement(sql)) {
 			stat.setInt(1, leagueId);
@@ -702,10 +678,9 @@ public class GuiMysql extends Mysql {
 			final ResultSet rs = stat.executeQuery();
 
 			while (rs.next()) {
-				result = new League(rs.getInt(Constants.ID), rs.getString("name"), rs.getInt("lookback"),
-						rs.getInt("betMargin"), rs.getInt("lookbackHome"), rs.getInt("lookbackDraw"),
-						rs.getInt("lookbackAway"), rs.getInt("betMarginHome"), rs.getInt("betMarginDraw"),
-						rs.getInt("betMarginAway"));
+				result = new League(rs.getInt(Constants.ID), rs.getString("name"), rs.getInt("lookback"), rs.getInt("betMargin"),
+						rs.getInt("lookbackHome"), rs.getInt("lookbackDraw"), rs.getInt("lookbackAway"), rs.getInt("betMarginHome"),
+						rs.getInt("betMarginDraw"), rs.getInt("betMarginAway"));
 			}
 		} catch (final SQLException e) {
 			e.printStackTrace();
@@ -722,10 +697,9 @@ public class GuiMysql extends Mysql {
 			final ResultSet rs = stat.executeQuery();
 
 			while (rs.next()) {
-				result = new League(rs.getInt(Constants.ID), rs.getString("name"), rs.getInt("lookback"),
-						rs.getInt("betMargin"), rs.getInt("lookbackHome"), rs.getInt("lookbackDraw"),
-						rs.getInt("lookbackAway"), rs.getInt("betMarginHome"), rs.getInt("betMarginDraw"),
-						rs.getInt("betMarginAway"));
+				result = new League(rs.getInt(Constants.ID), rs.getString("name"), rs.getInt("lookback"), rs.getInt("betMargin"),
+						rs.getInt("lookbackHome"), rs.getInt("lookbackDraw"), rs.getInt("lookbackAway"), rs.getInt("betMarginHome"),
+						rs.getInt("betMarginDraw"), rs.getInt("betMarginAway"));
 			}
 		} catch (final SQLException e) {
 			e.printStackTrace();
@@ -821,9 +795,9 @@ public class GuiMysql extends Mysql {
 	public List<BetDTO> getBetSeries(boolean includeInactive) {
 		List<BetDTO> result = new ArrayList<>();
 		String sql = "SELECT ab.*, sr.gameDate as gameDate, sr.id as gameId, sr.homeScore as homeScore, sr.awayScore as awayScore, "
-				+ "ht.name as homeTeam, aw.name as awayTeam " + "FROM ActiveBets ab "
-				+ "INNER JOIN SoccerResults sr ON ab.gameId = sr.id " + "INNER JOIN Team ht ON sr.homeTeamId = ht.id "
-				+ "INNER JOIN Team aw ON sr.awayTeamId = aw.id " + "WHERE done = ?";
+				+ "ht.name as homeTeam, aw.name as awayTeam " + "FROM ActiveBets ab " + "INNER JOIN SoccerResults sr ON ab.gameId = sr.id "
+				+ "INNER JOIN Team ht ON sr.homeTeamId = ht.id " + "INNER JOIN Team aw ON sr.awayTeamId = aw.id "
+				+ "WHERE done = ? ORDER BY series ASC, sr.gameDate DESC";
 
 		try (PreparedStatement stat = conn.prepareStatement(sql)) {
 			stat.setBoolean(1, includeInactive);
@@ -857,7 +831,7 @@ public class GuiMysql extends Mysql {
 
 		try (PreparedStatement stat = conn.prepareStatement(sql)) {
 			stat.setInt(1, bet.getBetSeries());
-			stat.setInt(2, bet.getGameId());
+			stat.setInt(2, getGameId(bet.getHomeTeam(), bet.getAwayTeam(), bet.getGameDate(), bet.getCountryId(), bet.getLeagueId()));
 			stat.setString(3, bet.getBetType());
 			stat.setFloat(4, bet.getBet());
 			stat.setFloat(5, bet.getOdds());
@@ -868,4 +842,100 @@ public class GuiMysql extends Mysql {
 			e.printStackTrace();
 		}
 	}
+
+	public int getGameId(String homeTeam, String awayTeam, String gameDate, int countryId, int leagueId) {
+		int result = -1;
+		String sql = "SELECT id FROM SoccerResults WHERE homeTeamId = (SELECT id FROM Team WHERE name = ? AND countryId = ? AND leagueId = ?) AND awayTeamId = (SELECT id FROM Team WHERE name = ? AND countryId = ? AND leagueId = ?) AND DATE(gameDate) = DATE(?)";
+		try (PreparedStatement stat = conn.prepareStatement(sql)) {
+			stat.setString(1, homeTeam);
+			stat.setInt(2, countryId);
+			stat.setInt(3, leagueId);
+			stat.setString(4, awayTeam);
+			stat.setInt(5, countryId);
+			stat.setInt(6, leagueId);
+			stat.setString(7, gameDate);
+
+			ResultSet rs = stat.executeQuery();
+
+			while (rs.next()) {
+				result = rs.getInt("id");
+			}
+
+		} catch (SQLException e) {
+			e.printStackTrace();
+		}
+
+		return result;
+	}
+
+	public Map<String, String> getPreviousMatches(int numberOfMatches, String homeTeamName, String awayTeamName, String date, int countryId,
+			int leagueId) {
+		Map<String, String> result = new HashMap<>();
+
+		String homeTeamSql = "SELECT * FROM SoccerResults WHERE homeTeamId = (SELECT id FROM Team WHERE name = ? AND countryId = ? AND leagueId = ?) AND DATE(gameDate) < ? ORDER BY gameDate DESC limit ?";
+		String awayTeamSql = "SELECT * FROM SoccerResults WHERE awayTeamId = (SELECT id FROM Team WHERE name = ? AND countryId = ? AND leagueId = ?) AND DATE(gameDate) < ? ORDER BY gameDate DESC limit ?";
+		String combinedSql = "SELECT * FROM SoccerResults WHERE homeTeamId = (SELECT id FROM Team WHERE name = ? AND countryId = ? AND leagueId = ?) AND awayTeamId = (SELECT id FROM Team WHERE name = ? AND countryId = ? AND leagueId = ?) AND DATE(gameDate) < ? ORDER BY gameDate DESC LIMIT ?";
+		try (PreparedStatement homeTeamStat = conn.prepareStatement(homeTeamSql);
+				PreparedStatement awayTeamStat = conn.prepareStatement(awayTeamSql);
+				PreparedStatement combinedStat = conn.prepareStatement(combinedSql);) {
+
+			homeTeamStat.setString(1, homeTeamName);
+			homeTeamStat.setInt(2, countryId);
+			homeTeamStat.setInt(3, leagueId);
+			homeTeamStat.setString(4, date);
+			homeTeamStat.setInt(5, numberOfMatches);
+
+			awayTeamStat.setString(1, awayTeamName);
+			awayTeamStat.setInt(2, countryId);
+			awayTeamStat.setInt(3, leagueId);
+			awayTeamStat.setString(4, date);
+			awayTeamStat.setInt(5, numberOfMatches);
+
+			combinedStat.setString(1, homeTeamName);
+			combinedStat.setInt(2, countryId);
+			combinedStat.setInt(3, leagueId);
+			combinedStat.setString(4, awayTeamName);
+			combinedStat.setInt(5, countryId);
+			combinedStat.setInt(6, leagueId);
+			combinedStat.setString(7, date);
+			combinedStat.setInt(8, numberOfMatches);
+
+			ResultSet homeTeamRs = homeTeamStat.executeQuery();
+			ResultSet awayTeamRs = awayTeamStat.executeQuery();
+			ResultSet combinedTeamRs = combinedStat.executeQuery();
+
+			String homeTeamMeets = "";
+			while (homeTeamRs.next()) {
+				homeTeamMeets += homeTeamRs.getInt("homeScore") + "-" + homeTeamRs.getInt("awayScore") + ", ";
+			}
+			String awayTeamMeets = "";
+			while (awayTeamRs.next()) {
+				awayTeamMeets += awayTeamRs.getInt("homeScore") + "-" + awayTeamRs.getInt("awayScore") + ", ";
+			}
+			String combinedMeets = "";
+			while (combinedTeamRs.next()) {
+				combinedMeets += combinedTeamRs.getInt("homeScore") + "-" + combinedTeamRs.getInt("awayScore") + ", ";
+			}
+			if (homeTeamMeets.length() > 2) {
+				result.put("PrevHomeTeam", homeTeamMeets.substring(0, homeTeamMeets.length() - 2));
+			} else {
+				result.put("PrevHomeTeam", homeTeamMeets);
+			}
+			if (awayTeamMeets.length() > 2) {
+				result.put("PrevAwayTeam", awayTeamMeets.substring(0, awayTeamMeets.length() - 2));
+			} else {
+				result.put("PrevAwayTeam", awayTeamMeets);
+			}
+			if (combinedMeets.length() > 2) {
+				result.put("PrevCombined", combinedMeets.substring(0, combinedMeets.length() - 2));
+			} else {
+				result.put("PrevCombined", combinedMeets);
+			}
+
+		} catch (SQLException e) {
+			e.printStackTrace();
+		}
+
+		return result;
+	}
 }

+ 1 - 1
OddsJavaFx/src/fxml/OddsFxBuilder.fxml

@@ -16,7 +16,7 @@
 <?import javafx.scene.layout.StackPane?>
 <?import javafx.scene.text.Font?>
 
-<StackPane prefHeight="800.0" prefWidth="1600.0" xmlns="http://javafx.com/javafx/15.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="controllers.MainController">
+<StackPane prefHeight="800.0" prefWidth="1600.0" xmlns="http://javafx.com/javafx/18" xmlns:fx="http://javafx.com/fxml/1" fx:controller="controllers.MainController">
    <children>
       <BorderPane prefHeight="600.0" prefWidth="1200.0">
          <top>

+ 32 - 3
OddsJavaFx/src/fxml/PastResults.fxml

@@ -1,14 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
+<?import javafx.geometry.Insets?>
+<?import javafx.scene.control.Button?>
 <?import javafx.scene.control.ComboBox?>
 <?import javafx.scene.control.DatePicker?>
 <?import javafx.scene.control.TableColumn?>
 <?import javafx.scene.control.TableView?>
 <?import javafx.scene.layout.AnchorPane?>
+<?import javafx.scene.layout.ColumnConstraints?>
 <?import javafx.scene.layout.FlowPane?>
+<?import javafx.scene.layout.GridPane?>
+<?import javafx.scene.layout.RowConstraints?>
 <?import javafx.scene.layout.VBox?>
-<?import javafx.scene.control.Button?>
-
+<?import javafx.scene.text.Text?>
 
 <AnchorPane fx:id="basePane" prefHeight="414.0" prefWidth="736.0" xmlns="http://javafx.com/javafx/18" xmlns:fx="http://javafx.com/fxml/1" fx:controller="controllers.PastResultsController">
    <children>
@@ -47,7 +51,6 @@
 				       <TableColumn fx:id="avgHomeConcededSeason" prefWidth="75.0" text="HomeConcededSeason" />
 				       <TableColumn fx:id="avgAwayScoredSeason" prefWidth="75.0" text="AwayScoredSeason" />
 				       <TableColumn fx:id="avgAwayConcededSeason" prefWidth="75.0" text="AwayConcededSeason" />
-				       
 				       <TableColumn fx:id="sumScoringColumn" prefWidth="75.0" text="Sum scoring" />
 				       <TableColumn fx:id="drawColumn" prefWidth="75.0" text="Draw" />
 				       <TableColumn fx:id="awayWinColumn" prefWidth="75.0" text="Away win" />
@@ -55,6 +58,32 @@
 				   </TableView>
                </children>
             </AnchorPane>
+            <AnchorPane minHeight="100.0" minWidth="200.0" prefHeight="200.0" prefWidth="200.0">
+               <children>
+                  <GridPane prefHeight="100.0" prefWidth="736.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
+                    <columnConstraints>
+                      <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
+                      <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
+                    </columnConstraints>
+                    <rowConstraints>
+                      <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
+                      <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
+                      <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
+                    </rowConstraints>
+                     <children>
+                        <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Past results homeTeam" />
+                        <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Past results awayTeam" GridPane.rowIndex="1" />
+                        <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Past meeting results" GridPane.rowIndex="2" />
+                        <Text fx:id="homeTeamPastResultsText" strokeType="OUTSIDE" strokeWidth="0.0" text="Placeholder homeTeam" GridPane.columnIndex="1" />
+                        <Text fx:id="awayTeamPastResultsText" strokeType="OUTSIDE" strokeWidth="0.0" text="Placeholder awayTeam" GridPane.columnIndex="1" GridPane.rowIndex="1" />
+                        <Text fx:id="previousMeetingsText" strokeType="OUTSIDE" strokeWidth="0.0" text="Placeholder meets" GridPane.columnIndex="1" GridPane.rowIndex="2" />
+                     </children>
+                     <opaqueInsets>
+                        <Insets />
+                     </opaqueInsets>
+                  </GridPane>
+               </children>
+            </AnchorPane>
          </children>
       </VBox>
    </children>

+ 30 - 3
OddsJavaFx/src/objects/BetDTO.java

@@ -1,5 +1,7 @@
 package objects;
 
+import data.GuiMysql;
+
 public class BetDTO {
 	int betSeries;
 	String match;
@@ -12,6 +14,9 @@ public class BetDTO {
 	int gameId;
 	String gameDate;
 	float winAmount;
+	int countryId;
+	int leagueId;
+	private String leagueName;
 
 	public BetDTO(int betSeries, String match, String betType, float bet, float odds, String result) {
 		super();
@@ -122,10 +127,32 @@ public class BetDTO {
 		this.winAmount = winAmount;
 	}
 
+	public int getCountryId() {
+		return countryId;
+	}
+
+	public void setCountryId(int countryId) {
+		this.countryId = countryId;
+	}
+
+	public int getLeagueId() {
+		return leagueId;
+	}
+
+	public void setLeagueId(int leagueId) {
+		this.leagueId = leagueId;
+	}
+
 	@Override public String toString() {
-		return "Series " + betSeries + " match: " + match + " betType: " + betType + " bet: " + bet + " odds: " + odds
-				+ " result: " + result + " homeTeam: " + homeTeam + " awayTeam: " + awayTeam + "gameId: " + gameId
-				+ " gameDate: " + gameDate;
+		return "Series " + betSeries + " match: " + match + " betType: " + betType + " bet: " + bet + " odds: " + odds + " result: " + result
+				+ " homeTeam: " + homeTeam + " awayTeam: " + awayTeam + "gameId: " + gameId + " gameDate: " + gameDate;
 	}
 
+	public void setLeague(String league) {
+		leagueId = GuiMysql.getInstance().getLeagueInfo(league).getLeagueId();
+	}
+
+	public String getLeagueName() {
+		return leagueName;
+	}
 }