From 70449e435ac4fab6caf1fd4231132da567e0686d Mon Sep 17 00:00:00 2001 From: sshkurov Date: Sat, 5 Feb 2022 04:03:41 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=BF=D1=82=D0=B8=D0=BC=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B?= =?UTF-8?q?=20=D1=81=20=D0=91=D0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 + .../packmate/model/FoundPattern.java | 1 + .../ru/serega6531/packmate/model/Stream.java | 11 ++++++++-- .../packmate/model/pojo/Pagination.java | 5 ++++- .../packmate/repository/StreamRepository.java | 20 +++++++++---------- .../packmate/service/StreamService.java | 20 +++++++++---------- 6 files changed, 34 insertions(+), 24 deletions(-) diff --git a/build.gradle b/build.gradle index ed300cd..01658eb 100644 --- a/build.gradle +++ b/build.gradle @@ -37,6 +37,7 @@ dependencies { implementation group: 'org.bouncycastle', name: 'bcprov-jdk15on', version: '1.69' implementation group: 'org.bouncycastle', name: 'bctls-jdk15on', version: '1.70' implementation group: 'org.modelmapper', name: 'modelmapper', version: '2.4.5' + compileOnly 'org.jetbrains:annotations:22.0.0' compileOnly 'org.projectlombok:lombok' runtimeOnly 'org.springframework.boot:spring-boot-devtools' runtimeOnly 'org.postgresql:postgresql' diff --git a/src/main/java/ru/serega6531/packmate/model/FoundPattern.java b/src/main/java/ru/serega6531/packmate/model/FoundPattern.java index fa8d477..27b4500 100644 --- a/src/main/java/ru/serega6531/packmate/model/FoundPattern.java +++ b/src/main/java/ru/serega6531/packmate/model/FoundPattern.java @@ -24,6 +24,7 @@ import java.util.Objects; @Builder @Getter @ToString +@Table(indexes = { @Index(name = "found_pattern_packet_id_index", columnList = "packet_id DESC") }) public class FoundPattern { @Id diff --git a/src/main/java/ru/serega6531/packmate/model/Stream.java b/src/main/java/ru/serega6531/packmate/model/Stream.java index f12bb2f..7ec6edf 100644 --- a/src/main/java/ru/serega6531/packmate/model/Stream.java +++ b/src/main/java/ru/serega6531/packmate/model/Stream.java @@ -1,13 +1,19 @@ package ru.serega6531.packmate.model; -import lombok.*; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import lombok.ToString; import org.hibernate.Hibernate; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Parameter; import ru.serega6531.packmate.model.enums.Protocol; import javax.persistence.*; -import java.util.*; +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; @Getter @Setter @@ -24,6 +30,7 @@ import java.util.*; @Parameter(name = "optimizer", value = "hilo") } ) +@Table(indexes = {@Index(name = "stream_id_desc_index", columnList = "id DESC")}) public class Stream { @Id diff --git a/src/main/java/ru/serega6531/packmate/model/pojo/Pagination.java b/src/main/java/ru/serega6531/packmate/model/pojo/Pagination.java index 0b2baec..30fa38d 100644 --- a/src/main/java/ru/serega6531/packmate/model/pojo/Pagination.java +++ b/src/main/java/ru/serega6531/packmate/model/pojo/Pagination.java @@ -1,6 +1,7 @@ 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; @@ -9,12 +10,14 @@ public class Pagination { private Sort.Direction direction; - private long startingFrom; + @Nullable + private Long startingFrom; private int pageSize; private boolean favorites; // только для стримов, определяет, искать только избранные стримы или все + @Nullable private Pattern pattern; // только для стримов, если не null, ищем стримы с этим паттерном } diff --git a/src/main/java/ru/serega6531/packmate/repository/StreamRepository.java b/src/main/java/ru/serega6531/packmate/repository/StreamRepository.java index 1eecf35..c971322 100644 --- a/src/main/java/ru/serega6531/packmate/repository/StreamRepository.java +++ b/src/main/java/ru/serega6531/packmate/repository/StreamRepository.java @@ -1,12 +1,11 @@ package ru.serega6531.packmate.repository; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.JpaSpecificationExecutor; -import org.springframework.data.jpa.repository.Modifying; -import org.springframework.data.jpa.repository.Query; +import org.springframework.data.jpa.repository.*; +import ru.serega6531.packmate.model.Packet; import ru.serega6531.packmate.model.Stream; -import java.util.Optional; +import javax.persistence.QueryHint; +import java.util.List; public interface StreamRepository extends JpaRepository, JpaSpecificationExecutor { @@ -16,11 +15,12 @@ public interface StreamRepository extends JpaRepository, JpaSpecif long deleteByEndTimestampBeforeAndFavoriteIsFalse(long threshold); - @Query("SELECT s FROM Stream s " + - "JOIN FETCH s.packets AS packets " + - "LEFT JOIN FETCH packets.matches " + - "WHERE s.id = :id" + @Query("SELECT DISTINCT p FROM Packet p " + + "LEFT JOIN FETCH p.matches " + + "WHERE p.stream.id = :streamId " + + "ORDER BY p.id" ) - Optional getStreamWithPackets(long id); + @QueryHints(@QueryHint(name = org.hibernate.jpa.QueryHints.HINT_PASS_DISTINCT_THROUGH, value = "false")) + List getPackets(long streamId); } diff --git a/src/main/java/ru/serega6531/packmate/service/StreamService.java b/src/main/java/ru/serega6531/packmate/service/StreamService.java index 4563f4d..752c03d 100644 --- a/src/main/java/ru/serega6531/packmate/service/StreamService.java +++ b/src/main/java/ru/serega6531/packmate/service/StreamService.java @@ -7,12 +7,10 @@ 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.http.HttpStatus; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.server.ResponseStatusException; import ru.serega6531.packmate.model.*; import ru.serega6531.packmate.model.enums.PatternActionType; import ru.serega6531.packmate.model.enums.PatternDirectionType; @@ -245,10 +243,7 @@ public class StreamService { } public List getPackets(long streamId) { - return repository.getStreamWithPackets(streamId) - .map(Stream::getPackets) - .map(packets -> packets.stream().distinct().collect(Collectors.toList())) - .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND)); + return repository.getPackets(streamId); } /** @@ -267,11 +262,14 @@ public class StreamService { public List findAll(Pagination pagination, Optional service, boolean onlyFavorites) { PageRequest page = PageRequest.of(0, pagination.getPageSize(), pagination.getDirection(), "id"); - Specification spec; - if (pagination.getDirection() == Sort.Direction.ASC) { - spec = streamIdGreaterThan(pagination.getStartingFrom()); - } else { - spec = streamIdLessThan(pagination.getStartingFrom()); + Specification spec = Specification.where(null); + + if (pagination.getStartingFrom() != null) { + if (pagination.getDirection() == Sort.Direction.ASC) { + spec = spec.and(streamIdGreaterThan(pagination.getStartingFrom())); + } else { + spec = spec.and(streamIdLessThan(pagination.getStartingFrom())); + } } if (service.isPresent()) {