Исправлена пагинация пакетов

This commit is contained in:
sshkurov
2022-02-06 10:50:32 +03:00
parent 56ed2f5878
commit b48e23fdc5
7 changed files with 52 additions and 42 deletions

View File

@@ -1,12 +1,10 @@
package ru.serega6531.packmate.controller; package ru.serega6531.packmate.controller;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import ru.serega6531.packmate.model.Packet; import ru.serega6531.packmate.model.Packet;
import ru.serega6531.packmate.model.pojo.PacketDto; import ru.serega6531.packmate.model.pojo.PacketDto;
import ru.serega6531.packmate.model.pojo.PacketPagination;
import ru.serega6531.packmate.service.StreamService; import ru.serega6531.packmate.service.StreamService;
import java.util.List; import java.util.List;
@@ -24,8 +22,8 @@ public class PacketController {
} }
@PostMapping("/{streamId}") @PostMapping("/{streamId}")
public List<PacketDto> getPacketsForStream(@PathVariable long streamId) { public List<PacketDto> getPacketsForStream(@PathVariable long streamId, @RequestBody PacketPagination pagination) {
List<Packet> packets = streamService.getPackets(streamId); List<Packet> packets = streamService.getPackets(streamId, pagination.getStartingFrom(), pagination.getPageSize());
return packets.stream() return packets.stream()
.map(streamService::packetToDto) .map(streamService::packetToDto)
.collect(Collectors.toList()); .collect(Collectors.toList());

View File

@@ -2,7 +2,7 @@ package ru.serega6531.packmate.controller;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import ru.serega6531.packmate.model.pojo.Pagination; import ru.serega6531.packmate.model.pojo.StreamPagination;
import ru.serega6531.packmate.model.pojo.StreamDto; import ru.serega6531.packmate.model.pojo.StreamDto;
import ru.serega6531.packmate.service.StreamService; import ru.serega6531.packmate.service.StreamService;
@@ -22,14 +22,14 @@ public class StreamController {
} }
@PostMapping("/all") @PostMapping("/all")
public List<StreamDto> getStreams(@RequestBody Pagination pagination) { public List<StreamDto> getStreams(@RequestBody StreamPagination pagination) {
return service.findAll(pagination, Optional.empty(), pagination.isFavorites()).stream() return service.findAll(pagination, Optional.empty(), pagination.isFavorites()).stream()
.map(service::streamToDto) .map(service::streamToDto)
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
@PostMapping("/{port}") @PostMapping("/{port}")
public List<StreamDto> getStreams(@PathVariable int port, @RequestBody Pagination pagination) { public List<StreamDto> getStreams(@PathVariable int port, @RequestBody StreamPagination pagination) {
return service.findAll(pagination, Optional.of(port), pagination.isFavorites()).stream() return service.findAll(pagination, Optional.of(port), pagination.isFavorites()).stream()
.map(service::streamToDto) .map(service::streamToDto)
.collect(Collectors.toList()); .collect(Collectors.toList());

View File

@@ -0,0 +1,14 @@
package ru.serega6531.packmate.model.pojo;
import lombok.Data;
import org.jetbrains.annotations.Nullable;
@Data
public class PacketPagination {
@Nullable
private Long startingFrom;
private int pageSize;
}

View File

@@ -1,23 +0,0 @@
package ru.serega6531.packmate.model.pojo;
import lombok.Data;
import org.jetbrains.annotations.Nullable;
import org.springframework.data.domain.Sort;
import ru.serega6531.packmate.model.Pattern;
@Data
public class Pagination {
private Sort.Direction direction;
@Nullable
private Long startingFrom;
private int pageSize;
private boolean favorites; // только для стримов, определяет, искать только избранные стримы или все
@Nullable
private Pattern pattern; // только для стримов, если не null, ищем стримы с этим паттерном
}

View File

@@ -0,0 +1,20 @@
package ru.serega6531.packmate.model.pojo;
import lombok.Data;
import org.jetbrains.annotations.Nullable;
import ru.serega6531.packmate.model.Pattern;
@Data
public class StreamPagination {
@Nullable
private Long startingFrom;
private int pageSize;
private boolean favorites; // определяет, искать только избранные стримы или все
@Nullable
private Pattern pattern; // если не null, ищем стримы с этим паттерном
}

View File

@@ -1,5 +1,6 @@
package ru.serega6531.packmate.repository; package ru.serega6531.packmate.repository;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.*; import org.springframework.data.jpa.repository.*;
import ru.serega6531.packmate.model.Packet; import ru.serega6531.packmate.model.Packet;
import ru.serega6531.packmate.model.Stream; import ru.serega6531.packmate.model.Stream;
@@ -18,9 +19,10 @@ public interface StreamRepository extends JpaRepository<Stream, Long>, JpaSpecif
@Query("SELECT DISTINCT p FROM Packet p " + @Query("SELECT DISTINCT p FROM Packet p " +
"LEFT JOIN FETCH p.matches " + "LEFT JOIN FETCH p.matches " +
"WHERE p.stream.id = :streamId " + "WHERE p.stream.id = :streamId " +
"AND (:startingFrom IS NULL OR p.id > :startingFrom) " +
"ORDER BY p.id" "ORDER BY p.id"
) )
@QueryHints(@QueryHint(name = org.hibernate.jpa.QueryHints.HINT_PASS_DISTINCT_THROUGH, value = "false")) @QueryHints(@QueryHint(name = org.hibernate.jpa.QueryHints.HINT_PASS_DISTINCT_THROUGH, value = "false"))
List<Packet> getPackets(long streamId); List<Packet> getPackets(long streamId, Long startingFrom, Pageable pageable);
} }

View File

@@ -1,10 +1,12 @@
package ru.serega6531.packmate.service; package ru.serega6531.packmate.service;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.Nullable;
import org.modelmapper.ModelMapper; import org.modelmapper.ModelMapper;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification; import org.springframework.data.jpa.domain.Specification;
import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Async;
@@ -242,8 +244,9 @@ public class StreamService {
return saved; return saved;
} }
public List<Packet> getPackets(long streamId) { public List<Packet> getPackets(long streamId, @Nullable Long startingFrom, int pageSize) {
return repository.getPackets(streamId); // long safeStartingFrom = startingFrom != null ? startingFrom : 0;
return repository.getPackets(streamId, startingFrom, Pageable.ofSize(pageSize));
} }
/** /**
@@ -259,18 +262,14 @@ public class StreamService {
repository.setFavorite(id, favorite); repository.setFavorite(id, favorite);
} }
public List<Stream> findAll(Pagination pagination, Optional<Integer> service, boolean onlyFavorites) { public List<Stream> findAll(StreamPagination pagination, Optional<Integer> service, boolean onlyFavorites) {
PageRequest page = PageRequest.of(0, pagination.getPageSize(), pagination.getDirection(), "id"); PageRequest page = PageRequest.of(0, pagination.getPageSize(), Sort.Direction.DESC, "id");
Specification<Stream> spec = Specification.where(null); Specification<Stream> spec = Specification.where(null);
if (pagination.getStartingFrom() != null) { if (pagination.getStartingFrom() != null) {
if (pagination.getDirection() == Sort.Direction.ASC) {
spec = spec.and(streamIdGreaterThan(pagination.getStartingFrom()));
} else {
spec = spec.and(streamIdLessThan(pagination.getStartingFrom())); spec = spec.and(streamIdLessThan(pagination.getStartingFrom()));
} }
}
if (service.isPresent()) { if (service.isPresent()) {
spec = spec.and(streamServiceEquals(service.get())); spec = spec.and(streamServiceEquals(service.get()));