Horse.java 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. package database;
  2. import java.sql.PreparedStatement;
  3. import java.sql.ResultSet;
  4. import java.sql.SQLException;
  5. import com.google.common.base.Strings;
  6. import objects.ResultsDTO;
  7. public class Horse extends Database {
  8. private static Horse instance = new Horse();
  9. private Horse() {
  10. }
  11. public static Horse getInstance() {
  12. return instance;
  13. }
  14. /**
  15. *
  16. * H�mta ut kuskens id fr�n namn
  17. *
  18. * @param name - Str�ng med formatet "LastName firstName"
  19. * @return
  20. */
  21. public int getHorseIdByName(String name) {
  22. int returnValue = -1;
  23. final String sql = "SELECT id FROM Horse WHERE name = ?";
  24. try {
  25. final PreparedStatement stat = getConnection().prepareStatement(sql);
  26. stat.setString(1, name);
  27. final ResultSet rs = stat.executeQuery();
  28. while (rs.next()) {
  29. returnValue = rs.getInt("id");
  30. }
  31. } catch (final SQLException e) {
  32. e.printStackTrace();
  33. }
  34. return returnValue;
  35. }
  36. public int getHorseTravsportId(int horseId) {
  37. int returnValue = -1;
  38. final String sql = "SELECT travsportId FROM Horse WHERE id = ?";
  39. try {
  40. final PreparedStatement stat = getConnection().prepareStatement(sql);
  41. stat.setInt(1, horseId);
  42. final ResultSet rs = stat.executeQuery();
  43. while (rs.next()) {
  44. returnValue = rs.getInt("id");
  45. }
  46. } catch (final SQLException e) {
  47. e.printStackTrace();
  48. }
  49. return returnValue;
  50. }
  51. public ResultsDTO avarageTime(int horseId, String date) {
  52. return avarageTimeByDistance(horseId, 0, 0, date);
  53. }
  54. public ResultsDTO avarageTimeByDistance(int horseId, int distance, String date) {
  55. return avarageTimeByDistance(horseId, distance, 0, date);
  56. }
  57. public ResultsDTO avarageTimeWithLimit(int horseId, int raceLimit, String date) {
  58. return avarageTimeByDistance(horseId, 0, raceLimit, date);
  59. }
  60. public ResultsDTO avarageTimeByDistance(int horseId, int distance, int raceLimit, String date) {
  61. final ResultsDTO returnValue = new ResultsDTO();
  62. final String d = Strings.isNullOrEmpty(date) ? "NOW()" : date;
  63. final String sql = "SELECT ROUND(AVG(avgRes.Time), 2) as avgTime, count(*) as num FROM "
  64. + "(SELECT Time as Time FROM Results WHERE Time > 0 AND Lane > 0 AND RaceDate < ? AND HorseId = ?";
  65. final String distanceSql = " AND distance BETWEEN ? AND ?";
  66. final String limitSql = " LIMIT ?";
  67. final String endingSql = ") avgRes";
  68. final String orderSql = " ORDER BY RaceDate DESC";
  69. final StringBuilder sb = new StringBuilder();
  70. sb.append(sql);
  71. boolean orderAppended = false;
  72. if (distance > 0) {
  73. sb.append(distanceSql);
  74. sb.append(orderSql);
  75. orderAppended = true;
  76. }
  77. if (raceLimit > 0) {
  78. if (!orderAppended) {
  79. sb.append(orderSql);
  80. orderAppended = true;
  81. }
  82. sb.append(limitSql);
  83. }
  84. if (!orderAppended) {
  85. sb.append(orderSql);
  86. }
  87. sb.append(endingSql);
  88. try {
  89. final PreparedStatement stat = getConnection().prepareStatement(sb.toString());
  90. stat.setString(1, d);
  91. stat.setInt(2, horseId);
  92. if (distance > 0) {
  93. stat.setInt(3, distance - 50);
  94. stat.setInt(4, distance + 50);
  95. }
  96. if (distance > 0 && raceLimit > 0) {
  97. stat.setInt(5, raceLimit);
  98. } else if (distance <= 0 && raceLimit > 0) {
  99. stat.setInt(3, raceLimit);
  100. }
  101. final ResultSet rs = stat.executeQuery();
  102. while (rs.next()) {
  103. returnValue.setRes(rs.getFloat("avgTime"));
  104. returnValue.setCount(rs.getInt("num"));
  105. }
  106. } catch (final SQLException e) {
  107. e.printStackTrace();
  108. throw new RuntimeException(e);
  109. }
  110. return returnValue;
  111. }
  112. public ResultsDTO avaragePlacement(int horseId, String date) {
  113. return avaragePlacementByDistance(horseId, 0, 0, date);
  114. }
  115. public ResultsDTO avaragePlacementByDistance(int horseId, int distance, String date) {
  116. return avaragePlacementByDistance(horseId, distance, 0, date);
  117. }
  118. public ResultsDTO avaragePlacementWithLimit(int horseId, int raceLimit, String date) {
  119. return avaragePlacementByDistance(horseId, 0, raceLimit, date);
  120. }
  121. public ResultsDTO avaragePlacementByDistance(int horseId, int distance, int raceLimit, String date) {
  122. final ResultsDTO returnValue = new ResultsDTO();
  123. final String d = Strings.isNullOrEmpty(date) ? "NOW()" : date;
  124. final StringBuilder sb = new StringBuilder();
  125. final String sql = "SELECT ROUND(avg(" + "CASE " + "WHEN Result = -1 THEN 9 WHEN Result = -2 THEN 10 "
  126. + "WHEN Result = 0 THEN 8 ELSE Result END"
  127. + "), 2) as avgResult, count(*) as num FROM (SELECT Result FROM Results WHERE RaceDate < DATE(?) AND HorseId = ?";
  128. final String distSql = " AND distance BETWEEN ? AND ?";
  129. final String limitSql = " limit ?";
  130. final String orderBySql = " ORDER BY RaceDate DESC";
  131. sb.append(sql);
  132. boolean orderAppended = false;
  133. if (distance > 0) {
  134. sb.append(distSql);
  135. sb.append(orderBySql);
  136. orderAppended = true;
  137. }
  138. if (raceLimit > 0) {
  139. if (!orderAppended) {
  140. sb.append(orderBySql);
  141. orderAppended = true;
  142. }
  143. sb.append(limitSql);
  144. }
  145. if (!orderAppended) {
  146. sb.append(orderBySql);
  147. }
  148. sb.append(") avgRes");
  149. try {
  150. final PreparedStatement stat = getConnection().prepareStatement(sb.toString());
  151. stat.setString(1, d);
  152. stat.setInt(2, horseId);
  153. if (distance > 0) {
  154. stat.setInt(3, distance - 50);
  155. stat.setInt(4, distance + 50);
  156. }
  157. if (distance > 0 && raceLimit > 0) {
  158. stat.setInt(5, raceLimit);
  159. } else if (distance <= 0 && raceLimit > 0) {
  160. stat.setInt(3, raceLimit);
  161. }
  162. final ResultSet rs = stat.executeQuery();
  163. while (rs.next()) {
  164. returnValue.setRes(rs.getFloat("avgResult"));
  165. returnValue.setCount(rs.getInt("num"));
  166. }
  167. } catch (final SQLException e) {
  168. e.printStackTrace();
  169. System.out.println(sb.toString());
  170. }
  171. return returnValue;
  172. }
  173. public String getNameFromId(int horseId) {
  174. String result = "";
  175. String sql = "SELECT name FROM Horse WHERE id = ?";
  176. try (PreparedStatement stat = getConnection().prepareStatement(sql)) {
  177. stat.setInt(1, horseId);
  178. ResultSet rs = stat.executeQuery();
  179. while (rs.next()) {
  180. result = rs.getString("name");
  181. }
  182. } catch (SQLException e) {
  183. e.printStackTrace();
  184. }
  185. return result;
  186. }
  187. }