Skip to content

Commit

Permalink
add custom pagination in events
Browse files Browse the repository at this point in the history
  • Loading branch information
Battlestad committed Oct 15, 2024
1 parent 81ae4b3 commit 5236ff2
Show file tree
Hide file tree
Showing 2 changed files with 150 additions and 17 deletions.
106 changes: 89 additions & 17 deletions src/main/java/no/fintlabs/EventService.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -20,6 +21,7 @@

@Service
@AllArgsConstructor
@Slf4j
public class EventService {

private final EventRepository eventRepository;
Expand All @@ -33,35 +35,49 @@ public Page<EventDto> findAll(Pageable pageable) {
}

public Page<EventDto> getMergedLatestEvents(Pageable pageable) {
List<Event> latestEvents = eventRepository
.findLatestEventPerSourceApplicationInstanceId(pageable).getContent();
Page<Event> latestEventsPage = eventRepository
.findLatestEventPerSourceApplicationInstanceId(pageable);

List<Event> latestNonDeletedEvents = eventRepository
.findLatestEventNotDeletedPerSourceApplicationInstanceId(pageable).getContent();
Page<Event> latestNonDeletedEventsPage = eventRepository
.findLatestEventNotDeletedPerSourceApplicationInstanceId(pageable);

return getEventDtos(pageable, latestNonDeletedEvents, latestEvents);
long totalLatestEvents = eventRepository.countLatestEventPerSourceApplicationInstanceId();
long totalLatestNonDeletedEvents = eventRepository.countLatestEventNotDeletedPerSourceApplicationInstanceId();

long totalElements = totalLatestEvents + totalLatestNonDeletedEvents;

List<EventDto> mergedEvents = mergeEvents(latestEventsPage.getContent(), latestNonDeletedEventsPage.getContent());

return new PageImpl<>(mergedEvents, pageable, totalElements);
}

public Page<EventDto> getMergedLatestEventsWhereSourceApplicationIdIn(
List<Long> sourceApplicationIds,
Pageable pageable
) {
List<Event> latestEvents = eventRepository
Page<Event> latestEventsPage = eventRepository
.findLatestEventPerSourceApplicationInstanceIdAndSourceApplicationIdIn(
sourceApplicationIds,
pageable
).getContent();
);

List<Event> latestNonDeletedEvents = eventRepository
Page<Event> 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<EventDto> mergedEvents = mergeEvents(latestEventsPage.getContent(), latestNonDeletedEventsPage.getContent());

return new PageImpl<>(mergedEvents, pageable, totalElements);
}

private PageImpl<EventDto> getEventDtos(Pageable pageable, List<Event> latestNonDeletedEvents, List<Event> latestEvents) {
private List<EventDto> mergeEvents(List<Event> latestEvents, List<Event> latestNonDeletedEvents) {
Map<String, Event> nonDeletedEventMap = latestNonDeletedEvents.stream()
.collect(
Collectors.toMap(
Expand All @@ -87,14 +103,70 @@ private PageImpl<EventDto> getEventDtos(Pageable pageable, List<Event> latestNon
}
}

int start = (int) pageable.getOffset();
int end = Math.min((start + pageable.getPageSize()), mergedEvents.size());

List<EventDto> paginatedList = mergedEvents.subList(start, end);

return new PageImpl<>(paginatedList, pageable, mergedEvents.size());
return mergedEvents;
}

// public Page<EventDto> getMergedLatestEventsWhereSourceApplicationIdIn(
// List<Long> sourceApplicationIds,
// Pageable pageable
// ) {
// List<Event> latestEvents = eventRepository
// .findLatestEventPerSourceApplicationInstanceIdAndSourceApplicationIdIn(
// sourceApplicationIds,
// pageable
// ).getContent();
//
// List<Event> latestNonDeletedEvents = eventRepository
// .findLatestEventNotDeletedPerSourceApplicationInstanceIdAndSourceApplicationIdIn(
// sourceApplicationIds,
// pageable
// ).getContent();
//
// return getEventDtos(pageable, latestNonDeletedEvents, latestEvents);
// }

// private PageImpl<EventDto> getEventDtos(Pageable pageable, List<Event> latestNonDeletedEvents, List<Event> latestEvents) {
//
// log.info("Latest Events Size: " + latestEvents.size());
// log.info("Latest Non-Deleted Events Size: " + latestNonDeletedEvents.size());
//
//
// Map<String, Event> nonDeletedEventMap = latestNonDeletedEvents.stream()
// .collect(
// Collectors.toMap(
// event -> event.getInstanceFlowHeaders().getSourceApplicationInstanceId(),
// event -> event
// )
// );
//
// List<EventDto> 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<EventDto> paginatedList = mergedEvents.subList(start, end);
//
// return new PageImpl<>(paginatedList, pageable, mergedEvents.size());
// }

public Optional<Event> findFirstByInstanceFlowHeadersSourceApplicationIdAndInstanceFlowHeadersSourceApplicationInstanceIdAndInstanceFlowHeadersSourceApplicationIntegrationIdOrderByTimestampDesc(
ManualEventDto manualEventDto
) {
Expand Down
61 changes: 61 additions & 0 deletions src/main/java/no/fintlabs/repositories/EventRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,67 @@ Page<Event> findLatestEventNotDeletedPerSourceApplicationInstanceIdAndSourceAppl
@Param("sourceApplicationIds") List<Long> 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<Long> 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<Long> 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<Event> findAllByInstanceFlowHeadersSourceApplicationIdIn(
List<Long> sourceApplicationIds,
Pageable pageable
Expand Down

0 comments on commit 5236ff2

Please sign in to comment.