Skip to content

Commit 21cd853

Browse files
[MODORDERS-1378] POL creation is slow when adding an excessive number of product IDs (#1202)
1 parent 589799d commit 21cd853

1 file changed

Lines changed: 20 additions & 1 deletion

File tree

src/main/java/org/folio/service/inventory/InventoryInstanceManager.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,11 @@
2929
import org.folio.service.consortium.SharingInstanceService;
3030

3131
import java.util.Collection;
32+
import java.util.LinkedList;
3233
import java.util.List;
3334
import java.util.Objects;
3435
import java.util.Optional;
36+
import java.util.Queue;
3537
import java.util.concurrent.CompletionException;
3638
import java.util.stream.Stream;
3739

@@ -244,9 +246,26 @@ private Future<String> getInstanceRecordAndShareIfNeeded(PoLine poLine, Consorti
244246
}
245247

246248
Future<String> getAnyInstanceIdByProductIds(List<ProductId> productIds, RequestContext requestContext) {
247-
var productIdQueries = productIds.stream()
249+
List<String> productIdQueries = StreamEx.of(productIds)
248250
.map(productId -> PRODUCT_ID_CQL.formatted(productId.getProductIdType(), productId.getProductId()))
251+
.distinct()
249252
.toList();
253+
Queue<List<String>> queryBatches = StreamEx.ofSubLists(productIdQueries, MAX_IDS_FOR_GET_RQ_15).toCollection(LinkedList::new);
254+
return getAnyInstanceIdByProductIdsQueryBatches(queryBatches, requestContext);
255+
}
256+
257+
private Future<String> getAnyInstanceIdByProductIdsQueryBatches(Queue<List<String>> queryBatches, RequestContext requestContext) {
258+
if (queryBatches.isEmpty()) {
259+
return Future.succeededFuture(null);
260+
}
261+
var nextQueriesChunk = queryBatches.poll();
262+
return getAnyInstanceIdByProductIdsQueryBatch(nextQueriesChunk, requestContext)
263+
.compose(instanceId -> instanceId != null
264+
? Future.succeededFuture(instanceId)
265+
: getAnyInstanceIdByProductIdsQueryBatches(queryBatches, requestContext));
266+
}
267+
268+
private Future<String> getAnyInstanceIdByProductIdsQueryBatch(List<String> productIdQueries, RequestContext requestContext) {
250269
var deletedQueries = List.of(getCqlExpressionForFieldNullValue("deleted"), "deleted==false");
251270
var query = combineCqlExpressions("and", combineCqlExpressions("or", productIdQueries), combineCqlExpressions("or", deletedQueries));
252271

0 commit comments

Comments
 (0)