From 99c5d8622f068a7d29bdebdaafa9573c9d5eedc5 Mon Sep 17 00:00:00 2001 From: serega6531 Date: Mon, 3 Feb 2020 00:55:53 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D0=BD=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../packmate/controller/StreamController.java | 13 +-- .../packmate/repository/StreamRepository.java | 41 +-------- .../packmate/service/StreamService.java | 92 +++++++------------ 3 files changed, 38 insertions(+), 108 deletions(-) diff --git a/src/main/java/ru/serega6531/packmate/controller/StreamController.java b/src/main/java/ru/serega6531/packmate/controller/StreamController.java index b72cec4..6f50ef7 100644 --- a/src/main/java/ru/serega6531/packmate/controller/StreamController.java +++ b/src/main/java/ru/serega6531/packmate/controller/StreamController.java @@ -7,6 +7,7 @@ import ru.serega6531.packmate.model.pojo.Pagination; import ru.serega6531.packmate.service.StreamService; import java.util.List; +import java.util.Optional; @RestController @RequestMapping("/api/stream/") @@ -21,20 +22,12 @@ public class StreamController { @PostMapping("/all") public List getStreams(@RequestBody Pagination pagination) { - if (pagination.isFavorites()) { - return streamService.findFavorites(pagination); - } else { - return streamService.findAll(pagination); - } + return streamService.findAll(pagination, Optional.empty(), pagination.isFavorites()); } @PostMapping("/{port}") public List getStreams(@PathVariable int port, @RequestBody Pagination pagination) { - if (pagination.isFavorites()) { - return streamService.findFavoritesByService(pagination, port); - } else { - return streamService.findAllByService(pagination, port); - } + return streamService.findAll(pagination, Optional.of(port), pagination.isFavorites()); } @PostMapping("/{id}/favorite") diff --git a/src/main/java/ru/serega6531/packmate/repository/StreamRepository.java b/src/main/java/ru/serega6531/packmate/repository/StreamRepository.java index 4530abb..53eed39 100644 --- a/src/main/java/ru/serega6531/packmate/repository/StreamRepository.java +++ b/src/main/java/ru/serega6531/packmate/repository/StreamRepository.java @@ -1,45 +1,8 @@ package ru.serega6531.packmate.repository; -import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; -import ru.serega6531.packmate.model.Pattern; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import ru.serega6531.packmate.model.Stream; -import java.util.List; - -public interface StreamRepository extends JpaRepository { - - List findAllByIdGreaterThanAndFavoriteIsTrue(long streamId, Pageable pageable); - - List findAllByIdLessThanAndFavoriteIsTrue(long streamId, Pageable pageable); - - List findAllByIdGreaterThanAndFavoriteIsTrueAndFoundPatternsContaining(long streamId, Pattern pattern, Pageable pageable); - - List findAllByIdLessThanAndFavoriteIsTrueAndFoundPatternsContaining(long streamId, Pattern pattern, Pageable pageable); - - List findAllByServiceAndIdGreaterThanAndFavoriteIsTrue(int service, long streamId, Pageable pageable); - - List findAllByServiceAndIdLessThanAndFavoriteIsTrue(int service, long streamId, Pageable pageable); - - List findAllByServiceAndIdGreaterThanAndFavoriteIsTrueAndFoundPatternsContaining(int service, long streamId, Pattern pattern, Pageable pageable); - - List findAllByServiceAndIdLessThanAndFavoriteIsTrueAndFoundPatternsContaining(int service, long streamId, Pattern pattern, Pageable pageable); - - List findAllByIdGreaterThan(long streamId, Pageable pageable); - - List findAllByIdLessThan(long streamId, Pageable pageable); - - List findAllByIdGreaterThanAndFoundPatternsContaining(long streamId, Pattern pattern, Pageable pageable); - - List findAllByIdLessThanAndFoundPatternsContaining(long streamId, Pattern pattern, Pageable pageable); - - List findAllByServiceAndIdGreaterThan(int service, long streamId, Pageable pageable); - - List findAllByServiceAndIdLessThan(int service, long streamId, Pageable pageable); - - List findAllByServiceAndIdGreaterThanAndFoundPatternsContaining(int service, long streamId, Pattern pattern, Pageable pageable); - - List findAllByServiceAndIdLessThanAndFoundPatternsContaining(int service, long streamId, Pattern pattern, Pageable pageable); - - +public interface StreamRepository extends JpaRepository, JpaSpecificationExecutor { } diff --git a/src/main/java/ru/serega6531/packmate/service/StreamService.java b/src/main/java/ru/serega6531/packmate/service/StreamService.java index 1a1811d..af134ee 100644 --- a/src/main/java/ru/serega6531/packmate/service/StreamService.java +++ b/src/main/java/ru/serega6531/packmate/service/StreamService.java @@ -8,6 +8,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; +import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import ru.serega6531.packmate.model.*; @@ -360,76 +361,49 @@ public class StreamService { return null; } - public List findFavorites(Pagination pagination) { + public List findAll(Pagination pagination, Optional service, boolean onlyFavorites) { PageRequest page = PageRequest.of(0, pagination.getPageSize(), pagination.getDirection(), "id"); - if (pagination.getPattern() != null) { // задан паттерн для поиска - if (pagination.getDirection() == Sort.Direction.ASC) { // более новые стримы - return repository.findAllByIdGreaterThanAndFavoriteIsTrueAndFoundPatternsContaining(pagination.getStartingFrom(), pagination.getPattern(), page); - } else { // более старые стримы - return repository.findAllByIdLessThanAndFavoriteIsTrueAndFoundPatternsContaining(pagination.getStartingFrom(), pagination.getPattern(), page); - } + Specification spec; + if(pagination.getDirection() == Sort.Direction.ASC) { + spec = streamIdGreaterThan(pagination.getStartingFrom()); } else { - if (pagination.getDirection() == Sort.Direction.ASC) { // более новые стримы - return repository.findAllByIdGreaterThanAndFavoriteIsTrue(pagination.getStartingFrom(), page); - } else { // более старые стримы - return repository.findAllByIdLessThanAndFavoriteIsTrue(pagination.getStartingFrom(), page); - } + spec = streamIdLessThan(pagination.getStartingFrom()); } + + if(service.isPresent()) { + spec = spec.and(streamServiceEquals(service.get())); + } + + if(onlyFavorites) { + spec = spec.and(streamIsFavorite()); + } + + if(pagination.getPattern() != null) { + spec = spec.and(streamPatternsContains(pagination.getPattern())); + } + + return repository.findAll(spec, page).getContent(); } - public List findFavoritesByService(Pagination pagination, int service) { - PageRequest page = PageRequest.of(0, pagination.getPageSize(), pagination.getDirection(), "id"); - - if (pagination.getPattern() != null) { // задан паттерн для поиска - if (pagination.getDirection() == Sort.Direction.ASC) { // более новые стримы - return repository.findAllByServiceAndIdGreaterThanAndFavoriteIsTrueAndFoundPatternsContaining(service, pagination.getStartingFrom(), pagination.getPattern(), page); - } else { // более старые стримы - return repository.findAllByServiceAndIdLessThanAndFavoriteIsTrueAndFoundPatternsContaining(service, pagination.getStartingFrom(), pagination.getPattern(), page); - } - } else { - if (pagination.getDirection() == Sort.Direction.ASC) { // более новые стримы - return repository.findAllByServiceAndIdGreaterThanAndFavoriteIsTrue(service, pagination.getStartingFrom(), page); - } else { // более старые стримы - return repository.findAllByServiceAndIdLessThanAndFavoriteIsTrue(service, pagination.getStartingFrom(), page); - } - } + private Specification streamServiceEquals(long service) { + return (root, query, cb) -> cb.equal(root.get("service"), service); } - public List findAll(Pagination pagination) { - PageRequest page = PageRequest.of(0, pagination.getPageSize(), pagination.getDirection(), "id"); - - if (pagination.getPattern() != null) { // задан паттерн для поиска - if (pagination.getDirection() == Sort.Direction.ASC) { // более новые стримы - return repository.findAllByIdGreaterThanAndFoundPatternsContaining(pagination.getStartingFrom(), pagination.getPattern(), page); - } else { // более старые стримы - return repository.findAllByIdLessThanAndFoundPatternsContaining(pagination.getStartingFrom(), pagination.getPattern(), page); - } - } else { - if (pagination.getDirection() == Sort.Direction.ASC) { // более новые стримы - return repository.findAllByIdGreaterThan(pagination.getStartingFrom(), page); - } else { // более старые стримы - return repository.findAllByIdLessThan(pagination.getStartingFrom(), page); - } - } + private Specification streamIsFavorite() { + return (root, query, cb) -> cb.equal(root.get("favorite"), true); } - public List findAllByService(Pagination pagination, int service) { - PageRequest page = PageRequest.of(0, pagination.getPageSize(), pagination.getDirection(), "id"); + private Specification streamIdGreaterThan(long id) { + return (root, query, cb) -> cb.greaterThan(root.get("id"), id); + } - if (pagination.getPattern() != null) { // задан паттерн для поиска - if (pagination.getDirection() == Sort.Direction.ASC) { // более новые стримы - return repository.findAllByServiceAndIdGreaterThanAndFoundPatternsContaining(service, pagination.getStartingFrom(), pagination.getPattern(), page); - } else { // более старые стримы - return repository.findAllByServiceAndIdLessThanAndFoundPatternsContaining(service, pagination.getStartingFrom(), pagination.getPattern(), page); - } - } else { - if (pagination.getDirection() == Sort.Direction.ASC) { // более новые стримы - return repository.findAllByServiceAndIdGreaterThan(service, pagination.getStartingFrom(), page); - } else { // более старые стримы - return repository.findAllByServiceAndIdLessThan(service, pagination.getStartingFrom(), page); - } - } + private Specification streamIdLessThan(long id) { + return (root, query, cb) -> cb.lessThan(root.get("id"), id); + } + + private Specification streamPatternsContains(Pattern pattern) { + return (root, query, cb) -> cb.isMember(pattern, root.get("foundPatterns")); } }