Skip to content

Commit

Permalink
Merge pull request #21 from FINTLabs/FFS-1217-pagination-fungerer-ikk…
Browse files Browse the repository at this point in the history
…e-lenger-i-history-service

add custom pagination in events
  • Loading branch information
Battlestad authored Oct 15, 2024
2 parents 81ae4b3 + 0083a33 commit 9e61ffb
Showing 1 changed file with 69 additions and 26 deletions.
95 changes: 69 additions & 26 deletions src/main/java/no/fintlabs/EventService.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,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;
Expand All @@ -33,45 +34,94 @@ public Page<EventDto> findAll(Pageable pageable) {
}

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

List<Event> latestNonDeletedEvents = eventRepository
.findLatestEventNotDeletedPerSourceApplicationInstanceId(pageable).getContent();
List<EventDto> mergedEvents = fetchAndMergeEvents();

return getEventDtos(pageable, latestNonDeletedEvents, latestEvents);
return getPageableEventDtos(pageable, mergedEvents);
}


public Page<EventDto> getMergedLatestEventsWhereSourceApplicationIdIn(
List<Long> sourceApplicationIds,
Pageable pageable
) {
List<EventDto> mergedEvents = fetchAndMergeEventsWithSourceApplicationIds(sourceApplicationIds);

return getPageableEventDtos(pageable, mergedEvents);
}

private PageImpl<EventDto> getPageableEventDtos(Pageable pageable, List<EventDto> 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<EventDto> paginatedList = mergedEvents.subList(start, end);
return new PageImpl<>(paginatedList, pageable, totalElements);
}

private List<EventDto> fetchAndMergeEvents() {
List<Event> latestEvents = eventRepository
.findLatestEventPerSourceApplicationInstanceId(Pageable.unpaged())
.getContent();

List<Event> latestNonDeletedEvents = eventRepository
.findLatestEventNotDeletedPerSourceApplicationInstanceId(Pageable.unpaged())
.getContent();

return mergeEvents(latestEvents, latestNonDeletedEvents);
}

private List<EventDto> fetchAndMergeEventsWithSourceApplicationIds(List<Long> sourceApplicationIds) {
List<Event> latestEvents = eventRepository
.findLatestEventPerSourceApplicationInstanceIdAndSourceApplicationIdIn(
sourceApplicationIds,
pageable
Pageable.unpaged()
).getContent();

List<Event> latestNonDeletedEvents = eventRepository
.findLatestEventNotDeletedPerSourceApplicationInstanceIdAndSourceApplicationIdIn(
sourceApplicationIds,
pageable
Pageable.unpaged()
).getContent();

return getEventDtos(pageable, latestNonDeletedEvents, latestEvents);
return mergeEvents(latestEvents, latestNonDeletedEvents);
}

private PageImpl<EventDto> getEventDtos(Pageable pageable, List<Event> latestNonDeletedEvents, List<Event> latestEvents) {
private void sortMergedEvents(List<EventDto> mergedEvents, Sort sort) {
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;
});
}
}

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<EventDto> mergeEvents(List<Event> latestEvents, List<Event> latestNonDeletedEvents) {
Map<String, Event> nonDeletedEventMap = latestNonDeletedEvents.stream()
.collect(
Collectors.toMap(
event -> event.getInstanceFlowHeaders().getSourceApplicationInstanceId(),
event -> event
)
);
.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
Expand All @@ -82,17 +132,10 @@ private PageImpl<EventDto> getEventDtos(Pageable pageable, List<Event> latestNon
mergedEvents.add(updatedEventDto);
}
} else {
EventDto eventDto = EventToEventDto(latestEvent);
mergedEvents.add(eventDto);
mergedEvents.add(EventToEventDto(latestEvent));
}
}

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 Optional<Event> findFirstByInstanceFlowHeadersSourceApplicationIdAndInstanceFlowHeadersSourceApplicationInstanceIdAndInstanceFlowHeadersSourceApplicationIntegrationIdOrderByTimestampDesc(
Expand Down

0 comments on commit 9e61ffb

Please sign in to comment.