Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public interface FilmRepository {

Collection<Film> findFilmsOfDirector(long directorId, FilmsSortBy sortFilmsBy);

Collection<Film> findFilmRecommendations(long userId, long similarUserId);
Collection<Film> findFilmRecommendations(long userId, List<Long> similarUserIds);

Collection<Film> searchFilms(String query, List<SearchFilmsBy> searchBy);
}
Original file line number Diff line number Diff line change
Expand Up @@ -175,18 +175,19 @@ public Collection<Film> findFilmsOfDirector(long directorId, FilmsSortBy sortFil
}

@Override
public Collection<Film> findFilmRecommendations(long userId, long similarUserId) {
public Collection<Film> findFilmRecommendations(long userId, List<Long> 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(DISTINCT l.user_id) DESC
""");

MapSqlParameterSource params = new MapSqlParameterSource()
.addValue("similarUserId", similarUserId)
.addValue("similarUserIds", similarUserIds)
.addValue("userId", userId);

return jdbc.query(sqlRecommendations, params, filmRowMapper);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ WHERE u.user_id IN (SELECT user_id2
return jdbc.query(selectCommonFriendsSql, params, rowMapper);
}

public Optional<Long> findSimilarFilmTasteUser(long userId) {
public List<Long> findSimilarFilmTasteUsers(long userId) {
MapSqlParameterSource params = new MapSqlParameterSource()
.addValue("userId", userId);

Expand All @@ -128,15 +128,8 @@ public Optional<Long> 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"));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -20,5 +21,5 @@ public interface UserRepository {

Collection<User> findAllCommonFriends(long userId1, long userId2);

Optional<Long> findSimilarFilmTasteUser(long userId);
List<Long> findSimilarFilmTasteUsers(long userId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

import java.util.Collection;
import java.util.Collections;
import java.util.Optional;
import java.util.List;

@Service
@Slf4j
Expand All @@ -25,14 +25,13 @@ public Collection<FilmDto> findFilmRecommendations(long userId) {
userRepository.findById(userId)
.orElseThrow(NotFoundException.supplier("User with id %d not found", userId));

Optional<Long> similarUserOpt = userRepository.findSimilarFilmTasteUser(userId);
List<Long> 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();
Expand Down