ТЗ 12#3
Conversation
# Conflicts: # src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryMpaStorage.java
avfyodorov
left a comment
There was a problem hiding this comment.
Добрый вечер, Константин!
В целом хорошо, правда, есть ряд уточнений.
| public void addGenre(long filmId, Set<Genre> genreSet) { | ||
| try { | ||
| for (Genre genre : genreSet) { | ||
| jdbc.update("INSERT INTO genre(film_id, genre_id) VALUES(?,?)", filmId, genre.getId()); |
There was a problem hiding this comment.
В этом месте, в цикле, всё время дёргается база данных. Было бы хорошо избавиться от этих многочисленных запросов, которые сильно нагружают сервер. Хорошо было бы сохранить данные одним запросом, например, с помощью конструкции:
jdbcTemplate.batchUpdate(............
| import java.util.stream.Collectors; | ||
|
|
||
| @Repository | ||
| public class InMemoryFilmStorage extends Storage<Film> implements FilmStorage<Film> { |
There was a problem hiding this comment.
Раз уж перешли на работу с базой данных, то от этого репозитария можно избавиться.
На Ваше усмотрение.
There was a problem hiding this comment.
Убрал совсем. Думал что будет 2 реализации или в памяти или чрез бд.
| mpaRating.put(i, new Mpa()); | ||
| mpaRating.get(i).setId(i); | ||
| } | ||
| mpaRating.get(1L).setName("G"); |
There was a problem hiding this comment.
Нет, но в любом случае нужно брать данные непосредственно из справочника базы данных. А вдруг они изменились? Тогда придётся вносить изменения в код.
There was a problem hiding this comment.
Убрал совсем. Думал что будет 2 реализации или в памяти или чрез бд. для БД использовал MpaDbStorage в нём запрашиваются из справочника бд
| return returnAll; | ||
| return returnAll.stream() | ||
| .peek(film -> { | ||
| film.setGenres(filmStorage.getGenre(film.getId())); |
There was a problem hiding this comment.
Здесь та же история-запросы в цикле. Нужно постараться избавиться..Сократить количество запросов.
There was a problem hiding this comment.
Часть смог подправить а часть не хватило мозгов. Но я всё размышляю и пытаюсь решить. Не могу понять как массив из жанров или лайков добавить в один запрос когда из sql собирается класс film
There was a problem hiding this comment.
Насколько я понял, затруднения возникают в том случае, когда нужно в качестве параметра указать группу элементов.
Решение может быть, например, таким:
public Collection<Film> getFilms() {
String sql = """
SELECT * FROM films
LEFT OUTER JOIN mpa ON films.mpa_id = mpa.mpa_id""";
Collection<Film> films = jdbc.query(sql, filmRowMapper);
connectGenres(films);
......................
private void connectGenres(Collection<Film> films) {
String selectGenresSQL = """
SELECT * FROM film_genre AS fg
LEFT JOIN genres ON fg.genre_id = genres.genre_id
WHERE film_id IN (:film_ids)""";
List<Integer> filmIds = films.stream().map(Film::getId).toList();
MapSqlParameterSource params = new MapSqlParameterSource("film_ids", filmIds);
SqlRowSet rs = jdbc.queryForRowSet(selectGenresSQL, params);
Map<Integer, Film> filmsMap = films.stream()
.collect(Collectors.toMap(Film::getId, film -> film));
while (rs.next()) {
................................Попытайтесь, пожалуйста, реализовать. Не будет получаться, ничего страшного, подберём другой вариант. )
There was a problem hiding this comment.
Спасибо. примерно понял как сделать. Сделал, выложил обновленную версию.
| @@ -8,13 +8,12 @@ | |||
| @Repository | |||
| public class InMemoryUserStorage extends Storage<User> implements UserStorage<User> { | |||
There was a problem hiding this comment.
Действительно ли нужны эти классы? По-моему, они остались от предыдущей версии проекта, где ещё не было работы с базой данных. Если так, то лучше совсем удалить их, они больше не нужны
There was a problem hiding this comment.
Убрал совсем. Думал что будет 2 реализации или в памяти или чрез бд.
# Conflicts: # src/main/java/ru/yandex/practicum/filmorate/service/FilmService.java
avfyodorov
left a comment
There was a problem hiding this comment.
Добрый вечер, Константин!
Отметил момент, который можно было бы поправить, но, думаю, что Вы справитесь и вне ревью. 🙂
Работа принята.
Оставил комментарий.
No description provided.