From e72b6d0e0f7d3b88de7ea68791b4acefac058bab Mon Sep 17 00:00:00 2001 From: Egor Ilyin Date: Mon, 20 Oct 2025 20:26:40 +0300 Subject: [PATCH 1/2] fix film recommendations after review --- .../filmorate/repository/film/FilmRepository.java | 2 +- .../repository/film/JdbcFilmRepository.java | 7 ++++--- .../repository/user/JdbcUserRepository.java | 13 +++---------- .../filmorate/repository/user/UserRepository.java | 3 ++- .../recommendation/RecommendationServiceImpl.java | 9 ++++----- 5 files changed, 14 insertions(+), 20 deletions(-) diff --git a/src/main/java/ru/yandex/practicum/filmorate/repository/film/FilmRepository.java b/src/main/java/ru/yandex/practicum/filmorate/repository/film/FilmRepository.java index 159e292..32949af 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/repository/film/FilmRepository.java +++ b/src/main/java/ru/yandex/practicum/filmorate/repository/film/FilmRepository.java @@ -25,7 +25,7 @@ public interface FilmRepository { Collection findFilmsOfDirector(long directorId, FilmsSortBy sortFilmsBy); - Collection findFilmRecommendations(long userId, long similarUserId); + Collection findFilmRecommendations(long userId, List similarUserIds); Collection searchFilms(String query, List searchBy); } diff --git a/src/main/java/ru/yandex/practicum/filmorate/repository/film/JdbcFilmRepository.java b/src/main/java/ru/yandex/practicum/filmorate/repository/film/JdbcFilmRepository.java index e2aa20b..2488379 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/repository/film/JdbcFilmRepository.java +++ b/src/main/java/ru/yandex/practicum/filmorate/repository/film/JdbcFilmRepository.java @@ -175,18 +175,19 @@ public Collection findFilmsOfDirector(long directorId, FilmsSortBy sortFil } @Override - public Collection findFilmRecommendations(long userId, long similarUserId) { + public Collection findFilmRecommendations(long userId, List similarUserIds) { String sqlRecommendations = BASE_SELECT_SQL.concat(""" LEFT JOIN likes l ON f.film_id = l.film_id - WHERE l.user_id = :similarUserId + WHERE l.user_id IN (:similarUserIds) AND f.film_id NOT IN ( SELECT film_id FROM likes WHERE user_id = :userId ) GROUP BY f.film_id + ORDER BY COUNT(l.user_id) DESC """); MapSqlParameterSource params = new MapSqlParameterSource() - .addValue("similarUserId", similarUserId) + .addValue("similarUserIds", similarUserIds) .addValue("userId", userId); return jdbc.query(sqlRecommendations, params, filmRowMapper); diff --git a/src/main/java/ru/yandex/practicum/filmorate/repository/user/JdbcUserRepository.java b/src/main/java/ru/yandex/practicum/filmorate/repository/user/JdbcUserRepository.java index 6b6ec95..79b02ee 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/repository/user/JdbcUserRepository.java +++ b/src/main/java/ru/yandex/practicum/filmorate/repository/user/JdbcUserRepository.java @@ -115,7 +115,7 @@ WHERE u.user_id IN (SELECT user_id2 return jdbc.query(selectCommonFriendsSql, params, rowMapper); } - public Optional findSimilarFilmTasteUser(long userId) { + public List findSimilarFilmTasteUsers(long userId) { MapSqlParameterSource params = new MapSqlParameterSource() .addValue("userId", userId); @@ -128,15 +128,8 @@ public Optional findSimilarFilmTasteUser(long userId) { AND l2.user_id != :userId GROUP BY l2.user_id ORDER BY common_like_count DESC - LIMIT 1"""; + LIMIT 5"""; - Long result = jdbc.query(sql, params, rs -> { - if (rs.next()) { - return rs.getObject("other_user", Long.class); - } - return null; - }); - - return Optional.ofNullable(result); + return jdbc.query(sql, params, (rs, rowNum) -> rs.getLong("other_user")); } } diff --git a/src/main/java/ru/yandex/practicum/filmorate/repository/user/UserRepository.java b/src/main/java/ru/yandex/practicum/filmorate/repository/user/UserRepository.java index 92f37c0..ed45ac7 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/repository/user/UserRepository.java +++ b/src/main/java/ru/yandex/practicum/filmorate/repository/user/UserRepository.java @@ -3,6 +3,7 @@ import ru.yandex.practicum.filmorate.model.User; import java.util.Collection; +import java.util.List; import java.util.Optional; public interface UserRepository { @@ -20,5 +21,5 @@ public interface UserRepository { Collection findAllCommonFriends(long userId1, long userId2); - Optional findSimilarFilmTasteUser(long userId); + List findSimilarFilmTasteUsers(long userId); } diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/recommendation/RecommendationServiceImpl.java b/src/main/java/ru/yandex/practicum/filmorate/service/recommendation/RecommendationServiceImpl.java index 9ad2b04..26d9c8e 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/recommendation/RecommendationServiceImpl.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/recommendation/RecommendationServiceImpl.java @@ -11,7 +11,7 @@ import java.util.Collection; import java.util.Collections; -import java.util.Optional; +import java.util.List; @Service @Slf4j @@ -25,14 +25,13 @@ public Collection findFilmRecommendations(long userId) { userRepository.findById(userId) .orElseThrow(NotFoundException.supplier("User with id %d not found", userId)); - Optional similarUserOpt = userRepository.findSimilarFilmTasteUser(userId); + List similarUsers = userRepository.findSimilarFilmTasteUsers(userId); - if (similarUserOpt.isEmpty()) { + if (similarUsers.isEmpty()) { return Collections.emptyList(); } - long similarUserId = similarUserOpt.get(); - return filmRepository.findFilmRecommendations(userId, similarUserId) + return filmRepository.findFilmRecommendations(userId, similarUsers) .stream() .map(FilmMapper::toFilmDto) .toList(); From 68d1eda9e1b1abf50ae707a0b53351b5cafcf83d Mon Sep 17 00:00:00 2001 From: Ilia Egorov Date: Mon, 20 Oct 2025 21:36:08 +0300 Subject: [PATCH 2/2] fix: count distinct likes --- .../practicum/filmorate/repository/film/JdbcFilmRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ru/yandex/practicum/filmorate/repository/film/JdbcFilmRepository.java b/src/main/java/ru/yandex/practicum/filmorate/repository/film/JdbcFilmRepository.java index 2488379..253b22a 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/repository/film/JdbcFilmRepository.java +++ b/src/main/java/ru/yandex/practicum/filmorate/repository/film/JdbcFilmRepository.java @@ -183,7 +183,7 @@ AND f.film_id NOT IN ( SELECT film_id FROM likes WHERE user_id = :userId ) GROUP BY f.film_id - ORDER BY COUNT(l.user_id) DESC + ORDER BY COUNT(DISTINCT l.user_id) DESC """); MapSqlParameterSource params = new MapSqlParameterSource()