Π Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ:
- ΡΠΎΠ·Π΄Π°Π½ΠΈΡ/ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ/ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ
- ΡΠΎΠ·Π΄Π°Π½ΠΈΡ/ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ/ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΡΠΈΠ»ΡΠΌΠ°
- ΡΠΎΠ·Π΄Π°Π½ΠΈΡ/ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ/ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΡΠ΅ΠΆΠΈΡΡΠ΅ΡΠ°
- ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΈΠ»ΡΠΌΠ° ΠΏΠΎ ID
- ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΏΠΈΡΠΊΠ° Π²ΡΠ΅Ρ ΡΠΎΠ·Π΄Π°Π½Π½ΡΡ ΡΠΈΠ»ΡΠΌΠΎΠ²
- ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΠΎ ID
- ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΏΠΈΡΠΊΠ° Π²ΡΠ΅Ρ ΡΠΎΠ·Π΄Π°Π½Π½ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ
- Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΡΠΈΠ»ΡΠΌΡ Π»Π°ΠΉΠΊΠΎΠ² ΠΎΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ
- Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ Π΄ΡΡΠ³ Π΄ΡΡΠ³Ρ Π² Π΄ΡΡΠ·ΡΡ
- ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΏΠΈΡΠΊΠ° ΠΎΠ±ΡΠΈΡ Π΄ΡΡΠ·Π΅ΠΉ Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ
- ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΏΠΈΡΠΊΠ° ΠΎΠ±ΡΠΈΡ ΡΠΈΠ»ΡΠΌΠΎΠ² Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΎΡΠ΅Π½ΠΎΠΊ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈ Π΄ΡΡΠ·Π΅ΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ
- Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΠΎΡΠ·ΡΠ²ΠΎΠ² ΠΊ ΡΠΈΠ»ΡΠΌΡ
- ΠΏΠΎΠΈΡΠΊΠ° ΡΠΈΠ»ΡΠΌΠΎΠ² ΠΏΠΎ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠΌΡ ΡΠ»ΠΎΠ²Ρ ΠΈΠ»ΠΈ ΠΏΠΎ ΡΠ°ΡΡΠΈ ΡΠ»ΠΎΠ²Π°
- ΠΏΠΎΠΊΠ°Π·Π°ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π»Π΅Π½ΡΡ ΡΠΎΠ±ΡΡΠΈΠΉ
- ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΠΉ ΠΏΠΎ ΡΠΈΠ»ΡΠΌΡ
- ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ°ΠΌΡΡ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΡ ΡΠΈΠ»ΡΠΌΠΎΠ² ΠΏΠΎ Π³ΠΎΠ΄Π°ΠΌ ΠΈ ΠΏΠΎ ΠΆΠ°Π½ΡΠ°ΠΌ
Π ΡΠΎΡΡΠ°Π² ΠΌΠΎΠ΄Π΅Π»ΠΈ ΡΠΈΠ»ΡΠΌΠ° Π²Ρ ΠΎΠ΄ΠΈΡ:
- ΠΠ°Π·Π²Π°Π½ΠΈΠ΅ ΡΠΈΠ»ΡΠΌΠ°
- ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΠΈΠ»ΡΠΌΠ°
- ΠΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΡΠΈΠ»ΡΠΌΠ°
- ΠΠ°ΡΡ Π²ΡΡ ΠΎΠ΄Π° ΡΠΈΠ»ΡΠΌΠ°
- ΠΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π»Π°ΠΉΠΊΠΎΠ² ΠΎΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ
- ΠΠ°Π½Ρ ΡΠΈΠ»ΡΠΌΠ°
- ΠΠΎΠ·ΡΠ°ΡΡΠ½ΠΎΠΉ ΡΠ΅Π½Π· ΡΠΈΠ»ΡΠΌΠ°
Π ΡΠΎΡΡΠ°Π² ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π²Ρ ΠΎΠ΄ΠΈΡ:
- ΠΠΎΠ³ΠΈΠ½ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ
- ΠΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ
- Email ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ
- ΠΠ°ΡΡ ΡΠΎΠΆΠ΄Π΅Π½ΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ
- Π‘ΠΏΠΈΡΠΎΠΊ Π΄ΡΡΠ·Π΅ΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ
ΠΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Ρ ΡΠ°Π½ΡΡΡΡ Π² ΠΠ.
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π½Π°ΠΏΠΈΡΠ°Π½Π° Π½Π° Java Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ° Spring, Π±Π°Π·Π° Π΄Π°Π½Π½ΡΡ H2.
ΠΡΠΈΠΌΠ΅ΡΡ ΠΊΠΎΠ΄Π°: ΠΠΎΠΈΡΠΊ ΠΏΠΎ ΡΠΈΠ»ΡΠΌΠ° ΠΏΠΎ Π½Π°Π·Π²Π°Π½ΠΈΡ ΠΈ ΡΠ΅ΠΆΠΈΡΡΠ΅ΡΡ
public List<Film> searchFilms(String lowerQuery, String params) {
List<Film> filmList = new ArrayList<>();
String sql;
if (params.contains("title") && params.contains("director")) {
sql = "select f.FILM_ID, f.NAME, f.DESCRIPTION, " +
"f.RELEASE_DATE, f.DURATION, f.MPA_ID, m.MPA_NAME " +
"from FILMS f " +
"join MPA m on m.MPA_ID = f.MPA_ID " +
"left join FILM_DIRECTOR fd on fd.FILM_ID = f.FILM_ID " +
"left join DIRECTORS d on fd.DIRECTOR_ID = d.DIRECTOR_ID " +
"left join (select FILM_ID, count(USER_LIKED_ID) evaluate " +
"from LIKES group by FILM_ID) e on f.FILM_ID = e.FILM_ID " +
"where (lower(d.DIRECTOR_NAME) like '%' || lower(?) || '%' or lower(f.NAME) like '%' || lower(?) || '%') " +
"order by e.evaluate desc ";
filmList = jdbcTemplate.query(sql,((rs, rowNum) -> makeFilm(rs)), lowerQuery, lowerQuery);
}
else if (params.equals("director")) {
sql = "select f.FILM_ID, f.NAME, f.DESCRIPTION, " +
"f.RELEASE_DATE, f.DURATION, f.MPA_ID, m.MPA_NAME " +
"from FILMS f " +
"left join FILM_DIRECTOR fd on fd.FILM_ID = f.FILM_ID " +
"left join DIRECTORS d on fd.DIRECTOR_ID = d.DIRECTOR_ID " +
"join MPA m on m.MPA_ID = f.MPA_ID " +
"left join (select FILM_ID, count(USER_LIKED_ID) evaluate " +
"from LIKES group by FILM_ID) e on f.FILM_ID = e.FILM_ID " +
"where lower(d.DIRECTOR_NAME) like '%' || lower(?) || '%' " +
"order by e.evaluate desc";
filmList = jdbcTemplate.query(sql,((rs, rowNum) -> makeFilm(rs)), lowerQuery);
} else if (params.equals("title")) {
sql = "select f.FILM_ID, f.NAME, f.DESCRIPTION, " +
"f.RELEASE_DATE, f.DURATION, f.MPA_ID, m.MPA_NAME " +
"from FILMS f " +
"join MPA m on m.MPA_ID = f.MPA_ID " +
"left join FILM_DIRECTOR fd on fd.FILM_ID = f.FILM_ID " +
"left join (select FILM_ID, count(user_liked_id) evaluate " +
"from LIKES group by FILM_ID) e on f.FILM_ID = e.FILM_ID " +
"where lower(f.NAME) like '%' || lower(?) || '%' " +
"order by e.evaluate desc";
filmList = jdbcTemplate.query(sql,((rs, rowNum) -> makeFilm(rs)), lowerQuery);
}
return filmList;
}
ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅/ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅/ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΎΡΠ·ΡΠ²ΠΎΠ² Ρ ΡΠΈΠ»ΡΠΌΠ°
public Review createReview(Review review) {
String sql = "insert into REVIEWS (CONTENT, IS_POSITIVE, USER_ID, FILM_ID, USEFUL) values (?, ?, ?, ?, ?)";
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(connection -> {
PreparedStatement stmt = connection.prepareStatement(sql, new String[]{"REVIEW_ID"});
stmt.setString(1, review.getContent());
stmt.setBoolean(2, review.getIsPositive());
stmt.setInt(3, review.getUserId());
stmt.setInt(4, review.getFilmId());
stmt.setInt(5, review.getUseful());
return stmt;
}, keyHolder);
review.setReviewId(Objects.requireNonNull(keyHolder.getKey()).intValue());
log.debug("Π‘ΠΎΡ
ΡΠ°Π½Π΅Π½ ΠΎΡΠ·ΡΠ² ΠΎΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ {} ΠΎ ΡΠΈΠ»ΡΠΌΠ΅ {}", review.getUserId(), review.getFilmId());
return review;
}
public Review updateReview(Review review) {
String sql = "update REVIEWS set CONTENT = ?, IS_POSITIVE = ?, USEFUL = ?" +
" where REVIEW_ID = ?";
jdbcTemplate.update(sql,
review.getContent(),
review.getIsPositive(),
review.getUseful(),
review.getReviewId());
log.debug("ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ ΠΎΡΠ·ΡΠ² {} Ρ ΡΠΈΠ»ΡΠΌΠ° {} ΠΎΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ {}.", review.getReviewId(), review.getFilmId(),
review.getUserId());
return review;
}
public void deleteReview(int id) {
String sql = "delete from REVIEWS where REVIEW_ID = ?";
jdbcTemplate.update(sql, id);
log.debug("Π£Π΄Π°Π»Π΅Π½ ΠΎΡΠ·ΡΠ² {}.", id);
}
ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅/ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅/ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΡΠ΅ΠΆΠΈΡΡΠ΅ΡΠ° Ρ ΡΠΈΠ»ΡΠΌΠ°
public List<Director> findAll() {
String sql = "select DIRECTORS.* from DIRECTORS";
return jdbcTemplate.query(sql, ((rs, rowNum) -> this.createDirector(rs)));
}
public Director addDirector(Director director) {
String sql = "insert into DIRECTORS (DIRECTOR_NAME) values (?)";
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(connection -> {
PreparedStatement stmt = connection.prepareStatement(sql, new String[]{"DIRECTOR_ID"});
stmt.setString(1, director.getName());
return stmt;
}, keyHolder);
director.setId(keyHolder.getKey().intValue());
log.debug("Π‘ΠΎΡ
ΡΠ°Π½Π΅Π½ ΡΠ΅ΠΆΠΈΡΡΠ΅Ρ {}", director.getName());
return director;
}
public void updateDirector(Director director) {
String sql = "update DIRECTORS set DIRECTOR_ID = ?,DIRECTOR_NAME = ? where DIRECTOR_ID = ?";
jdbcTemplate.update(sql,
director.getId(),
director.getName(),
director.getId());
}
public void deleteDirector(Integer Id) {
String sql = "delete from DIRECTORS where DIRECTOR_ID=?";
int count = jdbcTemplate.update(sql, Id);
if (count == 0) throw new ServerException(String.format("Π Π΅ΠΆΠΈΡΡΠ΅Ρ Ρ ID=%d Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½", Id));
}
ΠΠ°ΠΏΡΠΎΡ ΡΠ°ΠΌΡΡ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΡ ΡΠΈΠ»ΡΠΌΠΎΠ² ΠΏΠΎ ΡΠ°Π·Π½ΡΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌ
public List<Film> getMostPopularFilmsByYear(int year, int limit) {
String sql = "select * from FILMS F join MPA M on F.MPA_ID = M.MPA_ID " +
"left join LIKES L ON F.FILM_ID = L.FILM_ID " +
"where YEAR(F.RELEASE_DATE) = ? " +
"group by F.FILM_ID, L.USER_LIKED_ID " +
"order by COUNT(L.USER_LIKED_ID) desc limit ?";
return jdbcTemplate.query(sql, (rs, rowNum) -> makeFilm(rs), year, limit);
}
@Override
public List<Film> getMostPopularFilmsByGenre(int genreId, int limit) {
String sql = "select * from FILMS F join MPA M on F.MPA_ID = M.MPA_ID " +
"left join LIKES L ON F.FILM_ID = L.FILM_ID " +
"left join FILM_GENRE FG ON F.FILM_ID = FG.FILM_ID " +
"where FG.GENRE_ID = ? " +
"group by F.FILM_ID, L.USER_LIKED_ID, FG.GENRE_ID " +
"order by COUNT(L.USER_LIKED_ID) desc limit ?";
return jdbcTemplate.query(sql, (rs, rowNum) -> makeFilm(rs), genreId, limit);
}
@Override
public List<Film> getMostPopularFilmsByGenreAndYear(int genreId, int year, int limit) {
String sql = "select * from FILMS F join MPA M on F.MPA_ID = M.MPA_ID " +
"left join LIKES L ON F.FILM_ID = L.FILM_ID " +
"left join FILM_GENRE FG ON F.FILM_ID = FG.FILM_ID " +
"where FG.GENRE_ID = ? AND YEAR(F.RELEASE_DATE) = ? " +
"group by F.FILM_ID, L.USER_LIKED_ID " +
"order by COUNT(L.USER_LIKED_ID) desc limit ?";
return jdbcTemplate.query(sql, (rs, rowNum) -> makeFilm(rs), genreId, year, limit);
}
ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π»Π°ΠΉΠΊΠΎΠ² Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠ»ΡΠΌΠ°, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠΎΡΠΈΡΡΠΎΠ²ΠΊΠ° ΡΠΈΠ»ΡΠΌΠΎΠ² ΠΏΠΎ ΠΊΠΎΠ»-Π²Ρ Π»Π°ΠΉΠΊΠΎΠ²
private Optional<List<Integer>> getLikesByFilm(int filmId) {
//Π€ΡΠ½ΠΊΡΠΈΡ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠ² ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΠΏΠΎ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ ΡΠΈΠ»ΡΠΌΠ° (Ρ.Π΅. ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΡ)
Function<Integer, List<Integer>> filterFuncByFilmId = (filmIdentifier) -> {
String sqlSelectLikesByFilmId = "SELECT user_liked_id FROM likes WHERE film_id = ?";
List<Integer> usersId = likeStorage.getJdbcTemplate()
.query(sqlSelectLikesByFilmId, (rs, rowNum) -> rs.getInt("user_liked_id"), filmIdentifier);
return usersId;
};
//ΠΠΎΠ»ΡΡΠΈΡΡ Π³ΡΡΠΏΠΏΡ Π»Π°ΠΉΠΊΠΎΠ², ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠ² ΡΡΠ½ΠΊΡΠΈΡ ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΠΈ
List<Integer> likes = likeStorage.sortingOrFiltering(filterFuncByFilmId, filmId);
return Optional.of(likes);
}
private List<Film> getFilmsOrderedByNumberOfLikes(HashMap<Integer, Integer> filmsIdWithNumberOfLikes) {
//Π€ΡΠ½ΠΊΡΠΈΡ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ
Function<HashMap<Integer, Integer>, List<Film>> sortingFunction = (filmIdNumberLike) -> {
return filmIdNumberLike.entrySet().stream()
.sorted(Map.Entry.<Integer, Integer>comparingByValue().reversed())
.map(Map.Entry::getKey)
.map(filmId -> filmStorage.getFilmByID(filmId).get())
.collect(Collectors.toList());
};