Skip to content

Commit 76e1f5b

Browse files
committed
fix: Изменить алгоритм рекомендаций
1 parent 07a28a7 commit 76e1f5b

File tree

3 files changed

+21
-14
lines changed

3 files changed

+21
-14
lines changed

src/main/java/ru/yandex/practicum/filmorate/dao/FilmStorage.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public interface FilmStorage extends Dao<Film> {
1313

1414
void removeLikeFromFilm(long filmId, long userId);
1515

16-
Map<Long, Set<Long>> getUsersAndFilmLikes();
16+
Map<Long, Map<Long, Integer>> getUsersAndFilmLikes();
1717

1818
Collection<Film> findFilmsByIds(Set<Long> filmIds);
1919

src/main/java/ru/yandex/practicum/filmorate/dao/impl/FilmDbStorage.java

+7-7
Original file line numberDiff line numberDiff line change
@@ -234,8 +234,8 @@ public void removeLikeFromFilm(long filmId, long userId) {
234234
}
235235

236236
@Override
237-
public Map<Long, Set<Long>> getUsersAndFilmLikes() {
238-
String filmsIdsSql = "SELECT user_id, film_id FROM film_like";
237+
public Map<Long, Map<Long, Integer>> getUsersAndFilmLikes() {
238+
String filmsIdsSql = "SELECT user_id, film_id, rating FROM film_like";
239239
return jdbcTemplate.query(filmsIdsSql, this::extractToUserIdLikedFilmsIdsMap);
240240
}
241241

@@ -398,15 +398,15 @@ private Director mapToDirector(ResultSet rs, int i) throws SQLException {
398398
.build();
399399
}
400400

401-
private Map<Long, Set<Long>> extractToUserIdLikedFilmsIdsMap(ResultSet rs) throws SQLException, DataAccessException {
402-
final Map<Long, Set<Long>> userFilmLikesMap = new HashMap<>();
401+
private Map<Long, Map<Long, Integer>> extractToUserIdLikedFilmsIdsMap(ResultSet rs) throws SQLException, DataAccessException {
402+
final Map<Long, Map<Long, Integer>> userFilmLikesMap = new HashMap<>();
403403
while (rs.next()) {
404404
final Long userId = rs.getLong("user_id");
405-
Set<Long> filmLikes = userFilmLikesMap.get(userId);
405+
Map<Long, Integer> filmLikes = userFilmLikesMap.get(userId);
406406
if (filmLikes == null) {
407-
filmLikes = new HashSet<>();
407+
filmLikes = new HashMap<>();
408408
}
409-
filmLikes.add(rs.getLong("film_id"));
409+
filmLikes.put(rs.getLong("film_id"), rs.getInt("rating"));
410410
userFilmLikesMap.put(userId, filmLikes);
411411
}
412412
return userFilmLikesMap;

src/main/java/ru/yandex/practicum/filmorate/service/impl/UserServiceImpl.java

+13-6
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import lombok.RequiredArgsConstructor;
44
import lombok.extern.slf4j.Slf4j;
55
import org.springframework.stereotype.Service;
6+
import org.springframework.transaction.annotation.Transactional;
67
import ru.yandex.practicum.filmorate.dao.*;
78
import ru.yandex.practicum.filmorate.dto.FeedDto;
89
import ru.yandex.practicum.filmorate.dto.FilmDto;
@@ -36,6 +37,7 @@ public class UserServiceImpl implements UserService {
3637
* @return пользователь с присвоенным идентификатором
3738
*/
3839
@Override
40+
@Transactional
3941
public UserDto addUser(final UserDto userDto) {
4042
final User user = UserMapper.toModel(validateUserName(userDto));
4143
final User addedUser = userStorage.add(user);
@@ -50,6 +52,7 @@ public UserDto addUser(final UserDto userDto) {
5052
* @return пользователь с обновленными данными.
5153
*/
5254
@Override
55+
@Transactional
5356
public UserDto updateUser(final UserDto updatedUserDto) {
5457
final User updatedUser = UserMapper.toModel(validateUserName(updatedUserDto));
5558
final long userId = updatedUser.getId();
@@ -91,6 +94,7 @@ public UserDto getUserById(final long userId) {
9194
* @return пользователь с обновленным списком друзей.
9295
*/
9396
@Override
97+
@Transactional
9498
public UserDto addFriend(final long userId, final long friendId) {
9599
final User user = userStorage.findById(userId);
96100
final User friend = userStorage.findById(friendId);
@@ -147,6 +151,7 @@ public Collection<UserDto> findCommonFriends(final long userId, final long other
147151
* @param friendId идентификатор друга, которого требуется исключить из списка друзей.
148152
*/
149153
@Override
154+
@Transactional
150155
public void removeFriend(final long userId, final long friendId) {
151156
userStorage.findById(userId);
152157
userStorage.findById(friendId);
@@ -179,11 +184,12 @@ public void removeUser(long userId) {
179184
public Collection<FilmDto> showRecommendations(long id) {
180185
log.info("Получение списка рекомендаций фильмов для пользователя с id {}.", id);
181186
int positiveRating = 6;
182-
Map<Long, Set<Long>> usersLikes = filmStorage.getUsersAndFilmLikes();
187+
Map<Long, Map<Long, Integer>> usersLikes = filmStorage.getUsersAndFilmLikes();
183188
Map<Long, Set<Film>> usersLikedFilms = filmStorage.findAllFilmsLikedByUsers();
184189
int maxLikes = 0;
185190
Set<Film> recommendations = new HashSet<>();
186191
Set<Film> userLikedFilms = usersLikedFilms.get(id);
192+
Map<Long, Integer> userFilmIdRating = usersLikes.get(id);
187193
for (Long userId : usersLikes.keySet()) {
188194
if (userId != id) {
189195
Set<Film> sameFilms = new HashSet<>();
@@ -196,10 +202,11 @@ public Collection<FilmDto> showRecommendations(long id) {
196202
} else {
197203
sameFilm = optionalFilm.get();
198204
}
199-
if ((film.getRating() >= positiveRating && sameFilm.getRating() >= positiveRating) ||
200-
(film.getRating() < positiveRating && sameFilm.getRating() < positiveRating)) {
205+
long filmId = sameFilm.getId();
206+
Map<Long, Integer> anotherUserFilmIdRating = usersLikes.get(userId);
207+
if ((userFilmIdRating.get(filmId) >= positiveRating && anotherUserFilmIdRating.get(filmId) >= positiveRating) ||
208+
(userFilmIdRating.get(filmId) < positiveRating && anotherUserFilmIdRating.get(filmId) < positiveRating))
201209
sameFilms.add(film);
202-
}
203210
}
204211
if (sameFilms.size() > maxLikes && sameFilms.size() < anotherUserLikedFilms.size()) {
205212
recommendations.clear();
@@ -225,12 +232,12 @@ public Collection<FilmDto> showRecommendations(long id) {
225232
}
226233

227234
/**
228-
* Выгразка ленты пользователя. Запрос выгружает историй действий пользователя:
235+
* Выгрузка ленты пользователя. Запрос выгружает историй действий пользователя:
229236
* кого он добавлял в друзья и удалял из друзей
230237
* что лайкал
231238
* какие писал и удалял отзывы
232239
*
233-
* @param id идентификатор пользоваетеля
240+
* @param id идентификатор пользователя
234241
* @return коллекция FeedDto
235242
*/
236243

0 commit comments

Comments
 (0)