From 317ceff9da28086e3d21b383df04a13e62f127e6 Mon Sep 17 00:00:00 2001 From: Ilia Egorov Date: Sun, 19 Oct 2025 13:29:50 +0300 Subject: [PATCH 1/3] fix: order reviews by useful rating --- .../filmorate/repository/review/JdbcReviewRepository.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/ru/yandex/practicum/filmorate/repository/review/JdbcReviewRepository.java b/src/main/java/ru/yandex/practicum/filmorate/repository/review/JdbcReviewRepository.java index ab66ed5..8bbb5bc 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/repository/review/JdbcReviewRepository.java +++ b/src/main/java/ru/yandex/practicum/filmorate/repository/review/JdbcReviewRepository.java @@ -78,6 +78,7 @@ public Optional findById(long id) { MapSqlParameterSource params = new MapSqlParameterSource("review_id", id); List list = jdbc.query(BASE_SELECT_REVIEW_SQL.concat(""" WHERE r.review_id = :review_id + ORDER BY useful_rating DESC """), params, mapper); return list.isEmpty() ? Optional.empty() : Optional.of(list.getFirst()); } @@ -88,6 +89,7 @@ public Collection findAllByFilm(Long filmId, long count) { .addValue("count", count); return jdbc.query(BASE_SELECT_REVIEW_SQL.concat(""" WHERE fr.film_id = COALESCE(:film_id, fr.film_id) + ORDER BY useful_rating DESC LIMIT :count """), params, mapper); } From 23efccd1093e74679c95abd603a153dc5073ee5b Mon Sep 17 00:00:00 2001 From: Ilia Egorov Date: Sun, 19 Oct 2025 14:46:24 +0300 Subject: [PATCH 2/3] fix: change group concat to subquery for correct genres mapping --- .../repository/film/JdbcFilmRepository.java | 13 +++++++++---- src/main/resources/application.properties | 2 +- 2 files changed, 10 insertions(+), 5 deletions(-) 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 31adb6a..e2aa20b 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 @@ -28,10 +28,15 @@ public class JdbcFilmRepository implements FilmRepository { f.release_date, f.duration_in_minutes, f.mpa_id, - mr.name AS mpa_name, - GROUP_CONCAT(DISTINCT CONCAT(g.genre_id, ':', g.name) ORDER BY g.genre_id SEPARATOR ';') AS genres, - GROUP_CONCAT(DISTINCT CONCAT(d.director_id, ':', d.name) - ORDER BY d.director_id SEPARATOR ';') AS directors + mr.name AS mpa_name, + (SELECT GROUP_CONCAT(DISTINCT CONCAT(g2.genre_id, ':', g2.name) ORDER BY g2.genre_id SEPARATOR ';') + FROM film_genres fg2 + JOIN genres g2 ON g2.genre_id = fg2.genre_id + WHERE fg2.film_id = f.film_id) AS genres, + (SELECT GROUP_CONCAT(DISTINCT CONCAT(d2.director_id, ':', d2.name) ORDER BY d2.director_id SEPARATOR ';') + FROM film_directors fd2 + JOIN directors d2 ON d2.director_id = fd2.director_id + WHERE fd2.film_id = f.film_id) AS directors FROM films f JOIN mpa_ratings mr ON f.mpa_id = mr.mpa_id LEFT JOIN film_genres fg ON f.film_id = fg.film_id diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index ac5b1c6..fc2688c 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -5,4 +5,4 @@ spring.sql.init.mode=ALWAYS spring.datasource.url=jdbc:h2:file:./db/filmorate spring.datasource.driverClassName=org.h2.Driver spring.datasource.username=sa -spring.datasource.password=password \ No newline at end of file +spring.datasource.password=password From 75523b9dd3d405dc74bdebbf088150dcf0815349 Mon Sep 17 00:00:00 2001 From: Ilia Egorov Date: Sun, 19 Oct 2025 14:46:51 +0300 Subject: [PATCH 3/3] fix: changed insert to do nothing when data is present --- .../practicum/filmorate/dto/film/UpdateFilmRequest.java | 7 ++----- .../filmorate/repository/like/JdbcLikesRepository.java | 6 ++++-- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/java/ru/yandex/practicum/filmorate/dto/film/UpdateFilmRequest.java b/src/main/java/ru/yandex/practicum/filmorate/dto/film/UpdateFilmRequest.java index 24ba4dd..2f7c0d7 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/dto/film/UpdateFilmRequest.java +++ b/src/main/java/ru/yandex/practicum/filmorate/dto/film/UpdateFilmRequest.java @@ -14,6 +14,7 @@ import ru.yandex.practicum.filmorate.validation.AfterDate; import java.time.LocalDate; +import java.util.ArrayList; import java.util.List; @Data @@ -30,12 +31,8 @@ public class UpdateFilmRequest { Integer duration; MPARatingDto mpa; List genres; - List directors; - @JsonSetter(nulls = Nulls.AS_EMPTY) - public void setDirectors(List directors) { - this.directors = directors; - } + List directors = new ArrayList<>(); public boolean hasName() { return name != null && !name.isEmpty(); diff --git a/src/main/java/ru/yandex/practicum/filmorate/repository/like/JdbcLikesRepository.java b/src/main/java/ru/yandex/practicum/filmorate/repository/like/JdbcLikesRepository.java index 85a9b6f..f309b94 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/repository/like/JdbcLikesRepository.java +++ b/src/main/java/ru/yandex/practicum/filmorate/repository/like/JdbcLikesRepository.java @@ -14,8 +14,10 @@ public class JdbcLikesRepository implements LikesRepository { public void addLike(long userId, long filmId) { MapSqlParameterSource params = getParameterMap(userId, filmId); String addLikeToFilmSql = """ - INSERT INTO likes (user_id, film_id) - VALUES (:user_id, :film_id)"""; + MERGE INTO likes (user_id, film_id) + KEY(user_id, film_id) + VALUES (:user_id, :film_id) + """; jdbc.update(addLikeToFilmSql, params); }