Оптимизация работы с БД
This commit is contained in:
@@ -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'
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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, ищем стримы с этим паттерном
|
||||
|
||||
}
|
||||
|
||||
@@ -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<Stream, Long>, JpaSpecificationExecutor<Stream> {
|
||||
|
||||
@@ -16,11 +15,12 @@ public interface StreamRepository extends JpaRepository<Stream, Long>, 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<Stream> getStreamWithPackets(long id);
|
||||
@QueryHints(@QueryHint(name = org.hibernate.jpa.QueryHints.HINT_PASS_DISTINCT_THROUGH, value = "false"))
|
||||
List<Packet> getPackets(long streamId);
|
||||
|
||||
}
|
||||
|
||||
@@ -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<Packet> 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<Stream> findAll(Pagination pagination, Optional<Integer> service, boolean onlyFavorites) {
|
||||
PageRequest page = PageRequest.of(0, pagination.getPageSize(), pagination.getDirection(), "id");
|
||||
|
||||
Specification<Stream> spec;
|
||||
Specification<Stream> spec = Specification.where(null);
|
||||
|
||||
if (pagination.getStartingFrom() != null) {
|
||||
if (pagination.getDirection() == Sort.Direction.ASC) {
|
||||
spec = streamIdGreaterThan(pagination.getStartingFrom());
|
||||
spec = spec.and(streamIdGreaterThan(pagination.getStartingFrom()));
|
||||
} else {
|
||||
spec = streamIdLessThan(pagination.getStartingFrom());
|
||||
spec = spec.and(streamIdLessThan(pagination.getStartingFrom()));
|
||||
}
|
||||
}
|
||||
|
||||
if (service.isPresent()) {
|
||||
|
||||
Reference in New Issue
Block a user