diff --git a/src/main/java/org/folio/orders/utils/HelperUtils.java b/src/main/java/org/folio/orders/utils/HelperUtils.java index 68af8996b..e0ca60a3e 100644 --- a/src/main/java/org/folio/orders/utils/HelperUtils.java +++ b/src/main/java/org/folio/orders/utils/HelperUtils.java @@ -53,6 +53,7 @@ import java.util.Objects; import java.util.Optional; import java.util.concurrent.CompletionException; +import java.util.function.Function; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -331,6 +332,21 @@ public static Future> collectResultsOnSuccess(Collection> .map(CompositeFuture::list); } + /** + * The method allows to compose any elements with the same action in sequence. + * + * @param list elements to be executed in sequence + * @param method action that will be executed sequentially based on the number of list items + * @return the last composed element(Feature result) + */ + public static Future chainCall(List list, Function> method) { + Future f = Future.succeededFuture(); + for (T item : list) { + f = f.compose(r -> method.apply(item)); + } + return f; + } + /** * Transform list of id's to CQL query using 'or' operation * diff --git a/src/main/java/org/folio/service/inventory/InventoryItemRequestService.java b/src/main/java/org/folio/service/inventory/InventoryItemRequestService.java index 96d7ed540..4ff410308 100644 --- a/src/main/java/org/folio/service/inventory/InventoryItemRequestService.java +++ b/src/main/java/org/folio/service/inventory/InventoryItemRequestService.java @@ -15,6 +15,7 @@ import java.util.List; import java.util.Map; +import static org.folio.orders.utils.HelperUtils.chainCall; import static org.folio.orders.utils.HelperUtils.extractCreatedDate; import static org.folio.orders.utils.HelperUtils.extractId; import static org.folio.service.inventory.InventoryUtils.INVENTORY_LOOKUP_ENDPOINTS; @@ -63,19 +64,11 @@ public Future transferItemRequests(List originItemIds, String dest } // Move requests to new item sequentially and then cancel unnecessary ones - return transferRequests(requestsToTransfer, destinationItemId, requestContext) + return chainCall(requestsToTransfer, (request) -> transferRequest(request, destinationItemId, requestContext)) .compose(v -> cancelRequests(requestsToCancel, requestContext)); }); } - private Future transferRequests(List requests, String destinationItemId, RequestContext requestContext) { - return requests.stream().reduce( - Future.succeededFuture(), - (transfers, request) -> transfers.compose(v -> transferRequest(request, destinationItemId, requestContext)), - (transfers1, transfers2) -> transfers1.compose(v -> transfers2) - ); - } - private Future transferRequest(JsonObject request, String itemId, RequestContext requestContext) { String reqId = extractId(request); JsonObject jsonObject = JsonObject.of(DESTINATION_ITEM_ID.getValue(), itemId); diff --git a/src/main/java/org/folio/service/orders/lines/update/instance/WithHoldingOrderLineUpdateInstanceStrategy.java b/src/main/java/org/folio/service/orders/lines/update/instance/WithHoldingOrderLineUpdateInstanceStrategy.java index d212cae69..bb3a0c618 100644 --- a/src/main/java/org/folio/service/orders/lines/update/instance/WithHoldingOrderLineUpdateInstanceStrategy.java +++ b/src/main/java/org/folio/service/orders/lines/update/instance/WithHoldingOrderLineUpdateInstanceStrategy.java @@ -38,6 +38,8 @@ import java.util.stream.Collectors; import static java.util.stream.Collectors.toList; +import static org.folio.orders.utils.HelperUtils.chainCall; +import static org.folio.orders.utils.HelperUtils.collectResultsOnSuccess; import static org.folio.service.inventory.InventoryItemManager.ID; import static org.folio.service.inventory.InventoryItemManager.ITEM_HOLDINGS_RECORD_ID; @@ -194,12 +196,8 @@ private Future processLocations(OrderLineUpdateInstanceHolder holder, Function> processFunction) { return retrieveUniqueLocations(holder.getStoragePoLine(), requestContext) .compose(tenantIdToLocationsMap -> - GenericCompositeFuture.all(tenantIdToLocationsMap.values().stream() - .map(locations -> - GenericCompositeFuture.join(locations.stream() - .map(processFunction) - .toList()) - ) + collectResultsOnSuccess(tenantIdToLocationsMap.values().stream() + .map(locations -> chainCall(locations, processFunction)) .collect(toList())) ) .mapEmpty();