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