|
29 | 29 | import org.folio.service.consortium.SharingInstanceService; |
30 | 30 |
|
31 | 31 | import java.util.Collection; |
| 32 | +import java.util.LinkedList; |
32 | 33 | import java.util.List; |
33 | 34 | import java.util.Objects; |
34 | 35 | import java.util.Optional; |
| 36 | +import java.util.Queue; |
35 | 37 | import java.util.concurrent.CompletionException; |
36 | 38 | import java.util.stream.Stream; |
37 | 39 |
|
@@ -244,9 +246,26 @@ private Future<String> getInstanceRecordAndShareIfNeeded(PoLine poLine, Consorti |
244 | 246 | } |
245 | 247 |
|
246 | 248 | Future<String> getAnyInstanceIdByProductIds(List<ProductId> productIds, RequestContext requestContext) { |
247 | | - var productIdQueries = productIds.stream() |
| 249 | + List<String> productIdQueries = StreamEx.of(productIds) |
248 | 250 | .map(productId -> PRODUCT_ID_CQL.formatted(productId.getProductIdType(), productId.getProductId())) |
| 251 | + .distinct() |
249 | 252 | .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) { |
250 | 269 | var deletedQueries = List.of(getCqlExpressionForFieldNullValue("deleted"), "deleted==false"); |
251 | 270 | var query = combineCqlExpressions("and", combineCqlExpressions("or", productIdQueries), combineCqlExpressions("or", deletedQueries)); |
252 | 271 |
|
|
0 commit comments