diff --git a/db/db_init.sql b/db/db_init.sql index ad9975b..2f49630 100644 --- a/db/db_init.sql +++ b/db/db_init.sql @@ -43,7 +43,8 @@ CREATE TABLE "game_info" ( "id" SERIAL PRIMARY KEY, "time_control" varchar, "chess_com_id" varchar, - "fen" varchar + "fen" varchar, + "end_time" bigint ); diff --git a/src/main/java/app/data/entity/GameInfo.java b/src/main/java/app/data/entity/GameInfo.java index ad2ab7f..0032a16 100644 --- a/src/main/java/app/data/entity/GameInfo.java +++ b/src/main/java/app/data/entity/GameInfo.java @@ -11,6 +11,7 @@ public class GameInfo { private Game game; private String timeControl; private String fen; + private Long endTime; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -74,4 +75,14 @@ public class GameInfo { public void setGame(Game game) { this.game = game; } + + @Basic + @Column(name = "end_time") // TODO: make not nullable (you need the end times of the first matchday for that...) + public Long getEndTime() { + return endTime; + } + + public void setEndTime(Long endTime) { + this.endTime = endTime; + } } diff --git a/src/main/java/app/data/service/ChessComService.java b/src/main/java/app/data/service/ChessComService.java index 7bbfbbf..3926aae 100644 --- a/src/main/java/app/data/service/ChessComService.java +++ b/src/main/java/app/data/service/ChessComService.java @@ -14,6 +14,7 @@ import org.springframework.lang.NonNull; import org.springframework.stereotype.Service; import java.util.*; +import java.util.function.ToLongFunction; import java.util.stream.Collectors; @Service @@ -29,7 +30,7 @@ public class ChessComService { } @NonNull - public List getLatestGamesBetweenPlayers(@NonNull Match match, int minAmountOfGames, int maxAmountOfMonths) { + public List getLatestGamesBetweenPlayers(@NonNull Match match, int amountOfGames, int maxAmountOfMonths) { List games = new ArrayList<>(); for (String archiveUrl : getLatestArchiveUrls(match.getPlayer1(), maxAmountOfMonths)) { List chessComGames = getChessComGames(archiveUrl).stream() @@ -41,10 +42,14 @@ public class ChessComService { games.addAll(chessComGames.stream() .map(chessComGame -> getGame(chessComGame, match)) .collect(Collectors.toList())); - if (games.size() >= minAmountOfGames) { + if (games.size() >= amountOfGames) { break; } } + games.sort(Comparator.comparingLong(game -> game.getGameInfo().getEndTime())); + if (games.size() > amountOfGames) { + games = games.subList(games.size() - amountOfGames, games.size()); + } return games; } // TODO: find exactly two games of each time control @@ -97,6 +102,7 @@ public class ChessComService { gameInfo.setChessComId(ChessComUtils.getGameId(chessComGame)); gameInfo.setTimeControl(chessComGame.getTimeControl()); gameInfo.setFen(chessComGame.getFen()); + gameInfo.setEndTime(chessComGame.getEndTime()); gameInfo.setGame(game); return game;