From 5236ff2d1a6aba020b7cb308b526a0c5b10f6613 Mon Sep 17 00:00:00 2001 From: Egil Ballestad Date: Tue, 15 Oct 2024 12:33:35 +0200 Subject: [PATCH 01/11] add custom pagination in events --- src/main/java/no/fintlabs/EventService.java | 106 +++++++++++++++--- .../repositories/EventRepository.java | 61 ++++++++++ 2 files changed, 150 insertions(+), 17 deletions(-) diff --git a/src/main/java/no/fintlabs/EventService.java b/src/main/java/no/fintlabs/EventService.java index 92f7dd0..d6a1b7a 100644 --- a/src/main/java/no/fintlabs/EventService.java +++ b/src/main/java/no/fintlabs/EventService.java @@ -1,6 +1,7 @@ package no.fintlabs; import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; import no.fintlabs.model.Event; import no.fintlabs.model.EventDto; import no.fintlabs.model.ManualEventDto; @@ -20,6 +21,7 @@ @Service @AllArgsConstructor +@Slf4j public class EventService { private final EventRepository eventRepository; @@ -33,35 +35,49 @@ public Page findAll(Pageable pageable) { } public Page getMergedLatestEvents(Pageable pageable) { - List latestEvents = eventRepository - .findLatestEventPerSourceApplicationInstanceId(pageable).getContent(); + Page latestEventsPage = eventRepository + .findLatestEventPerSourceApplicationInstanceId(pageable); - List latestNonDeletedEvents = eventRepository - .findLatestEventNotDeletedPerSourceApplicationInstanceId(pageable).getContent(); + Page latestNonDeletedEventsPage = eventRepository + .findLatestEventNotDeletedPerSourceApplicationInstanceId(pageable); - return getEventDtos(pageable, latestNonDeletedEvents, latestEvents); + long totalLatestEvents = eventRepository.countLatestEventPerSourceApplicationInstanceId(); + long totalLatestNonDeletedEvents = eventRepository.countLatestEventNotDeletedPerSourceApplicationInstanceId(); + + long totalElements = totalLatestEvents + totalLatestNonDeletedEvents; + + List mergedEvents = mergeEvents(latestEventsPage.getContent(), latestNonDeletedEventsPage.getContent()); + + return new PageImpl<>(mergedEvents, pageable, totalElements); } public Page getMergedLatestEventsWhereSourceApplicationIdIn( List sourceApplicationIds, Pageable pageable ) { - List latestEvents = eventRepository + Page latestEventsPage = eventRepository .findLatestEventPerSourceApplicationInstanceIdAndSourceApplicationIdIn( sourceApplicationIds, pageable - ).getContent(); + ); - List latestNonDeletedEvents = eventRepository + Page latestNonDeletedEventsPage = eventRepository .findLatestEventNotDeletedPerSourceApplicationInstanceIdAndSourceApplicationIdIn( sourceApplicationIds, pageable - ).getContent(); + ); + + long totalLatestEvents = eventRepository.countLatestEventPerSourceApplicationInstanceIdAndSourceApplicationIdIn(sourceApplicationIds); + long totalLatestNonDeletedEvents = eventRepository.countLatestEventNotDeletedPerSourceApplicationInstanceIdAndSourceApplicationIdIn(sourceApplicationIds); - return getEventDtos(pageable, latestNonDeletedEvents, latestEvents); + long totalElements = totalLatestEvents + totalLatestNonDeletedEvents; + + List mergedEvents = mergeEvents(latestEventsPage.getContent(), latestNonDeletedEventsPage.getContent()); + + return new PageImpl<>(mergedEvents, pageable, totalElements); } - private PageImpl getEventDtos(Pageable pageable, List latestNonDeletedEvents, List latestEvents) { + private List mergeEvents(List latestEvents, List latestNonDeletedEvents) { Map nonDeletedEventMap = latestNonDeletedEvents.stream() .collect( Collectors.toMap( @@ -87,14 +103,70 @@ private PageImpl getEventDtos(Pageable pageable, List latestNon } } - int start = (int) pageable.getOffset(); - int end = Math.min((start + pageable.getPageSize()), mergedEvents.size()); - - List paginatedList = mergedEvents.subList(start, end); - - return new PageImpl<>(paginatedList, pageable, mergedEvents.size()); + return mergedEvents; } +// public Page getMergedLatestEventsWhereSourceApplicationIdIn( +// List sourceApplicationIds, +// Pageable pageable +// ) { +// List latestEvents = eventRepository +// .findLatestEventPerSourceApplicationInstanceIdAndSourceApplicationIdIn( +// sourceApplicationIds, +// pageable +// ).getContent(); +// +// List latestNonDeletedEvents = eventRepository +// .findLatestEventNotDeletedPerSourceApplicationInstanceIdAndSourceApplicationIdIn( +// sourceApplicationIds, +// pageable +// ).getContent(); +// +// return getEventDtos(pageable, latestNonDeletedEvents, latestEvents); +// } + +// private PageImpl getEventDtos(Pageable pageable, List latestNonDeletedEvents, List latestEvents) { +// +// log.info("Latest Events Size: " + latestEvents.size()); +// log.info("Latest Non-Deleted Events Size: " + latestNonDeletedEvents.size()); +// +// +// Map nonDeletedEventMap = latestNonDeletedEvents.stream() +// .collect( +// Collectors.toMap( +// event -> event.getInstanceFlowHeaders().getSourceApplicationInstanceId(), +// event -> event +// ) +// ); +// +// List mergedEvents = new ArrayList<>(); +// +// for (Event latestEvent : latestEvents) { +// if (INSTANCE_DELETED.equals(latestEvent.getName())) { +// Event nonDeletedEvent = nonDeletedEventMap +// .get(latestEvent.getInstanceFlowHeaders().getSourceApplicationInstanceId()); +// if (nonDeletedEvent != null) { +// EventDto updatedEventDto = EventToEventDto(nonDeletedEvent); +// updatedEventDto.setStatus(INSTANCE_DELETED); +// mergedEvents.add(updatedEventDto); +// } +// } else { +// EventDto eventDto = EventToEventDto(latestEvent); +// mergedEvents.add(eventDto); +// } +// } +// +// log.info("Merged Events Size: " + mergedEvents.size()); +// +// +// int start = (int) pageable.getOffset(); +// int end = Math.min((start + pageable.getPageSize()), mergedEvents.size()); +// +// List paginatedList = mergedEvents.subList(start, end); +// +// return new PageImpl<>(paginatedList, pageable, mergedEvents.size()); +// } + public Optional findFirstByInstanceFlowHeadersSourceApplicationIdAndInstanceFlowHeadersSourceApplicationInstanceIdAndInstanceFlowHeadersSourceApplicationIntegrationIdOrderByTimestampDesc( ManualEventDto manualEventDto ) { diff --git a/src/main/java/no/fintlabs/repositories/EventRepository.java b/src/main/java/no/fintlabs/repositories/EventRepository.java index 15ceb8d..8afd242 100644 --- a/src/main/java/no/fintlabs/repositories/EventRepository.java +++ b/src/main/java/no/fintlabs/repositories/EventRepository.java @@ -91,6 +91,67 @@ Page findLatestEventNotDeletedPerSourceApplicationInstanceIdAndSourceAppl @Param("sourceApplicationIds") List sourceApplicationIds, Pageable pageable); + @Query(value = "SELECT COUNT(e.*) " + + "FROM event AS e " + + "INNER JOIN ( " + + " SELECT source_application_instance_id, MAX(timestamp) AS timestampMax " + + " FROM event " + + " WHERE source_application_id IN :sourceApplicationIds " + + " GROUP BY source_application_instance_id " + + ") AS eMax " + + "ON e.source_application_instance_id = eMax.source_application_instance_id " + + "AND e.timestamp = eMax.timestampMax " + + "WHERE e.source_application_id IN :sourceApplicationIds", + nativeQuery = true) + long countLatestEventPerSourceApplicationInstanceIdAndSourceApplicationIdIn( + @Param("sourceApplicationIds") List sourceApplicationIds + ); + + @Query(value = "SELECT COUNT(e.*) " + + "FROM event AS e " + + "INNER JOIN ( " + + " SELECT source_application_instance_id, MAX(timestamp) AS timestampMax " + + " FROM event " + + " WHERE source_application_id IN :sourceApplicationIds " + + " AND name <> 'instance-deleted' " + + " GROUP BY source_application_instance_id " + + ") AS eMax " + + "ON e.source_application_instance_id = eMax.source_application_instance_id " + + "AND e.timestamp = eMax.timestampMax " + + "WHERE e.source_application_id IN :sourceApplicationIds " + + "AND e.name <> 'instance-deleted'", + nativeQuery = true) + long countLatestEventNotDeletedPerSourceApplicationInstanceIdAndSourceApplicationIdIn( + @Param("sourceApplicationIds") List sourceApplicationIds + ); + + @Query(value = "SELECT COUNT(e.*) " + + "FROM event AS e " + + "INNER JOIN ( " + + " SELECT source_application_instance_id, MAX(timestamp) AS timestampMax " + + " FROM event " + + " GROUP BY source_application_instance_id " + + ") AS eMax " + + "ON e.source_application_instance_id = eMax.source_application_instance_id " + + "AND e.timestamp = eMax.timestampMax", + nativeQuery = true) + long countLatestEventPerSourceApplicationInstanceId(); + + @Query(value = "SELECT COUNT(e.*) " + + "FROM event AS e " + + "INNER JOIN ( " + + " SELECT source_application_instance_id, MAX(timestamp) AS timestampMax " + + " FROM event " + + " WHERE name <> 'instance-deleted' " + + " GROUP BY source_application_instance_id " + + ") AS eMax " + + "ON e.source_application_instance_id = eMax.source_application_instance_id " + + "AND e.timestamp = eMax.timestampMax " + + "AND e.name <> 'instance-deleted'", + nativeQuery = true) + long countLatestEventNotDeletedPerSourceApplicationInstanceId(); + + Page findAllByInstanceFlowHeadersSourceApplicationIdIn( List sourceApplicationIds, Pageable pageable From 4aa584ed67c068c0f3144cd8e876b46c8802c00d Mon Sep 17 00:00:00 2001 From: Egil Ballestad Date: Tue, 15 Oct 2024 12:36:54 +0200 Subject: [PATCH 02/11] add custom pagination in events --- src/main/java/no/fintlabs/EventService.java | 63 --------------------- 1 file changed, 63 deletions(-) diff --git a/src/main/java/no/fintlabs/EventService.java b/src/main/java/no/fintlabs/EventService.java index d6a1b7a..2fc2b00 100644 --- a/src/main/java/no/fintlabs/EventService.java +++ b/src/main/java/no/fintlabs/EventService.java @@ -1,7 +1,6 @@ package no.fintlabs; import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; import no.fintlabs.model.Event; import no.fintlabs.model.EventDto; import no.fintlabs.model.ManualEventDto; @@ -21,7 +20,6 @@ @Service @AllArgsConstructor -@Slf4j public class EventService { private final EventRepository eventRepository; @@ -106,67 +104,6 @@ private List mergeEvents(List latestEvents, List latestN return mergedEvents; } -// public Page getMergedLatestEventsWhereSourceApplicationIdIn( -// List sourceApplicationIds, -// Pageable pageable -// ) { -// List latestEvents = eventRepository -// .findLatestEventPerSourceApplicationInstanceIdAndSourceApplicationIdIn( -// sourceApplicationIds, -// pageable -// ).getContent(); -// -// List latestNonDeletedEvents = eventRepository -// .findLatestEventNotDeletedPerSourceApplicationInstanceIdAndSourceApplicationIdIn( -// sourceApplicationIds, -// pageable -// ).getContent(); -// -// return getEventDtos(pageable, latestNonDeletedEvents, latestEvents); -// } - -// private PageImpl getEventDtos(Pageable pageable, List latestNonDeletedEvents, List latestEvents) { -// -// log.info("Latest Events Size: " + latestEvents.size()); -// log.info("Latest Non-Deleted Events Size: " + latestNonDeletedEvents.size()); -// -// -// Map nonDeletedEventMap = latestNonDeletedEvents.stream() -// .collect( -// Collectors.toMap( -// event -> event.getInstanceFlowHeaders().getSourceApplicationInstanceId(), -// event -> event -// ) -// ); -// -// List mergedEvents = new ArrayList<>(); -// -// for (Event latestEvent : latestEvents) { -// if (INSTANCE_DELETED.equals(latestEvent.getName())) { -// Event nonDeletedEvent = nonDeletedEventMap -// .get(latestEvent.getInstanceFlowHeaders().getSourceApplicationInstanceId()); -// if (nonDeletedEvent != null) { -// EventDto updatedEventDto = EventToEventDto(nonDeletedEvent); -// updatedEventDto.setStatus(INSTANCE_DELETED); -// mergedEvents.add(updatedEventDto); -// } -// } else { -// EventDto eventDto = EventToEventDto(latestEvent); -// mergedEvents.add(eventDto); -// } -// } -// -// log.info("Merged Events Size: " + mergedEvents.size()); -// -// -// int start = (int) pageable.getOffset(); -// int end = Math.min((start + pageable.getPageSize()), mergedEvents.size()); -// -// List paginatedList = mergedEvents.subList(start, end); -// -// return new PageImpl<>(paginatedList, pageable, mergedEvents.size()); -// } - public Optional findFirstByInstanceFlowHeadersSourceApplicationIdAndInstanceFlowHeadersSourceApplicationInstanceIdAndInstanceFlowHeadersSourceApplicationIntegrationIdOrderByTimestampDesc( ManualEventDto manualEventDto ) { From 1820169d4da6999c224c71d36fff477a3f125a08 Mon Sep 17 00:00:00 2001 From: Egil Ballestad Date: Tue, 15 Oct 2024 12:58:06 +0200 Subject: [PATCH 03/11] add custom pagination in events --- src/main/java/no/fintlabs/EventService.java | 27 ++++++++----------- .../repositories/EventRepository.java | 4 +-- 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/src/main/java/no/fintlabs/EventService.java b/src/main/java/no/fintlabs/EventService.java index 2fc2b00..13d87da 100644 --- a/src/main/java/no/fintlabs/EventService.java +++ b/src/main/java/no/fintlabs/EventService.java @@ -42,10 +42,10 @@ public Page getMergedLatestEvents(Pageable pageable) { long totalLatestEvents = eventRepository.countLatestEventPerSourceApplicationInstanceId(); long totalLatestNonDeletedEvents = eventRepository.countLatestEventNotDeletedPerSourceApplicationInstanceId(); - long totalElements = totalLatestEvents + totalLatestNonDeletedEvents; - List mergedEvents = mergeEvents(latestEventsPage.getContent(), latestNonDeletedEventsPage.getContent()); + long totalElements = totalLatestEvents + totalLatestNonDeletedEvents; + return new PageImpl<>(mergedEvents, pageable, totalElements); } @@ -59,33 +59,30 @@ public Page getMergedLatestEventsWhereSourceApplicationIdIn( pageable ); - Page latestNonDeletedEventsPage = eventRepository + List latestNonDeletedEvents = eventRepository .findLatestEventNotDeletedPerSourceApplicationInstanceIdAndSourceApplicationIdIn( sourceApplicationIds, - pageable - ); + Pageable.unpaged() + ).getContent(); long totalLatestEvents = eventRepository.countLatestEventPerSourceApplicationInstanceIdAndSourceApplicationIdIn(sourceApplicationIds); long totalLatestNonDeletedEvents = eventRepository.countLatestEventNotDeletedPerSourceApplicationInstanceIdAndSourceApplicationIdIn(sourceApplicationIds); long totalElements = totalLatestEvents + totalLatestNonDeletedEvents; - List mergedEvents = mergeEvents(latestEventsPage.getContent(), latestNonDeletedEventsPage.getContent()); + List mergedEvents = mergeEvents(latestEventsPage.getContent(), latestNonDeletedEvents); return new PageImpl<>(mergedEvents, pageable, totalElements); } private List mergeEvents(List latestEvents, List latestNonDeletedEvents) { Map nonDeletedEventMap = latestNonDeletedEvents.stream() - .collect( - Collectors.toMap( - event -> event.getInstanceFlowHeaders().getSourceApplicationInstanceId(), - event -> event - ) - ); + .collect(Collectors.toMap( + event -> event.getInstanceFlowHeaders().getSourceApplicationInstanceId(), + event -> event + )); List mergedEvents = new ArrayList<>(); - for (Event latestEvent : latestEvents) { if (INSTANCE_DELETED.equals(latestEvent.getName())) { Event nonDeletedEvent = nonDeletedEventMap @@ -96,11 +93,9 @@ private List mergeEvents(List latestEvents, List latestN mergedEvents.add(updatedEventDto); } } else { - EventDto eventDto = EventToEventDto(latestEvent); - mergedEvents.add(eventDto); + mergedEvents.add(EventToEventDto(latestEvent)); } } - return mergedEvents; } diff --git a/src/main/java/no/fintlabs/repositories/EventRepository.java b/src/main/java/no/fintlabs/repositories/EventRepository.java index 8afd242..285141a 100644 --- a/src/main/java/no/fintlabs/repositories/EventRepository.java +++ b/src/main/java/no/fintlabs/repositories/EventRepository.java @@ -125,7 +125,7 @@ long countLatestEventNotDeletedPerSourceApplicationInstanceIdAndSourceApplicatio @Param("sourceApplicationIds") List sourceApplicationIds ); - @Query(value = "SELECT COUNT(e.*) " + + @Query(value = "SELECT COUNT(*) " + "FROM event AS e " + "INNER JOIN ( " + " SELECT source_application_instance_id, MAX(timestamp) AS timestampMax " + @@ -137,7 +137,7 @@ long countLatestEventNotDeletedPerSourceApplicationInstanceIdAndSourceApplicatio nativeQuery = true) long countLatestEventPerSourceApplicationInstanceId(); - @Query(value = "SELECT COUNT(e.*) " + + @Query(value = "SELECT COUNT(*) " + "FROM event AS e " + "INNER JOIN ( " + " SELECT source_application_instance_id, MAX(timestamp) AS timestampMax " + From a7d37b9e747a0ebcdd6ab9cff363d2f4ed952550 Mon Sep 17 00:00:00 2001 From: Egil Ballestad Date: Tue, 15 Oct 2024 13:03:59 +0200 Subject: [PATCH 04/11] add custom pagination in events --- src/main/java/no/fintlabs/EventService.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/no/fintlabs/EventService.java b/src/main/java/no/fintlabs/EventService.java index 13d87da..e86817a 100644 --- a/src/main/java/no/fintlabs/EventService.java +++ b/src/main/java/no/fintlabs/EventService.java @@ -1,6 +1,7 @@ package no.fintlabs; import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; import no.fintlabs.model.Event; import no.fintlabs.model.EventDto; import no.fintlabs.model.ManualEventDto; @@ -20,6 +21,7 @@ @Service @AllArgsConstructor +@Slf4j public class EventService { private final EventRepository eventRepository; @@ -62,7 +64,7 @@ public Page getMergedLatestEventsWhereSourceApplicationIdIn( List latestNonDeletedEvents = eventRepository .findLatestEventNotDeletedPerSourceApplicationInstanceIdAndSourceApplicationIdIn( sourceApplicationIds, - Pageable.unpaged() + Pageable.unpaged() // Fetch all results, no pagination ).getContent(); long totalLatestEvents = eventRepository.countLatestEventPerSourceApplicationInstanceIdAndSourceApplicationIdIn(sourceApplicationIds); @@ -70,8 +72,12 @@ public Page getMergedLatestEventsWhereSourceApplicationIdIn( long totalElements = totalLatestEvents + totalLatestNonDeletedEvents; + log.info("Total Elements: {}", totalElements); + List mergedEvents = mergeEvents(latestEventsPage.getContent(), latestNonDeletedEvents); + totalElements = Math.min(totalElements, mergedEvents.size()); + return new PageImpl<>(mergedEvents, pageable, totalElements); } From 9ebae84b432061868be4bb473ab0768ea4acc8e9 Mon Sep 17 00:00:00 2001 From: Egil Ballestad Date: Tue, 15 Oct 2024 13:09:37 +0200 Subject: [PATCH 05/11] add custom pagination in events --- src/main/java/no/fintlabs/EventService.java | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main/java/no/fintlabs/EventService.java b/src/main/java/no/fintlabs/EventService.java index e86817a..a8513c9 100644 --- a/src/main/java/no/fintlabs/EventService.java +++ b/src/main/java/no/fintlabs/EventService.java @@ -55,6 +55,7 @@ public Page getMergedLatestEventsWhereSourceApplicationIdIn( List sourceApplicationIds, Pageable pageable ) { + // Fetch the paginated results for the first query Page latestEventsPage = eventRepository .findLatestEventPerSourceApplicationInstanceIdAndSourceApplicationIdIn( sourceApplicationIds, @@ -64,7 +65,7 @@ public Page getMergedLatestEventsWhereSourceApplicationIdIn( List latestNonDeletedEvents = eventRepository .findLatestEventNotDeletedPerSourceApplicationInstanceIdAndSourceApplicationIdIn( sourceApplicationIds, - Pageable.unpaged() // Fetch all results, no pagination + Pageable.unpaged() ).getContent(); long totalLatestEvents = eventRepository.countLatestEventPerSourceApplicationInstanceIdAndSourceApplicationIdIn(sourceApplicationIds); @@ -72,15 +73,24 @@ public Page getMergedLatestEventsWhereSourceApplicationIdIn( long totalElements = totalLatestEvents + totalLatestNonDeletedEvents; - log.info("Total Elements: {}", totalElements); + if (totalElements == 0) { + return new PageImpl<>(new ArrayList<>(), pageable, totalElements); + } List mergedEvents = mergeEvents(latestEventsPage.getContent(), latestNonDeletedEvents); - totalElements = Math.min(totalElements, mergedEvents.size()); + int start = (int) pageable.getOffset(); + int end = Math.min(start + pageable.getPageSize(), mergedEvents.size()); - return new PageImpl<>(mergedEvents, pageable, totalElements); + if (start > mergedEvents.size()) { + return new PageImpl<>(new ArrayList<>(), pageable, totalElements); + } + + List paginatedList = mergedEvents.subList(start, end); + return new PageImpl<>(paginatedList, pageable, totalElements); } + private List mergeEvents(List latestEvents, List latestNonDeletedEvents) { Map nonDeletedEventMap = latestNonDeletedEvents.stream() .collect(Collectors.toMap( From 4db2af002743d419b40f9f46aa5609e72045fa59 Mon Sep 17 00:00:00 2001 From: Egil Ballestad Date: Tue, 15 Oct 2024 13:12:03 +0200 Subject: [PATCH 06/11] add custom pagination in events --- src/main/java/no/fintlabs/EventService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/no/fintlabs/EventService.java b/src/main/java/no/fintlabs/EventService.java index a8513c9..573db13 100644 --- a/src/main/java/no/fintlabs/EventService.java +++ b/src/main/java/no/fintlabs/EventService.java @@ -55,7 +55,6 @@ public Page getMergedLatestEventsWhereSourceApplicationIdIn( List sourceApplicationIds, Pageable pageable ) { - // Fetch the paginated results for the first query Page latestEventsPage = eventRepository .findLatestEventPerSourceApplicationInstanceIdAndSourceApplicationIdIn( sourceApplicationIds, From 6eea30b948b3f5f3711d6898e28c4f181cbea5b2 Mon Sep 17 00:00:00 2001 From: Egil Ballestad Date: Tue, 15 Oct 2024 13:14:25 +0200 Subject: [PATCH 07/11] add custom pagination in events --- src/main/java/no/fintlabs/EventService.java | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/src/main/java/no/fintlabs/EventService.java b/src/main/java/no/fintlabs/EventService.java index 573db13..9c80823 100644 --- a/src/main/java/no/fintlabs/EventService.java +++ b/src/main/java/no/fintlabs/EventService.java @@ -58,7 +58,7 @@ public Page getMergedLatestEventsWhereSourceApplicationIdIn( Page latestEventsPage = eventRepository .findLatestEventPerSourceApplicationInstanceIdAndSourceApplicationIdIn( sourceApplicationIds, - pageable + Pageable.unpaged() ); List latestNonDeletedEvents = eventRepository @@ -67,14 +67,7 @@ public Page getMergedLatestEventsWhereSourceApplicationIdIn( Pageable.unpaged() ).getContent(); - long totalLatestEvents = eventRepository.countLatestEventPerSourceApplicationInstanceIdAndSourceApplicationIdIn(sourceApplicationIds); - long totalLatestNonDeletedEvents = eventRepository.countLatestEventNotDeletedPerSourceApplicationInstanceIdAndSourceApplicationIdIn(sourceApplicationIds); - - long totalElements = totalLatestEvents + totalLatestNonDeletedEvents; - - if (totalElements == 0) { - return new PageImpl<>(new ArrayList<>(), pageable, totalElements); - } + long totalElements = latestEventsPage.getTotalElements() + latestNonDeletedEvents.size(); List mergedEvents = mergeEvents(latestEventsPage.getContent(), latestNonDeletedEvents); @@ -89,7 +82,6 @@ public Page getMergedLatestEventsWhereSourceApplicationIdIn( return new PageImpl<>(paginatedList, pageable, totalElements); } - private List mergeEvents(List latestEvents, List latestNonDeletedEvents) { Map nonDeletedEventMap = latestNonDeletedEvents.stream() .collect(Collectors.toMap( From 996f20ecdd1d4377e34c24709e79b324149ccf04 Mon Sep 17 00:00:00 2001 From: Egil Ballestad Date: Tue, 15 Oct 2024 13:21:40 +0200 Subject: [PATCH 08/11] add custom pagination in events --- src/main/java/no/fintlabs/EventService.java | 31 +++++++++++++++++---- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/src/main/java/no/fintlabs/EventService.java b/src/main/java/no/fintlabs/EventService.java index 9c80823..056b578 100644 --- a/src/main/java/no/fintlabs/EventService.java +++ b/src/main/java/no/fintlabs/EventService.java @@ -9,6 +9,7 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import java.util.ArrayList; @@ -55,11 +56,11 @@ public Page getMergedLatestEventsWhereSourceApplicationIdIn( List sourceApplicationIds, Pageable pageable ) { - Page latestEventsPage = eventRepository + List latestEvents = eventRepository .findLatestEventPerSourceApplicationInstanceIdAndSourceApplicationIdIn( sourceApplicationIds, Pageable.unpaged() - ); + ).getContent(); List latestNonDeletedEvents = eventRepository .findLatestEventNotDeletedPerSourceApplicationInstanceIdAndSourceApplicationIdIn( @@ -67,14 +68,27 @@ public Page getMergedLatestEventsWhereSourceApplicationIdIn( Pageable.unpaged() ).getContent(); - long totalElements = latestEventsPage.getTotalElements() + latestNonDeletedEvents.size(); + List mergedEvents = mergeEvents(latestEvents, latestNonDeletedEvents); - List mergedEvents = mergeEvents(latestEventsPage.getContent(), latestNonDeletedEvents); + Sort sort = pageable.getSort(); + if (sort.isSorted()) { + mergedEvents.sort((e1, e2) -> { + for (Sort.Order order : sort) { + int comparisonResult = compareEvents(e1, e2, order); + if (comparisonResult != 0) { + return order.isAscending() ? comparisonResult : -comparisonResult; + } + } + return 0; + }); + } + + long totalElements = mergedEvents.size(); int start = (int) pageable.getOffset(); int end = Math.min(start + pageable.getPageSize(), mergedEvents.size()); - if (start > mergedEvents.size()) { + if (start >= mergedEvents.size()) { return new PageImpl<>(new ArrayList<>(), pageable, totalElements); } @@ -82,6 +96,13 @@ public Page getMergedLatestEventsWhereSourceApplicationIdIn( return new PageImpl<>(paginatedList, pageable, totalElements); } + private int compareEvents(EventDto e1, EventDto e2, Sort.Order order) { + if ("timestamp".equals(order.getProperty())) { + return e1.getTimestamp().compareTo(e2.getTimestamp()); + } + return 0; + } + private List mergeEvents(List latestEvents, List latestNonDeletedEvents) { Map nonDeletedEventMap = latestNonDeletedEvents.stream() .collect(Collectors.toMap( From 663959d8c2116065458054683dff9e5664b172a0 Mon Sep 17 00:00:00 2001 From: Egil Ballestad Date: Tue, 15 Oct 2024 13:43:39 +0200 Subject: [PATCH 09/11] add custom pagination in events --- src/main/java/no/fintlabs/EventService.java | 67 ++++++++++++--------- 1 file changed, 40 insertions(+), 27 deletions(-) diff --git a/src/main/java/no/fintlabs/EventService.java b/src/main/java/no/fintlabs/EventService.java index 056b578..8896c2b 100644 --- a/src/main/java/no/fintlabs/EventService.java +++ b/src/main/java/no/fintlabs/EventService.java @@ -36,26 +36,50 @@ public Page findAll(Pageable pageable) { } public Page getMergedLatestEvents(Pageable pageable) { - Page latestEventsPage = eventRepository - .findLatestEventPerSourceApplicationInstanceId(pageable); + List mergedEvents = fetchAndMergeEvents(); - Page latestNonDeletedEventsPage = eventRepository - .findLatestEventNotDeletedPerSourceApplicationInstanceId(pageable); - - long totalLatestEvents = eventRepository.countLatestEventPerSourceApplicationInstanceId(); - long totalLatestNonDeletedEvents = eventRepository.countLatestEventNotDeletedPerSourceApplicationInstanceId(); - - List mergedEvents = mergeEvents(latestEventsPage.getContent(), latestNonDeletedEventsPage.getContent()); - - long totalElements = totalLatestEvents + totalLatestNonDeletedEvents; - - return new PageImpl<>(mergedEvents, pageable, totalElements); + return getEventDtos(pageable, mergedEvents); } + public Page getMergedLatestEventsWhereSourceApplicationIdIn( List sourceApplicationIds, Pageable pageable ) { + List mergedEvents = fetchAndMergeEventsWithSourceApplicationIds(sourceApplicationIds); + + return getEventDtos(pageable, mergedEvents); + } + + private PageImpl getEventDtos(Pageable pageable, List mergedEvents) { + sortMergedEvents(mergedEvents, pageable.getSort()); + + long totalElements = mergedEvents.size(); + + int start = (int) pageable.getOffset(); + int end = Math.min(start + pageable.getPageSize(), mergedEvents.size()); + + if (start >= mergedEvents.size()) { + return new PageImpl<>(new ArrayList<>(), pageable, totalElements); + } + + List paginatedList = mergedEvents.subList(start, end); + return new PageImpl<>(paginatedList, pageable, totalElements); + } + + private List fetchAndMergeEvents() { + List latestEvents = eventRepository + .findLatestEventPerSourceApplicationInstanceId(Pageable.unpaged()) + .getContent(); + + List latestNonDeletedEvents = eventRepository + .findLatestEventNotDeletedPerSourceApplicationInstanceId(Pageable.unpaged()) + .getContent(); + + return mergeEvents(latestEvents, latestNonDeletedEvents); + } + + private List fetchAndMergeEventsWithSourceApplicationIds(List sourceApplicationIds) { List latestEvents = eventRepository .findLatestEventPerSourceApplicationInstanceIdAndSourceApplicationIdIn( sourceApplicationIds, @@ -68,9 +92,10 @@ public Page getMergedLatestEventsWhereSourceApplicationIdIn( Pageable.unpaged() ).getContent(); - List mergedEvents = mergeEvents(latestEvents, latestNonDeletedEvents); + return mergeEvents(latestEvents, latestNonDeletedEvents); + } - Sort sort = pageable.getSort(); + private void sortMergedEvents(List mergedEvents, Sort sort) { if (sort.isSorted()) { mergedEvents.sort((e1, e2) -> { for (Sort.Order order : sort) { @@ -82,18 +107,6 @@ public Page getMergedLatestEventsWhereSourceApplicationIdIn( return 0; }); } - - long totalElements = mergedEvents.size(); - - int start = (int) pageable.getOffset(); - int end = Math.min(start + pageable.getPageSize(), mergedEvents.size()); - - if (start >= mergedEvents.size()) { - return new PageImpl<>(new ArrayList<>(), pageable, totalElements); - } - - List paginatedList = mergedEvents.subList(start, end); - return new PageImpl<>(paginatedList, pageable, totalElements); } private int compareEvents(EventDto e1, EventDto e2, Sort.Order order) { From 6059d4ff02f5ae2b6e87b241344705f38e868d75 Mon Sep 17 00:00:00 2001 From: Egil Ballestad Date: Tue, 15 Oct 2024 14:00:14 +0200 Subject: [PATCH 10/11] add custom pagination in events --- .../repositories/EventRepository.java | 61 ------------------- 1 file changed, 61 deletions(-) diff --git a/src/main/java/no/fintlabs/repositories/EventRepository.java b/src/main/java/no/fintlabs/repositories/EventRepository.java index 285141a..15ceb8d 100644 --- a/src/main/java/no/fintlabs/repositories/EventRepository.java +++ b/src/main/java/no/fintlabs/repositories/EventRepository.java @@ -91,67 +91,6 @@ Page findLatestEventNotDeletedPerSourceApplicationInstanceIdAndSourceAppl @Param("sourceApplicationIds") List sourceApplicationIds, Pageable pageable); - @Query(value = "SELECT COUNT(e.*) " + - "FROM event AS e " + - "INNER JOIN ( " + - " SELECT source_application_instance_id, MAX(timestamp) AS timestampMax " + - " FROM event " + - " WHERE source_application_id IN :sourceApplicationIds " + - " GROUP BY source_application_instance_id " + - ") AS eMax " + - "ON e.source_application_instance_id = eMax.source_application_instance_id " + - "AND e.timestamp = eMax.timestampMax " + - "WHERE e.source_application_id IN :sourceApplicationIds", - nativeQuery = true) - long countLatestEventPerSourceApplicationInstanceIdAndSourceApplicationIdIn( - @Param("sourceApplicationIds") List sourceApplicationIds - ); - - @Query(value = "SELECT COUNT(e.*) " + - "FROM event AS e " + - "INNER JOIN ( " + - " SELECT source_application_instance_id, MAX(timestamp) AS timestampMax " + - " FROM event " + - " WHERE source_application_id IN :sourceApplicationIds " + - " AND name <> 'instance-deleted' " + - " GROUP BY source_application_instance_id " + - ") AS eMax " + - "ON e.source_application_instance_id = eMax.source_application_instance_id " + - "AND e.timestamp = eMax.timestampMax " + - "WHERE e.source_application_id IN :sourceApplicationIds " + - "AND e.name <> 'instance-deleted'", - nativeQuery = true) - long countLatestEventNotDeletedPerSourceApplicationInstanceIdAndSourceApplicationIdIn( - @Param("sourceApplicationIds") List sourceApplicationIds - ); - - @Query(value = "SELECT COUNT(*) " + - "FROM event AS e " + - "INNER JOIN ( " + - " SELECT source_application_instance_id, MAX(timestamp) AS timestampMax " + - " FROM event " + - " GROUP BY source_application_instance_id " + - ") AS eMax " + - "ON e.source_application_instance_id = eMax.source_application_instance_id " + - "AND e.timestamp = eMax.timestampMax", - nativeQuery = true) - long countLatestEventPerSourceApplicationInstanceId(); - - @Query(value = "SELECT COUNT(*) " + - "FROM event AS e " + - "INNER JOIN ( " + - " SELECT source_application_instance_id, MAX(timestamp) AS timestampMax " + - " FROM event " + - " WHERE name <> 'instance-deleted' " + - " GROUP BY source_application_instance_id " + - ") AS eMax " + - "ON e.source_application_instance_id = eMax.source_application_instance_id " + - "AND e.timestamp = eMax.timestampMax " + - "AND e.name <> 'instance-deleted'", - nativeQuery = true) - long countLatestEventNotDeletedPerSourceApplicationInstanceId(); - - Page findAllByInstanceFlowHeadersSourceApplicationIdIn( List sourceApplicationIds, Pageable pageable From 0083a339050e44160db483bfc5520ca7aff3cd80 Mon Sep 17 00:00:00 2001 From: Egil Ballestad Date: Tue, 15 Oct 2024 14:03:14 +0200 Subject: [PATCH 11/11] add custom pagination in events --- src/main/java/no/fintlabs/EventService.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/no/fintlabs/EventService.java b/src/main/java/no/fintlabs/EventService.java index 8896c2b..d4b2a3c 100644 --- a/src/main/java/no/fintlabs/EventService.java +++ b/src/main/java/no/fintlabs/EventService.java @@ -1,7 +1,6 @@ package no.fintlabs; import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; import no.fintlabs.model.Event; import no.fintlabs.model.EventDto; import no.fintlabs.model.ManualEventDto; @@ -22,7 +21,6 @@ @Service @AllArgsConstructor -@Slf4j public class EventService { private final EventRepository eventRepository; @@ -38,7 +36,7 @@ public Page findAll(Pageable pageable) { public Page getMergedLatestEvents(Pageable pageable) { List mergedEvents = fetchAndMergeEvents(); - return getEventDtos(pageable, mergedEvents); + return getPageableEventDtos(pageable, mergedEvents); } @@ -48,10 +46,10 @@ public Page getMergedLatestEventsWhereSourceApplicationIdIn( ) { List mergedEvents = fetchAndMergeEventsWithSourceApplicationIds(sourceApplicationIds); - return getEventDtos(pageable, mergedEvents); + return getPageableEventDtos(pageable, mergedEvents); } - private PageImpl getEventDtos(Pageable pageable, List mergedEvents) { + private PageImpl getPageableEventDtos(Pageable pageable, List mergedEvents) { sortMergedEvents(mergedEvents, pageable.getSort()); long totalElements = mergedEvents.size();