GuiMysql.java 55 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316
  1. package data;
  2. import java.math.BigDecimal;
  3. import java.math.RoundingMode;
  4. import java.sql.Connection;
  5. import java.sql.PreparedStatement;
  6. import java.sql.ResultSet;
  7. import java.sql.SQLException;
  8. import java.sql.Statement;
  9. import java.text.DecimalFormat;
  10. import java.text.SimpleDateFormat;
  11. import java.time.LocalDateTime;
  12. import java.util.AbstractMap;
  13. import java.util.AbstractMap.SimpleEntry;
  14. import java.util.ArrayList;
  15. import java.util.Date;
  16. import java.util.HashMap;
  17. import java.util.List;
  18. import java.util.Map;
  19. import org.eclipse.jetty.util.log.Log;
  20. import com.google.common.base.Strings;
  21. import com.google.common.collect.Lists;
  22. import mysql.Mysql;
  23. import objects.BetDTO;
  24. import objects.Constants;
  25. import objects.League;
  26. import objects.OverUnder;
  27. import objects.SoccerMatch;
  28. import objects.Team;
  29. import objects.TeamResults;
  30. import objects.TeamStanding;
  31. import objects.bets.Bet;
  32. import objects.bets.Bet.Status;
  33. public class GuiMysql extends Mysql {
  34. private static final String SEASON = "season";
  35. private static final String AWAY_SCORE = "awayScore";
  36. private static final String HOME_SCORE = "homeScore";
  37. private static final String COUNTRY_NAME = "countryName";
  38. private static final String DRAWS = "draws";
  39. private static final String DATE_FORMAT = "yyyy-MM-dd";
  40. private static final String AWAY_TEAM_ID = "awayTeamId";
  41. private static final String HOME_TEAM_ID = "homeTeamId";
  42. private static final String LEAGUE_NAME = "leagueName";
  43. private static final BigDecimal INCREMENT = BigDecimal.valueOf(0.2);
  44. private static final GuiMysql instance = new GuiMysql();
  45. private final Connection conn;
  46. protected GuiMysql() {
  47. super();
  48. conn = this.getConnection();
  49. }
  50. public static GuiMysql getInstance() {
  51. return instance;
  52. }
  53. public int addAnalysisBet(Bet bet) {
  54. int newId = -1;
  55. String sql = "INSERT INTO AnalysisBetTable (matchId, bet, betAmount, betOdds, status) VALUES (?,?,?,?,?)";
  56. try (PreparedStatement stat = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
  57. stat.setInt(1, bet.getMatch().getMatchId());
  58. stat.setString(2, bet.getBet());
  59. stat.setFloat(3, bet.getBetAmount());
  60. stat.setFloat(4, bet.getBetOdds());
  61. stat.setString(5, bet.getStatus().name());
  62. stat.execute();
  63. ResultSet generatedKeys = stat.getGeneratedKeys();
  64. while (generatedKeys.next()) {
  65. newId = generatedKeys.getInt(1);
  66. }
  67. } catch (SQLException e) {
  68. e.printStackTrace();
  69. }
  70. return newId;
  71. }
  72. public void addBetSeries(BetDTO bet) {
  73. String sql = "INSERT INTO ActiveBets (series, gameId, betType, bet, odds, done) VALUES (?, ?, ?, ?, ?, ?)";
  74. try (PreparedStatement stat = conn.prepareStatement(sql)) {
  75. stat.setInt(1, bet.getBetSeries());
  76. stat.setInt(2, getGameId(bet.getHomeTeam(), bet.getAwayTeam(), bet.getGameDate(), bet.getCountryId(),
  77. bet.getLeagueId()));
  78. stat.setString(3, bet.getBetType());
  79. stat.setFloat(4, bet.getBet());
  80. stat.setFloat(5, bet.getOdds());
  81. stat.setBoolean(6, false);
  82. stat.execute();
  83. } catch (SQLException e) {
  84. e.printStackTrace();
  85. }
  86. }
  87. public Bet getAnalysisBet(int betId) {
  88. Bet result = null;
  89. String sql = "SELECT * FROM AnalysisBetTable abt "
  90. + "INNER JOIN SoccerResults sr ON abt.matchId = sr.id "
  91. + "WHERE abt.id = ?";
  92. try (PreparedStatement stat = conn.prepareStatement(sql)) {
  93. stat.setInt(1, betId);
  94. ResultSet rs = stat.executeQuery();
  95. while (rs.next()) {
  96. Team homeTeam = getTeam(rs.getInt(HOME_TEAM_ID));
  97. Team awayTeam = getTeam(rs.getInt(AWAY_TEAM_ID));
  98. SoccerMatch match = new SoccerMatch(rs.getInt("matchId"), homeTeam, awayTeam, rs.getFloat("odds1"),
  99. rs.getFloat("oddsX"), rs.getFloat("odds2"), rs.getInt(HOME_SCORE), rs.getInt(AWAY_SCORE),
  100. LocalDateTime.parse(rs.getString("gameDate")), rs.getString(SEASON));
  101. match.setLeagueName(homeTeam.getTeamLeague());
  102. match.setCountryName(homeTeam.getCountryName());
  103. result = new Bet(rs.getInt("id"), match, rs.getString("bet"), rs.getFloat("betAmount"),
  104. rs.getFloat("betOdds"),
  105. Status.valueOf(rs.getString("status")), rs.getInt("coveredBetId"));
  106. }
  107. } catch (SQLException e) {
  108. e.printStackTrace();
  109. }
  110. return result;
  111. }
  112. public List<Bet> getAnalysisBets() {
  113. List<Bet> result = new ArrayList<>();
  114. String sql = "SELECT * FROM AnalysisBetTable abt "
  115. + "INNER JOIN SoccerResults sr ON abt.matchId = sr.id "
  116. + "WHERE status IN ('LOST', 'OPEN', 'COVERED')";
  117. try (PreparedStatement stat = conn.prepareStatement(sql)) {
  118. ResultSet rs = stat.executeQuery();
  119. while (rs.next()) {
  120. Team homeTeam = getTeam(rs.getInt(HOME_TEAM_ID));
  121. Team awayTeam = getTeam(rs.getInt(AWAY_TEAM_ID));
  122. SoccerMatch match = new SoccerMatch(rs.getInt("matchId"), homeTeam, awayTeam, rs.getFloat("odds1"),
  123. rs.getFloat("oddsX"), rs.getFloat("odds2"), rs.getInt(HOME_SCORE), rs.getInt(AWAY_SCORE),
  124. LocalDateTime.parse(rs.getString("gameDate")), rs.getString(SEASON));
  125. match.setLeagueName(homeTeam.getTeamLeague());
  126. match.setCountryName(homeTeam.getCountryName());
  127. result.add(new Bet(rs.getInt("id"), match, rs.getString("bet"), rs.getFloat("betAmount"),
  128. rs.getFloat("betOdds"),
  129. Status.valueOf(rs.getString("status")), rs.getInt("coveredBetId")));
  130. }
  131. } catch (SQLException e) {
  132. e.printStackTrace();
  133. }
  134. return result;
  135. }
  136. public List<Bet> getAnalysisBetStatistics() {
  137. List<Bet> result = new ArrayList<>();
  138. String sql = "SELECT sr.id as soccerMatchId, ht.id as homeTeamId, awt.id as awayTeamId, sr.odds1, sr.oddsX, sr.odds2, "
  139. + "sr.homeScore, sr.awayScore, sr.gameDate, sr.season, l.name as leagueName, abt.id as betId, abt.bet, abt.betAmount, abt.betOdds "
  140. + "FROM AnalysisBetTable abt "
  141. + "INNER JOIN SoccerResults sr ON abt.matchId = sr.id "
  142. + "INNER JOIN Team ht ON ht.id = sr.homeTeamId "
  143. + "INNER JOIN Team awt ON awt.id = sr.awayTeamId "
  144. + "INNER JOIN League l ON l.id = sr.leagueId "
  145. + "WHERE abt.status != 'OPEN'";
  146. try (PreparedStatement stat = getConnection().prepareStatement(sql)) {
  147. ResultSet rs = stat.executeQuery();
  148. while (rs.next()) {
  149. Team homeTeam = getTeam(rs.getInt(HOME_TEAM_ID));
  150. Team awayTeam = getTeam(rs.getInt(AWAY_TEAM_ID));
  151. SoccerMatch match = new SoccerMatch(rs.getInt("soccerMatchId"), homeTeam, awayTeam,
  152. rs.getFloat("odds1"), rs.getFloat("oddsX"), rs.getFloat("odds2"), rs.getInt(HOME_SCORE),
  153. rs.getInt(AWAY_SCORE), LocalDateTime.parse(rs.getString("gameDate")), rs.getString(SEASON));
  154. match.setLeagueName(rs.getString(LEAGUE_NAME));
  155. Bet bet = new Bet(rs.getInt("betId"), match, rs.getString("bet"), rs.getFloat("betAmount"),
  156. rs.getFloat("betOdds"));
  157. result.add(bet);
  158. }
  159. } catch (SQLException e) {
  160. e.printStackTrace();
  161. }
  162. return result;
  163. }
  164. public List<Float> getAvgAwayScore(int teamId) {
  165. final ArrayList<Float> returnValue = Lists.newArrayList();
  166. final String sql = "SELECT AVG(homeScore) as avgConceded, AVG(awayScore) as avgScored FROM SoccerResults WHERE awayScore != -1 AND awayTeamId = ?";
  167. try (PreparedStatement stat = conn.prepareStatement(sql)) {
  168. stat.setInt(1, teamId);
  169. final ResultSet rs = stat.executeQuery();
  170. while (rs.next()) {
  171. returnValue.add(rs.getFloat("avgScored"));
  172. returnValue.add(rs.getFloat("avgConceded"));
  173. }
  174. } catch (final SQLException e) {
  175. e.printStackTrace();
  176. }
  177. return returnValue;
  178. }
  179. public List<Float> getAvgAwayScoreThisSeason(int teamId, int countryId, int leagueId) {
  180. return getAvgAwayScoreThisSeason(teamId, countryId, leagueId, "");
  181. }
  182. public List<Float> getAvgAwayScoreThisSeason(int teamId, int countryId, int leagueId, String gameDate) {
  183. final ArrayList<Float> returnValue = Lists.newArrayList();
  184. 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";
  185. try (PreparedStatement stat = conn.prepareStatement(sql)) {
  186. stat.setInt(1, teamId);
  187. if (Strings.isNullOrEmpty(gameDate)
  188. || getSeasonFromDate(countryId, leagueId, gameDate).equals(getLastSeason(countryId, leagueId))) {
  189. stat.setString(2, getLastSeason(countryId, leagueId));
  190. } else {
  191. String seasonFromDate = getSeasonFromDate(countryId, leagueId, gameDate);
  192. stat.setString(2, seasonFromDate);
  193. }
  194. if (Strings.isNullOrEmpty(gameDate)) {
  195. stat.setString(3, new SimpleDateFormat(DATE_FORMAT).format(new Date()));
  196. } else {
  197. stat.setString(3, gameDate);
  198. }
  199. final ResultSet rs = stat.executeQuery();
  200. while (rs.next()) {
  201. returnValue.add(rs.getFloat("avgScoredSeason"));
  202. returnValue.add(rs.getFloat("avgConcededSeason"));
  203. }
  204. } catch (final SQLException e) {
  205. e.printStackTrace();
  206. }
  207. return returnValue;
  208. }
  209. public List<Float> getAvgHomeScore(int teamId) {
  210. final ArrayList<Float> returnValue = Lists.newArrayList();
  211. final String sql = "SELECT AVG(homeScore) as avgScored, AVG(awayScore) as avgConceded FROM SoccerResults WHERE homeScore != -1 AND homeTeamId = ?";
  212. try (PreparedStatement stat = conn.prepareStatement(sql)) {
  213. stat.setInt(1, teamId);
  214. final ResultSet rs = stat.executeQuery();
  215. while (rs.next()) {
  216. returnValue.add(rs.getFloat("avgScored"));
  217. returnValue.add(rs.getFloat("avgConceded"));
  218. }
  219. } catch (final SQLException e) {
  220. e.printStackTrace();
  221. }
  222. return returnValue;
  223. }
  224. public List<Float> getAvgHomeScoreThisSeason(int teamId, int countryId, int leagueId) {
  225. return getAvgHomeScoreThisSeason(teamId, countryId, leagueId, "");
  226. }
  227. public List<Float> getAvgHomeScoreThisSeason(int teamId, int countryId, int leagueId, String gameDate) {
  228. final ArrayList<Float> returnValue = Lists.newArrayList();
  229. final String sql = "SELECT AVG(homeScore) as avgScoredSeason, AVG(awayScore) as avgConcededSeason FROM SoccerResults WHERE homeScore != -1 AND homeTeamId = ? AND season = ? AND DATE(gameDate) < ? ORDER BY gameDate ASC";
  230. try (PreparedStatement stat = conn.prepareStatement(sql)) {
  231. stat.setInt(1, teamId);
  232. if (Strings.isNullOrEmpty(gameDate)
  233. || getSeasonFromDate(countryId, leagueId, gameDate).equals(getLastSeason(countryId, leagueId))) {
  234. stat.setString(2, getLastSeason(countryId, leagueId));
  235. } else {
  236. String seasonFromDate = getSeasonFromDate(countryId, leagueId, gameDate);
  237. stat.setString(2, seasonFromDate);
  238. }
  239. if (Strings.isNullOrEmpty(gameDate)) {
  240. stat.setString(3, new SimpleDateFormat(DATE_FORMAT).format(new Date()));
  241. } else {
  242. stat.setString(3, gameDate);
  243. }
  244. final ResultSet rs = stat.executeQuery();
  245. while (rs.next()) {
  246. returnValue.add(rs.getFloat("avgScoredSeason"));
  247. returnValue.add(rs.getFloat("avgConcededSeason"));
  248. }
  249. } catch (final SQLException e) {
  250. e.printStackTrace();
  251. }
  252. return returnValue;
  253. }
  254. public String getBetBaseAmount() {
  255. String sql = "SELECT value FROM Settings WHERE name = ?";
  256. String result = "";
  257. try (PreparedStatement stat = conn.prepareStatement(sql)) {
  258. stat.setString(1, "BetBaseAmount");
  259. ResultSet rs = stat.executeQuery();
  260. while (rs.next()) {
  261. result = rs.getString("value");
  262. }
  263. } catch (SQLException e) {
  264. e.printStackTrace();
  265. }
  266. return result;
  267. }
  268. public List<BetDTO> getBetSeries(boolean includeInactive) {
  269. List<BetDTO> result = new ArrayList<>();
  270. String sql = "SELECT ab.*, sr.gameDate as gameDate, sr.id as gameId, sr.homeScore as homeScore, sr.awayScore as awayScore, "
  271. + "ht.name as homeTeam, aw.name as awayTeam " + "FROM ActiveBets ab "
  272. + "INNER JOIN SoccerResults sr ON ab.gameId = sr.id "
  273. + "INNER JOIN Team ht ON sr.homeTeamId = ht.id " + "INNER JOIN Team aw ON sr.awayTeamId = aw.id "
  274. + "WHERE done = ? ORDER BY series ASC, sr.gameDate DESC";
  275. try (PreparedStatement stat = conn.prepareStatement(sql)) {
  276. stat.setBoolean(1, includeInactive);
  277. ResultSet rs = stat.executeQuery();
  278. while (rs.next()) {
  279. BetDTO dto = new BetDTO();
  280. dto.setHomeTeam(rs.getString("homeTeam"));
  281. dto.setAwayTeam(rs.getString("awayTeam"));
  282. dto.setBet(rs.getFloat("bet"));
  283. dto.setBetType(rs.getString("betType"));
  284. dto.setBetSeries(rs.getInt("series"));
  285. dto.setGameId(rs.getInt("gameId"));
  286. dto.setMatch(rs.getString("homeTeam"), rs.getString("awayTeam"));
  287. dto.setOdds(rs.getFloat("odds"));
  288. dto.setResult(rs.getInt(HOME_SCORE), rs.getInt("AwayScore"));
  289. dto.setGameDate(rs.getString("gameDate"));
  290. dto.setWinAmount(rs.getFloat("odds") * rs.getFloat("bet"));
  291. result.add(dto);
  292. }
  293. } catch (SQLException e) {
  294. e.printStackTrace();
  295. }
  296. return result;
  297. }
  298. public int getBetSeriesEndNumber() {
  299. int result = -1;
  300. String sql = "SELECT MAX(series) FROM ActiveBets";
  301. try (PreparedStatement stat = conn.prepareStatement(sql)) {
  302. ResultSet rs = stat.executeQuery();
  303. while (rs.next()) {
  304. result = rs.getInt(1);
  305. }
  306. } catch (SQLException e) {
  307. e.printStackTrace();
  308. }
  309. return result;
  310. }
  311. public List<SimpleEntry<Integer, String>> getCountries() {
  312. final ArrayList<AbstractMap.SimpleEntry<Integer, String>> countries = Lists.newArrayList();
  313. final String sql = "SELECT id, name FROM Country";
  314. try (PreparedStatement stat = conn.prepareStatement(sql)) {
  315. final ResultSet rs = stat.executeQuery();
  316. while (rs.next()) {
  317. final SimpleEntry<Integer, String> entry = new SimpleEntry<>(rs.getInt(Constants.ID),
  318. rs.getString("name"));
  319. countries.add(entry);
  320. }
  321. } catch (final SQLException e) {
  322. e.printStackTrace();
  323. }
  324. return countries;
  325. }
  326. public List<SimpleEntry<Integer, String>> getCountriesBySport(int sportId, String date) {
  327. final String sql = "SELECT * FROM Country WHERE id IN (SELECT DISTINCT(countryId) FROM SoccerResults WHERE DATE(gameDate) = ?) ORDER BY prio DESC, name ASC";
  328. final ArrayList<SimpleEntry<Integer, String>> result = new ArrayList<>();
  329. try (PreparedStatement stat = conn.prepareStatement(sql)) {
  330. if (date.equals("")) {
  331. stat.setString(1, new SimpleDateFormat(DATE_FORMAT).format(new Date()));
  332. } else {
  333. stat.setString(1, date);
  334. }
  335. final ResultSet rs = stat.executeQuery();
  336. while (rs.next()) {
  337. result.add(new SimpleEntry<>(rs.getInt(Constants.ID), rs.getString("name")));
  338. }
  339. } catch (final SQLException e) {
  340. e.printStackTrace();
  341. }
  342. return result;
  343. }
  344. public int getGameId(String homeTeam, String awayTeam, String gameDate, int countryId, int leagueId) {
  345. int result = -1;
  346. 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(?)";
  347. try (PreparedStatement stat = conn.prepareStatement(sql)) {
  348. stat.setString(1, homeTeam);
  349. stat.setInt(2, countryId);
  350. stat.setInt(3, leagueId);
  351. stat.setString(4, awayTeam);
  352. stat.setInt(5, countryId);
  353. stat.setInt(6, leagueId);
  354. stat.setString(7, gameDate);
  355. ResultSet rs = stat.executeQuery();
  356. while (rs.next()) {
  357. result = rs.getInt("id");
  358. }
  359. } catch (SQLException e) {
  360. e.printStackTrace();
  361. }
  362. return result;
  363. }
  364. public Map<Integer, Integer> getGoalAvgThisSeason(int leagueId, int countryId) {
  365. Map<Integer, Integer> returnValue = new HashMap<>();
  366. final String goalsSql = "SELECT (homeScore + awayScore) as totalGoals, count(*) as count FROM SoccerResults WHERE leagueId = ? AND countryId = ? AND season = ? GROUP BY totalGoals ORDER BY totalGoals asc";
  367. try (PreparedStatement goalStmt = conn.prepareStatement(goalsSql)) {
  368. goalStmt.setInt(1, leagueId);
  369. goalStmt.setInt(2, countryId);
  370. goalStmt.setString(3, getLastSeason(countryId, leagueId));
  371. final ResultSet goalRs = goalStmt.executeQuery();
  372. while (goalRs.next()) {
  373. int tg = goalRs.getInt("totalGoals");
  374. if (tg < 0) {
  375. continue;
  376. }
  377. int numGoals = goalRs.getInt("count");
  378. returnValue.put(tg, numGoals);
  379. }
  380. } catch (SQLException e) {
  381. e.printStackTrace();
  382. }
  383. return returnValue;
  384. }
  385. public BigDecimal getIncrement() {
  386. return INCREMENT;
  387. }
  388. public String getLastSeason(Integer countryId, Integer leagueId) {
  389. String season = "";
  390. final String sql = "SELECT season FROM SoccerResults WHERE leagueId = ? AND countryId = ? ORDER BY season DESC limit 1";
  391. try (PreparedStatement stmt = conn.prepareStatement(sql)) {
  392. stmt.setInt(1, leagueId);
  393. stmt.setInt(2, countryId);
  394. final ResultSet rs = stmt.executeQuery();
  395. while (rs.next()) {
  396. season = rs.getString(Constants.SEASON);
  397. }
  398. } catch (final SQLException e) {
  399. e.printStackTrace();
  400. }
  401. return season;
  402. }
  403. public List<Float> getLeagueAvarages(int leagueId, int countryId, String gameDate) {
  404. final ArrayList<Float> returnValue = Lists.newArrayList();
  405. final String sql = "SELECT AVG(homeScore) avgHomeScore, AVG(awayScore) as avgAwayScore"
  406. + " FROM SoccerResults WHERE leagueId = ? AND countryId = ? AND DATE(gameDate) < DATE(?)";
  407. try (PreparedStatement stat = conn.prepareStatement(sql);) {
  408. stat.setInt(1, leagueId);
  409. stat.setInt(2, countryId);
  410. stat.setString(3, gameDate);
  411. final ResultSet rs = stat.executeQuery();
  412. while (rs.next()) {
  413. returnValue.add(rs.getFloat("avgHomeScore"));
  414. returnValue.add(rs.getFloat("avgAwayScore"));
  415. }
  416. } catch (final SQLException e) {
  417. e.printStackTrace();
  418. }
  419. return returnValue;
  420. }
  421. public League getLeagueInfo(int leagueId) {
  422. final String sql = "SELECT * FROM League WHERE id = ?";
  423. League result = null;
  424. try (PreparedStatement stat = conn.prepareStatement(sql)) {
  425. stat.setInt(1, leagueId);
  426. final ResultSet rs = stat.executeQuery();
  427. while (rs.next()) {
  428. result = new League(rs.getInt(Constants.ID), rs.getString("name"), rs.getInt("scoringDiffLastGame"),
  429. rs.getInt("scoringTotal"),
  430. rs.getInt("winLossRatioHomeAndAway"), rs.getInt("winLossRatio"), rs.getInt("drawDiffHomeAway"),
  431. rs.getInt("drawDiffTotalGoals"), rs.getInt("drawWinningForm"),
  432. rs.getInt("drawWinningFormHomeAway"));
  433. }
  434. } catch (final SQLException e) {
  435. e.printStackTrace();
  436. }
  437. return result;
  438. }
  439. public League getLeagueInfo(String teamLeague) {
  440. final String sql = "SELECT * FROM League WHERE name = ?";
  441. League result = null;
  442. try (PreparedStatement stat = conn.prepareStatement(sql)) {
  443. stat.setString(1, teamLeague);
  444. final ResultSet rs = stat.executeQuery();
  445. while (rs.next()) {
  446. result = new League(rs.getInt(Constants.ID), rs.getString("name"), rs.getInt("scoringDiffLastGame"),
  447. rs.getInt("scoringTotal"),
  448. rs.getInt("winLossRatioHomeAndAway"), rs.getInt("winLossRatio"), rs.getInt("drawDiffHomeAway"),
  449. rs.getInt("drawDiffTotalGoals"), rs.getInt("drawWinningForm"),
  450. rs.getInt("drawWinngingFormHomeAway"));
  451. }
  452. } catch (final SQLException e) {
  453. e.printStackTrace();
  454. }
  455. return result;
  456. }
  457. public List<SimpleEntry<Integer, String>> getLeagues(int sportId, int countryId) {
  458. final ArrayList<AbstractMap.SimpleEntry<Integer, String>> leagues = Lists.newArrayList();
  459. final String sql = "SELECT id, name FROM League WHERE sportId = ? AND countryId = ? ORDER BY name ASC";
  460. try (PreparedStatement stat = conn.prepareStatement(sql)) {
  461. stat.setInt(1, sportId);
  462. stat.setInt(2, countryId);
  463. final ResultSet rs = stat.executeQuery();
  464. while (rs.next()) {
  465. final SimpleEntry<Integer, String> entry = new SimpleEntry<>(rs.getInt(Constants.ID),
  466. rs.getString("name"));
  467. leagues.add(entry);
  468. }
  469. } catch (final SQLException e) {
  470. e.printStackTrace();
  471. }
  472. return leagues;
  473. }
  474. public List<SimpleEntry<Integer, String>> getLeaguesByDate(int sportId, int countryId, String date) {
  475. final ArrayList<AbstractMap.SimpleEntry<Integer, String>> leagues = Lists.newArrayList();
  476. final String sql = "SELECT id, name FROM League WHERE id IN (SELECT leagueId FROM SoccerResults WHERE countryId = ? AND DATE(gameDate) = ?)";
  477. try (PreparedStatement stat = conn.prepareStatement(sql)) {
  478. stat.setInt(1, countryId);
  479. stat.setString(2, date);
  480. final ResultSet rs = stat.executeQuery();
  481. while (rs.next()) {
  482. final SimpleEntry<Integer, String> entry = new SimpleEntry<>(rs.getInt(Constants.ID),
  483. rs.getString("name"));
  484. leagues.add(entry);
  485. }
  486. } catch (final SQLException e) {
  487. e.printStackTrace();
  488. }
  489. return leagues;
  490. }
  491. public List<TeamStanding> getLeagueTable(int leagueId, String season, int countryId, String date) {
  492. final ArrayList<TeamStanding> result = Lists.newArrayList();
  493. final String sql = "SELECT teamName.name as teamName, count(*) played, "
  494. + "count(case when homeScore > awayScore then 1 end) wins, "
  495. + "count(case when awayScore> homeScore then 1 end) lost, "
  496. + "count(case when homeScore = awayScore then 1 end) draws, "
  497. + "sum(homeScore) homeScore, " + "sum(awayScore) awayScore, "
  498. + "sum(homeScore) - sum(awayScore) goal_diff, " + "sum("
  499. + "case when homeScore > awayScore then 3 else 0 end + case "
  500. + "WHEN homeScore = awayScore then 1 else 0 end) score, "
  501. + "season FROM "
  502. + "(select hometeamId team, homeScore, awayScore, season, gameDate, leagueId as league, countryId as country FROM SoccerResults "
  503. + "union all SELECT awayteamId, awayScore, homeScore, season, gameDate, leagueId as league, countryId as country FROM SoccerResults) a "
  504. + "INNER JOIN Team teamName ON team = teamName.id " + "WHERE season = ? " + "AND league = ? "
  505. + "AND country = ? "
  506. + "AND homeScore != -1 " + "AND awayScore != -1 AND DATE(gameDate) < DATE(?) group by team "
  507. + "order by score desc, goal_diff desc";
  508. try (PreparedStatement stat = conn.prepareStatement(sql)) {
  509. stat.setString(1, season);
  510. stat.setInt(2, leagueId);
  511. stat.setInt(3, countryId);
  512. stat.setString(4, date);
  513. final ResultSet rs = stat.executeQuery();
  514. while (rs.next()) {
  515. final TeamStanding ts = new TeamStanding(rs.getString("teamName"), rs.getInt("wins"), rs.getInt("lost"),
  516. rs.getInt(DRAWS),
  517. rs.getInt("score"), rs.getFloat(Constants.HOME_SCORE), rs.getFloat(Constants.AWAY_SCORE),
  518. rs.getFloat("goal_diff"));
  519. result.add(ts);
  520. }
  521. } catch (final SQLException e) {
  522. Log.getLog().info("Sql vid fel: %s", sql);
  523. e.printStackTrace();
  524. }
  525. return result;
  526. }
  527. public List<SoccerMatch> getMatches(int sportId, Integer countryId, Integer leagueId, String date, String order,
  528. boolean exactDate,
  529. boolean onlyPrio) {
  530. final ArrayList<SoccerMatch> matches = Lists.newArrayList();
  531. final String dateSql;
  532. final String orderSql = " ORDER BY gameDate " + order;
  533. if (date.equals("")) {
  534. dateSql = "DATE(gameDate) = DATE(NOW()) ";
  535. } else {
  536. if (exactDate) {
  537. dateSql = "DATE(gameDate) = '" + date + "' ";
  538. } else {
  539. dateSql = "DATE(gameDate) <= '" + date + "' ";
  540. }
  541. }
  542. final String countrySql;
  543. if (countryId != null) {
  544. countrySql = "AND res.countryId = ? ";
  545. } else {
  546. countrySql = "";
  547. }
  548. final String leagueSql;
  549. if (leagueId != null) {
  550. leagueSql = "AND res.leagueId = ? ";
  551. } else {
  552. leagueSql = "";
  553. }
  554. final String onlyPrioSql;
  555. if (onlyPrio) {
  556. onlyPrioSql = "AND l.prio = 1 ";
  557. } else {
  558. onlyPrioSql = "";
  559. }
  560. final String sql = "SELECT res.*, c.name as countryName, l.name as leagueName, "
  561. + "hTeam.name as homeTeamName, aTeam.name as awayTeamName "
  562. + "FROM SoccerResults as res "
  563. + "INNER Join Team as hTeam ON res.homeTeamId = hTeam.id AND res.leagueId = hTeam.leagueId "
  564. + "INNER Join Team as aTeam ON res.awayTeamId = aTeam.id AND res.leagueId = hTeam.leagueId "
  565. + "INNER JOIN League l ON res.leagueId = l.id "
  566. + "INNER JOIN Country c ON res.countryId = c.id "
  567. + "WHERE " + dateSql + leagueSql
  568. + countrySql + onlyPrioSql + orderSql;
  569. try (PreparedStatement stat = conn.prepareStatement(sql)) {
  570. if (leagueId != null && countryId != null) {
  571. stat.setInt(1, leagueId);
  572. stat.setInt(2, countryId);
  573. } else if (leagueId != null && countryId == null) {
  574. stat.setInt(1, leagueId);
  575. } else if (leagueId == null && countryId != null) {
  576. stat.setInt(1, countryId);
  577. }
  578. final ResultSet rs = stat.executeQuery();
  579. while (rs.next()) {
  580. final SoccerMatch sm = new SoccerMatch();
  581. final Team homeTeam = new Team();
  582. final Team awayTeam = new Team();
  583. homeTeam.setTeamId(rs.getInt(Constants.HOME_TEAM_ID));
  584. awayTeam.setTeamId(rs.getInt(Constants.AWAY_TEAM_ID));
  585. homeTeam.setTeamName(rs.getString(Constants.HOME_TEAM_NAME));
  586. awayTeam.setTeamName(rs.getString(Constants.AWAY_TEAM_NAME));
  587. homeTeam.setTeamLeagueId(rs.getInt(Constants.LEAGUE_ID));
  588. awayTeam.setTeamLeagueId(rs.getInt(Constants.LEAGUE_ID));
  589. homeTeam.setTeamLeague(rs.getString(LEAGUE_NAME));
  590. awayTeam.setTeamLeague(rs.getString(LEAGUE_NAME));
  591. homeTeam.setCountryId(rs.getInt(Constants.COUNTRY_ID));
  592. awayTeam.setCountryId(rs.getInt(Constants.COUNTRY_ID));
  593. homeTeam.setCountryName(rs.getString(COUNTRY_NAME));
  594. awayTeam.setCountryName(rs.getString(COUNTRY_NAME));
  595. sm.setLeagueName(rs.getString(LEAGUE_NAME));
  596. sm.setCountryName(rs.getString(COUNTRY_NAME));
  597. sm.setAwayScore(rs.getInt(Constants.AWAY_SCORE));
  598. sm.setHomeScore(rs.getInt(Constants.HOME_SCORE));
  599. sm.setHomeTeam(homeTeam);
  600. sm.setAwayTeam(awayTeam);
  601. sm.setMatchId(rs.getInt(Constants.ID));
  602. sm.setOdds1(rs.getFloat(Constants.ODDS_1));
  603. sm.setOddsX(rs.getFloat(Constants.ODDS_X));
  604. sm.setOdds2(rs.getFloat(Constants.ODDS_2));
  605. sm.setGameDate(LocalDateTime.parse(rs.getString(Constants.GAME_DATE)));
  606. sm.setSeason(rs.getString(Constants.SEASON));
  607. sm.setHomeTeamName(homeTeam.getTeamName());
  608. sm.setAwayTeamName(awayTeam.getTeamName());
  609. matches.add(sm);
  610. }
  611. } catch (final SQLException e) {
  612. e.printStackTrace();
  613. }
  614. return matches;
  615. }
  616. public List<SoccerMatch> getMatches(int sportId, String dateString, String sortOrder, boolean exactDate) {
  617. return getMatches(sportId, null, null, dateString, sortOrder, exactDate, true);
  618. }
  619. public boolean getParsingStarted(int countryId, int leagueId) {
  620. boolean returnValue = false;
  621. final String sql = "SELECT parsedYear FROM League WHERE id = ? AND countryId = ?";
  622. try (PreparedStatement stat = conn.prepareStatement(sql)) {
  623. stat.setInt(1, leagueId);
  624. stat.setInt(2, countryId);
  625. final ResultSet rs = stat.executeQuery();
  626. while (rs.next()) {
  627. final String parsedYear = rs.getString("parsedYear");
  628. if (!Strings.isNullOrEmpty(parsedYear)) {
  629. returnValue = true;
  630. }
  631. }
  632. } catch (final SQLException e) {
  633. e.printStackTrace();
  634. }
  635. return returnValue;
  636. }
  637. public Map<String, String> getPreviousMatches(int numberOfMatches, String homeTeamName, String awayTeamName,
  638. String date, int countryId,
  639. int leagueId) {
  640. Map<String, String> result = new HashMap<>();
  641. String homeTeamSql = "SELECT * FROM SoccerResults sr INNER JOIN Team t ON sr.homeTeamId = t.id WHERE t.name = ? AND sr.leagueId = ? AND DATE(gameDate) < ? ORDER BY gameDate DESC limit ?";
  642. String awayTeamSql = "SELECT * FROM SoccerResults sr INNER JOIN Team t ON sr.awayTeamId = t.id WHERE t.name = ? AND sr.leagueId = ? AND DATE(gameDate) < ? ORDER BY gameDate DESC limit ?";
  643. String combinedSql = "SELECT * FROM SoccerResults sr INNER JOIN Team homeTeam ON homeTeamId = homeTeam.id INNER JOIN Team awayTeam ON sr.awayTeamId = awayTeam.id WHERE homeTeam.name = ? AND awayTeam.name = ? AND sr.leagueId = ? AND DATE(gameDate) < ? ORDER BY gameDate DESC LIMIT ?";
  644. String combinedReverseSql = "SELECT * FROM SoccerResults sr INNER JOIN Team homeTeam ON homeTeamId = homeTeam.id INNER JOIN Team awayTeam ON sr.awayTeamId = awayTeam.id WHERE homeTeam.name = ? AND awayTeam.name = ? AND sr.leagueId = ? AND DATE(gameDate) < ? ORDER BY gameDate DESC LIMIT ?";
  645. try (PreparedStatement homeTeamStat = conn.prepareStatement(homeTeamSql);
  646. PreparedStatement awayTeamStat = conn.prepareStatement(awayTeamSql);
  647. PreparedStatement combinedStat = conn.prepareStatement(combinedSql);
  648. PreparedStatement combinedReversedStat = conn.prepareStatement(combinedReverseSql);) {
  649. homeTeamStat.setString(1, homeTeamName);
  650. homeTeamStat.setInt(2, leagueId);
  651. homeTeamStat.setString(3, date);
  652. homeTeamStat.setInt(4, numberOfMatches);
  653. awayTeamStat.setString(1, awayTeamName);
  654. awayTeamStat.setInt(2, leagueId);
  655. awayTeamStat.setString(3, date);
  656. awayTeamStat.setInt(4, numberOfMatches);
  657. combinedStat.setString(1, homeTeamName);
  658. combinedStat.setString(2, awayTeamName);
  659. combinedStat.setInt(3, leagueId);
  660. combinedStat.setString(4, date);
  661. combinedStat.setInt(5, numberOfMatches);
  662. combinedReversedStat.setString(1, awayTeamName);
  663. combinedReversedStat.setString(2, homeTeamName);
  664. combinedReversedStat.setInt(3, leagueId);
  665. combinedReversedStat.setString(4, date);
  666. combinedReversedStat.setInt(5, numberOfMatches);
  667. ResultSet homeTeamRs = homeTeamStat.executeQuery();
  668. ResultSet awayTeamRs = awayTeamStat.executeQuery();
  669. ResultSet combinedTeamRs = combinedStat.executeQuery();
  670. ResultSet combinedReversedTeamRs = combinedReversedStat.executeQuery();
  671. String homeTeamMeets = "";
  672. while (homeTeamRs.next()) {
  673. homeTeamMeets += homeTeamRs.getInt(HOME_SCORE) + "-" + homeTeamRs.getInt(AWAY_SCORE) + ", ";
  674. }
  675. String awayTeamMeets = "";
  676. while (awayTeamRs.next()) {
  677. awayTeamMeets += awayTeamRs.getInt(HOME_SCORE) + "-" + awayTeamRs.getInt(AWAY_SCORE) + ", ";
  678. }
  679. String combinedMeets = "";
  680. while (combinedTeamRs.next()) {
  681. combinedMeets += combinedTeamRs.getInt(HOME_SCORE) + "-" + combinedTeamRs.getInt(AWAY_SCORE) + ", ";
  682. }
  683. String combinedReversedMeets = "";
  684. while (combinedReversedTeamRs.next()) {
  685. combinedReversedMeets += combinedReversedTeamRs.getInt(HOME_SCORE) + "-"
  686. + combinedReversedTeamRs.getInt(AWAY_SCORE) + ", ";
  687. }
  688. if (homeTeamMeets.length() > 2) {
  689. result.put("PrevHomeTeam", homeTeamMeets.substring(0, homeTeamMeets.length() - 2));
  690. } else {
  691. result.put("PrevHomeTeam", homeTeamMeets);
  692. }
  693. if (awayTeamMeets.length() > 2) {
  694. result.put("PrevAwayTeam", awayTeamMeets.substring(0, awayTeamMeets.length() - 2));
  695. } else {
  696. result.put("PrevAwayTeam", awayTeamMeets);
  697. }
  698. if (combinedMeets.length() > 2) {
  699. result.put("PrevCombined", combinedMeets.substring(0, combinedMeets.length() - 2));
  700. } else {
  701. result.put("PrevCombined", combinedMeets);
  702. }
  703. if (combinedReversedMeets.length() > 2) {
  704. result.put("PrevReversedCombined",
  705. combinedReversedMeets.substring(0, combinedReversedMeets.length() - 2));
  706. } else {
  707. result.put("PrevReversedCombined", combinedReversedMeets);
  708. }
  709. } catch (SQLException e) {
  710. e.printStackTrace();
  711. }
  712. return result;
  713. }
  714. public String getSeasonFromDate(int countryId, int leagueId, String gameDate) {
  715. String sql = "SELECT season FROM SoccerResults WHERE DATE(gameDate) = ? AND countryId = ? AND leagueId = ? LIMIT 1";
  716. String returnValue = "";
  717. try (PreparedStatement stat = conn.prepareStatement(sql)) {
  718. if (Strings.isNullOrEmpty(gameDate)) {
  719. stat.setString(1, new SimpleDateFormat(DATE_FORMAT).format(new Date()));
  720. } else {
  721. stat.setString(1, gameDate);
  722. }
  723. stat.setInt(2, countryId);
  724. stat.setInt(3, leagueId);
  725. ResultSet rs = stat.executeQuery();
  726. while (rs.next()) {
  727. returnValue = rs.getString(SEASON);
  728. }
  729. } catch (SQLException e) {
  730. e.printStackTrace();
  731. }
  732. return returnValue;
  733. }
  734. public List<SimpleEntry<Integer, String>> getSports() {
  735. final ArrayList<AbstractMap.SimpleEntry<Integer, String>> sports = Lists.newArrayList();
  736. final String sql = "SELECT id, name FROM Sport";
  737. try (PreparedStatement stat = conn.prepareStatement(sql)) {
  738. final ResultSet rs = stat.executeQuery();
  739. while (rs.next()) {
  740. final SimpleEntry<Integer, String> entry = new SimpleEntry<>(rs.getInt(Constants.ID),
  741. rs.getString("name"));
  742. sports.add(entry);
  743. }
  744. } catch (final SQLException e) {
  745. e.printStackTrace();
  746. }
  747. return sports;
  748. }
  749. public List<OverUnder> getStatsOverUnder(int leagueId) {
  750. return getStatsOverUnder(leagueId, "");
  751. }
  752. public List<OverUnder> getStatsOverUnder(int leagueId, String gameDate) {
  753. final DecimalFormat df = new DecimalFormat("##.##");
  754. df.setRoundingMode(RoundingMode.HALF_DOWN);
  755. final ArrayList<OverUnder> result = Lists.newArrayList();
  756. final String sql = "SELECT ((sHome.avgScored * sAway.avgConceded) + (sAway.avgScored * sHome.avgConceded)) as diff, (homeScore + awayScore) as numGoals "
  757. + "FROM SoccerResults "
  758. + "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 "
  759. + "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 "
  760. + "WHERE homeScore != -1 AND awayScore != -1 AND leagueId = ? AND DATE(gameDate) < ? AND season = ? "
  761. + "ORDER BY diff ASC";
  762. List<String> allSeasons = getAllSeasons(leagueId);
  763. try (PreparedStatement stat = conn.prepareStatement(sql)) {
  764. final String dateString;
  765. if (Strings.isNullOrEmpty(gameDate)) {
  766. dateString = new SimpleDateFormat(DATE_FORMAT).format(new Date());
  767. } else {
  768. dateString = gameDate;
  769. }
  770. for (String season : allSeasons) {
  771. stat.setString(1, dateString);
  772. stat.setString(2, season);
  773. stat.setInt(3, leagueId);
  774. stat.setString(4, dateString);
  775. stat.setString(5, season);
  776. stat.setInt(6, leagueId);
  777. stat.setInt(7, leagueId);
  778. stat.setString(8, dateString);
  779. stat.setString(9, season);
  780. final ResultSet rs = stat.executeQuery();
  781. while (rs.next()) {
  782. final float diff = rs.getFloat("diff");
  783. final int numGoals = rs.getInt("numGoals");
  784. final Float formatted = round(BigDecimal.valueOf(diff), INCREMENT, RoundingMode.HALF_UP)
  785. .floatValue();
  786. final OverUnder entry = result.stream().filter(ou -> ou.getKey().compareTo(formatted) == 0)
  787. .findFirst()
  788. .orElse(new OverUnder(formatted));
  789. entry.addGoalStat(numGoals);
  790. result.add(entry);
  791. }
  792. }
  793. } catch (final SQLException e) {
  794. e.printStackTrace();
  795. }
  796. return result;
  797. }
  798. public List<OverUnder> getStatsOverUnderWithDrawStats(int leagueId, String gameDate) {
  799. final DecimalFormat df = new DecimalFormat("##.##");
  800. df.setRoundingMode(RoundingMode.HALF_DOWN);
  801. final ArrayList<OverUnder> result = Lists.newArrayList();
  802. final String sql = "SELECT (homeScore + awayScore) as numGoals, count(case when homeScore = awayScore then 1 end) draws, ROUND((sHome.avgScored * sAway.avgConceded) + (sAway.avgScored * sHome.avgConceded),1) roundedDiff, count(*) as numGames "
  803. + "FROM SoccerResults "
  804. + "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 leagueId = ? GROUP BY homeTeamId) as sHome ON SoccerResults.homeTeamId = sHome.homeTeamId "
  805. + "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 leagueId = ? GROUP BY awayTeamId) as sAway ON SoccerResults.awayTeamId = sAway.awayTeamId "
  806. + "WHERE homeScore != -1 AND awayScore != -1 AND leagueId = ? AND DATE(gameDate) < ? GROUP BY roundedDiff;";
  807. List<String> allSeasons = getAllSeasons(leagueId);
  808. try (PreparedStatement stat = conn.prepareStatement(sql)) {
  809. final String dateString;
  810. if (Strings.isNullOrEmpty(gameDate)) {
  811. dateString = new SimpleDateFormat(DATE_FORMAT).format(new Date());
  812. } else {
  813. dateString = gameDate;
  814. }
  815. for (String season : allSeasons) {
  816. stat.setString(1, dateString);
  817. stat.setInt(2, leagueId);
  818. stat.setString(3, dateString);
  819. stat.setInt(4, leagueId);
  820. stat.setInt(5, leagueId);
  821. stat.setString(6, dateString);
  822. final ResultSet rs = stat.executeQuery();
  823. while (rs.next()) {
  824. final float diff = rs.getFloat("roundedDiff");
  825. final int numGoals = rs.getInt("numGoals");
  826. final OverUnder entry = result.stream().filter(ou -> ou.getKey().compareTo(diff) == 0)
  827. .findFirst()
  828. .orElse(new OverUnder(diff));
  829. entry.addGoalStat(numGoals);
  830. entry.setDraws(rs.getInt(DRAWS));
  831. entry.setTotalGames(rs.getInt("numGames"));
  832. result.add(entry);
  833. }
  834. }
  835. } catch (final SQLException e) {
  836. e.printStackTrace();
  837. }
  838. return result;
  839. }
  840. public Team getTeam(int teamId) {
  841. Team result = null;
  842. String sql = "SELECT t.*, c.name as countryName, l.name AS leagueName FROM Team t "
  843. + "INNER JOIN Country c ON t.countryId = c.id "
  844. + "INNER JOIN League l ON t.leagueId = l.id "
  845. + "WHERE t.id = ? ";
  846. try (PreparedStatement stat = conn.prepareStatement(sql)) {
  847. stat.setInt(1, teamId);
  848. ResultSet rs = stat.executeQuery();
  849. while (rs.next()) {
  850. result = new Team(rs.getInt("id"), rs.getString("name"), rs.getInt("countryId"),
  851. rs.getString(COUNTRY_NAME), rs.getInt("leagueId"), rs.getString(LEAGUE_NAME));
  852. }
  853. } catch (SQLException e) {
  854. e.printStackTrace();
  855. }
  856. return result;
  857. }
  858. public TeamResults getTeamResults(int teamId, int numResults, boolean isHomeTeam) {
  859. final String sql;
  860. final TeamResults tr = new TeamResults();
  861. if (isHomeTeam) {
  862. sql = "SELECT count(case when homeScore > awayScore then 1 end) wins, "
  863. + "count(case when awayScore > homeScore then 1 end) lost, "
  864. + "count(case when homeScore = awayScore then 1 end) draws "
  865. + "FROM (SELECT * FROM SoccerResults WHERE homeTeamId = ? AND "
  866. + "HomeScore >= 0 AND awayScore >= 0 AND DATE(gameDate) < DATE(NOW()) ORDER BY gameDate DESC LIMIT ?) as t";
  867. } else {
  868. sql = "SELECT count(case when homeScore < awayScore then 1 end) wins, "
  869. + "count(case when awayScore < homeScore then 1 end) lost, "
  870. + "count(case when homeScore = awayScore then 1 end) draws "
  871. + "FROM (SELECT * FROM SoccerResults WHERE awayTeamId = ? AND "
  872. + "HomeScore >= 0 AND awayScore >= 0 AND DATE(gameDate) < DATE(NOW()) ORDER BY gameDate DESC LIMIT ?) as t";
  873. }
  874. try (PreparedStatement stat = conn.prepareStatement(sql)) {
  875. stat.setInt(1, teamId);
  876. stat.setInt(2, numResults);
  877. final ResultSet rs = stat.executeQuery();
  878. while (rs.next()) {
  879. final int draws = rs.getInt(DRAWS);
  880. final int wins = rs.getInt("wins");
  881. final int lost = rs.getInt("lost");
  882. tr.setDraws(draws);
  883. tr.setWins(wins);
  884. tr.setLosses(lost);
  885. tr.setCount(wins + draws + lost);
  886. }
  887. } catch (final SQLException e) {
  888. e.printStackTrace();
  889. }
  890. return tr;
  891. }
  892. public TeamResults getTeamResultsTest(int teamId, int numResults, boolean isHomeTeam, String date) {
  893. final String sql;
  894. final TeamResults tr = new TeamResults();
  895. if (isHomeTeam) {
  896. sql = "SELECT count(case when homeScore > awayScore then 1 end) wins, "
  897. + "count(case when awayScore > homeScore then 1 end) lost, "
  898. + "count(case when homeScore = awayScore then 1 end) draws "
  899. + "FROM (SELECT * FROM SoccerResults WHERE homeTeamId = ? AND "
  900. + "HomeScore >= 0 AND awayScore >= 0 AND DATE(gameDate) < ? ORDER BY gameDate DESC LIMIT ?) as t";
  901. } else {
  902. sql = "SELECT count(case when homeScore < awayScore then 1 end) wins, "
  903. + "count(case when awayScore < homeScore then 1 end) lost, "
  904. + "count(case when homeScore = awayScore then 1 end) draws "
  905. + "FROM (SELECT * FROM SoccerResults WHERE awayTeamId = ? AND "
  906. + "HomeScore >= 0 AND awayScore >= 0 AND DATE(gameDate) < ? ORDER BY gameDate DESC LIMIT ?) as t";
  907. }
  908. try (PreparedStatement stat = conn.prepareStatement(sql)) {
  909. stat.setInt(1, teamId);
  910. stat.setString(2, date);
  911. stat.setInt(3, numResults);
  912. final ResultSet rs = stat.executeQuery();
  913. while (rs.next()) {
  914. final int draws = rs.getInt(DRAWS);
  915. final int wins = rs.getInt("wins");
  916. final int lost = rs.getInt("lost");
  917. tr.setDraws(draws);
  918. tr.setWins(wins);
  919. tr.setLosses(lost);
  920. tr.setCount(wins + draws + lost);
  921. }
  922. } catch (final SQLException e) {
  923. e.printStackTrace();
  924. }
  925. return tr;
  926. }
  927. public List<SoccerMatch> getUpcomingMatches(String sportResultTable) {
  928. final ArrayList<SoccerMatch> matches = Lists.newArrayList();
  929. final String dateSql;
  930. dateSql = " AND DATE(gameDate) >= DATE(now())";
  931. final String sql = "SELECT res.id, homeTeamId, awayTeamId, homeScore, awayScore, overtime, odds1, oddsX, odds2, gameDate, season, res.leagueId, res.countryId, "
  932. + "hTeam.name as homeTeamName, aTeam.name as awayTeamName, " + "league.name as leagueName, "
  933. + "country.name as countryName, "
  934. + "country.prio as prio " + "FROM " + sportResultTable + " as res "
  935. + "Join Team as hTeam ON res.homeTeamId = hTeam.id "
  936. + "Join Team as aTeam ON res.awayTeamId = aTeam.id "
  937. + "Join League as league ON res.leagueId = league.id "
  938. + "Join Country as country ON res.countryId = country.id " + "WHERE homeScore = -1 " + dateSql
  939. + "AND league.name NOT LIKE '%cup%' AND league.name NOT LIKE '%group%' AND league.prio = 1 "
  940. + "ORDER BY country.prio DESC, country.name ASC";
  941. try (PreparedStatement stat = conn.prepareStatement(sql)) {
  942. final ResultSet rs = stat.executeQuery();
  943. while (rs.next()) {
  944. final SoccerMatch sm = new SoccerMatch();
  945. final Team homeTeam = new Team();
  946. final Team awayTeam = new Team();
  947. homeTeam.setTeamId(rs.getInt(Constants.HOME_TEAM_ID));
  948. awayTeam.setTeamId(rs.getInt(Constants.AWAY_TEAM_ID));
  949. homeTeam.setTeamName(rs.getString(Constants.HOME_TEAM_NAME));
  950. awayTeam.setTeamName(rs.getString(Constants.AWAY_TEAM_NAME));
  951. homeTeam.setTeamLeagueId(rs.getInt(Constants.LEAGUE_ID));
  952. awayTeam.setTeamLeagueId(rs.getInt(Constants.LEAGUE_ID));
  953. homeTeam.setTeamLeague(rs.getString(Constants.LEAGUE_NAME));
  954. awayTeam.setTeamLeague(rs.getString(Constants.LEAGUE_NAME));
  955. homeTeam.setCountryId(rs.getInt(Constants.COUNTRY_ID));
  956. awayTeam.setCountryId(rs.getInt(Constants.COUNTRY_ID));
  957. homeTeam.setCountryName(rs.getString(Constants.COUNTRY_NAME));
  958. awayTeam.setCountryName(rs.getString(Constants.COUNTRY_NAME));
  959. sm.setAwayScore(rs.getInt(Constants.AWAY_SCORE));
  960. sm.setHomeScore(rs.getInt(Constants.HOME_SCORE));
  961. sm.setHomeTeam(homeTeam);
  962. sm.setAwayTeam(awayTeam);
  963. sm.setMatchId(rs.getInt(Constants.ID));
  964. sm.setOdds1(rs.getFloat(Constants.ODDS_1));
  965. sm.setOddsX(rs.getFloat(Constants.ODDS_X));
  966. sm.setOdds2(rs.getFloat(Constants.ODDS_2));
  967. sm.setGameDate(LocalDateTime.parse(rs.getString(Constants.GAME_DATE)));
  968. sm.setCountryPrio(rs.getBoolean("prio"));
  969. matches.add(sm);
  970. }
  971. } catch (final SQLException e) {
  972. e.printStackTrace();
  973. }
  974. return matches;
  975. }
  976. public BigDecimal round(BigDecimal value, BigDecimal increment, RoundingMode roundingMode) {
  977. if (increment.signum() == 0) {
  978. // 0 increment does not make much sense, but prevent division by 0
  979. return value;
  980. } else {
  981. final BigDecimal divided = value.divide(increment, 0, roundingMode);
  982. final BigDecimal result = divided.multiply(increment);
  983. return result.setScale(2, RoundingMode.HALF_UP);
  984. }
  985. }
  986. public void setBetCovered(int id, int coveredBetId) {
  987. String sql = "UPDATE AnalysisBetTable SET coveredBetId = ? WHERE id = ?";
  988. try (PreparedStatement stat = conn.prepareStatement(sql)) {
  989. stat.setInt(1, coveredBetId);
  990. stat.setInt(2, id);
  991. stat.executeUpdate();
  992. } catch (SQLException e) {
  993. e.printStackTrace();
  994. }
  995. }
  996. public void setTeamLookbackAway(int teamId, int lookbackAway) {
  997. final String sql = "UPDATE Team SET lookbackAway = ? WHERE id = ?";
  998. try (PreparedStatement stat = conn.prepareStatement(sql)) {
  999. stat.setInt(1, lookbackAway);
  1000. stat.setInt(2, teamId);
  1001. stat.executeUpdate();
  1002. } catch (final SQLException e) {
  1003. e.printStackTrace();
  1004. }
  1005. }
  1006. public void setTeamLookbackDraw(int teamId, int lookbackDraw) {
  1007. final String sql = "UPDATE Team SET lookbackDraw = ? WHERE id = ?";
  1008. try (PreparedStatement stat = conn.prepareStatement(sql)) {
  1009. stat.setInt(1, lookbackDraw);
  1010. stat.setInt(2, teamId);
  1011. stat.executeUpdate();
  1012. } catch (final SQLException e) {
  1013. e.printStackTrace();
  1014. }
  1015. }
  1016. public void setTeamLookbackHome(int teamId, int lookbackHome) {
  1017. final String sql = "UPDATE Team SET lookbackHome = ? WHERE id = ?";
  1018. try (PreparedStatement stat = conn.prepareStatement(sql)) {
  1019. stat.setInt(1, lookbackHome);
  1020. stat.setInt(2, teamId);
  1021. stat.executeUpdate();
  1022. } catch (final SQLException e) {
  1023. e.printStackTrace();
  1024. }
  1025. }
  1026. public void setTeamMarginAway(int teamId, int marginAway) {
  1027. final String sql = "UPDATE Team SET marginAway = ? WHERE id = ?";
  1028. try (PreparedStatement stat = conn.prepareStatement(sql)) {
  1029. stat.setInt(1, marginAway);
  1030. stat.setInt(2, teamId);
  1031. stat.executeUpdate();
  1032. } catch (final SQLException e) {
  1033. e.printStackTrace();
  1034. }
  1035. }
  1036. public void setTeamMarginDraw(int teamId, int marginDraw) {
  1037. final String sql = "UPDATE Team SET marginDraw = ? WHERE id = ?";
  1038. try (PreparedStatement stat = conn.prepareStatement(sql)) {
  1039. stat.setInt(1, marginDraw);
  1040. stat.setInt(2, teamId);
  1041. stat.executeUpdate();
  1042. } catch (final SQLException e) {
  1043. e.printStackTrace();
  1044. }
  1045. }
  1046. public void setTeamMarginHome(int teamId, int marginHome) {
  1047. final String sql = "UPDATE Team SET marginHome = ? WHERE id = ?";
  1048. try (PreparedStatement stat = conn.prepareStatement(sql)) {
  1049. stat.setInt(1, marginHome);
  1050. stat.setInt(2, teamId);
  1051. stat.executeUpdate();
  1052. } catch (final SQLException e) {
  1053. e.printStackTrace();
  1054. }
  1055. }
  1056. public void updateBetBaseAmount(String value) {
  1057. String sql = "INSERT INTO Settings (name, value) VALUES (?, ?) ON DUPLICATE KEY UPDATE value = ?";
  1058. try (PreparedStatement stat = conn.prepareStatement(sql)) {
  1059. stat.setString(1, "BetBaseAmount");
  1060. stat.setString(2, value);
  1061. stat.setString(3, value);
  1062. stat.execute();
  1063. } catch (SQLException e) {
  1064. e.printStackTrace();
  1065. }
  1066. }
  1067. public void updateBetStatus(int betId, Status newStatus) {
  1068. String sql = "UPDATE AnalysisBetTable SET status = ? WHERE id = ?";
  1069. try (PreparedStatement stat = conn.prepareStatement(sql)) {
  1070. stat.setString(1, newStatus.name());
  1071. stat.setInt(2, betId);
  1072. stat.executeUpdate();
  1073. } catch (SQLException e) {
  1074. e.printStackTrace();
  1075. }
  1076. }
  1077. private List<String> getAllSeasons(int leagueId) {
  1078. List<String> returnValue = new ArrayList<>();
  1079. String sql = "SELECT distinct(season) FROM SoccerResults WHERE leagueId = ?";
  1080. try (PreparedStatement stat = conn.prepareStatement(sql)) {
  1081. stat.setInt(1, leagueId);
  1082. ResultSet rs = stat.executeQuery();
  1083. while (rs.next()) {
  1084. returnValue.add(rs.getString(SEASON));
  1085. }
  1086. } catch (SQLException e) {
  1087. e.printStackTrace();
  1088. }
  1089. return returnValue;
  1090. }
  1091. }