From c68142b3e013e7619c98941d3de4a3cf746a314a Mon Sep 17 00:00:00 2001
From: psmagin
Date: Mon, 27 Jan 2025 12:52:26 +0200
Subject: [PATCH] feat(cn-browse): support showing instance title in browse
results list
Closes: MSEARCH-948
---
NEWS.md | 1 +
.../model/index/InstanceSubResource.java | 4 +-
...elvingOrderBrowseServiceBySearchAfter.java | 2 +-
.../browse/CallNumberBrowseService.java | 23 ++++
.../consortium/ConsortiumSearchHelper.java | 35 +++---
.../reindex/jdbc/CallNumberRepository.java | 23 ++--
...CallNumberSearchResponsePostProcessor.java | 84 +++++++++++++
.../folio/search/utils/CallNumberUtils.java | 118 ------------------
.../resources/model/instance_call_number.json | 6 +-
.../response/callNumberBrowseItem.yaml | 3 +
.../BrowseCallNumberConsortiumIT.java | 41 +++---
.../search/controller/BrowseCallNumberIT.java | 97 ++++++++------
.../IndexingInstanceCallNumberIT.java | 2 +-
.../ConsortiumSearchHelperTest.java | 2 +-
.../reindex/jdbc/CallNumberRepositoryIT.java | 6 +-
15 files changed, 233 insertions(+), 214 deletions(-)
create mode 100644 src/main/java/org/folio/search/service/setter/callnumber/CallNumberSearchResponsePostProcessor.java
diff --git a/NEWS.md b/NEWS.md
index d5c2668cc..ae70a5d1a 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -16,6 +16,7 @@
* Call Numbers Browse: Implement Indexing and Re-indexing Mechanisms for Call-Numbers ([MSEARCH-864](https://folio-org.atlassian.net/browse/MSEARCH-864))
* Call Numbers Browse: Implement Browsing Endpoint for Call-Numbers ([MSEARCH-865](https://folio-org.atlassian.net/browse/MSEARCH-865))
* Call Numbers Browse: Support aliases for callNumberTypeId filters ([MSEARCH-942](https://folio-org.atlassian.net/browse/MSEARCH-942))
+* Call Numbers Browse: Support showing instance title in browse results list ([MSEARCH-948](https://folio-org.atlassian.net/browse/MSEARCH-948))
### Bug fixes
* Remove shelving order calculation for local call-number types
diff --git a/src/main/java/org/folio/search/model/index/InstanceSubResource.java b/src/main/java/org/folio/search/model/index/InstanceSubResource.java
index 44e99fe59..5cdab81e7 100644
--- a/src/main/java/org/folio/search/model/index/InstanceSubResource.java
+++ b/src/main/java/org/folio/search/model/index/InstanceSubResource.java
@@ -11,5 +11,7 @@ public class InstanceSubResource {
private Boolean shared;
private int count;
private List typeId;
- private List locationId;
+ private String locationId;
+ private List instanceId;
+ private String instanceTitle;
}
diff --git a/src/main/java/org/folio/search/service/browse/AbstractShelvingOrderBrowseServiceBySearchAfter.java b/src/main/java/org/folio/search/service/browse/AbstractShelvingOrderBrowseServiceBySearchAfter.java
index 71f7cf7f6..57518cc5a 100644
--- a/src/main/java/org/folio/search/service/browse/AbstractShelvingOrderBrowseServiceBySearchAfter.java
+++ b/src/main/java/org/folio/search/service/browse/AbstractShelvingOrderBrowseServiceBySearchAfter.java
@@ -31,7 +31,7 @@
public abstract class AbstractShelvingOrderBrowseServiceBySearchAfter
extends AbstractBrowseServiceBySearchAfter {
- private final ConsortiumSearchHelper consortiumSearchHelper;
+ protected final ConsortiumSearchHelper consortiumSearchHelper;
private final BrowseConfigServiceDecorator configService;
protected AbstractShelvingOrderBrowseServiceBySearchAfter(ConsortiumSearchHelper consortiumSearchHelper,
diff --git a/src/main/java/org/folio/search/service/browse/CallNumberBrowseService.java b/src/main/java/org/folio/search/service/browse/CallNumberBrowseService.java
index 9645e37cc..e199082e3 100644
--- a/src/main/java/org/folio/search/service/browse/CallNumberBrowseService.java
+++ b/src/main/java/org/folio/search/service/browse/CallNumberBrowseService.java
@@ -2,12 +2,16 @@
import static org.folio.search.utils.SearchUtils.CALL_NUMBER_TYPE_ID_FIELD;
+import java.util.List;
+import java.util.Set;
+import java.util.function.Function;
import lombok.extern.log4j.Log4j2;
import org.folio.search.domain.dto.BrowseType;
import org.folio.search.domain.dto.CallNumberBrowseItem;
import org.folio.search.model.BrowseResult;
import org.folio.search.model.SearchResult;
import org.folio.search.model.index.CallNumberResource;
+import org.folio.search.model.index.InstanceSubResource;
import org.folio.search.model.service.BrowseContext;
import org.folio.search.service.consortium.BrowseConfigServiceDecorator;
import org.folio.search.service.consortium.ConsortiumSearchHelper;
@@ -61,8 +65,27 @@ protected BrowseResult mapToBrowseResult(BrowseContext ctx
.chronology(resource.chronology())
.enumeration(resource.enumeration())
.copyNumber(resource.copyNumber())
+ .instanceTitle(getInstanceTitle(ctx, resource, CallNumberResource::instances))
.isAnchor(isAnchor ? true : null)
.totalRecords(getTotalRecords(ctx, resource, CallNumberResource::instances)));
}
+ private String getInstanceTitle(BrowseContext ctx, CallNumberResource resource,
+ Function> func) {
+ var instanceSubResources = consortiumSearchHelper.filterSubResourcesForConsortium(ctx, resource, func);
+ if (instanceSubResources.size() == 1) {
+ return instanceSubResources.iterator().next().getInstanceTitle();
+ }
+ return null;
+ }
+
+ @Override
+ protected Integer getTotalRecords(BrowseContext ctx, CallNumberResource resource,
+ Function> func) {
+ return consortiumSearchHelper.filterSubResourcesForConsortium(ctx, resource, func)
+ .stream()
+ .map(InstanceSubResource::getInstanceId)
+ .map(List::size)
+ .reduce(0, Integer::sum);
+ }
}
diff --git a/src/main/java/org/folio/search/service/consortium/ConsortiumSearchHelper.java b/src/main/java/org/folio/search/service/consortium/ConsortiumSearchHelper.java
index 54ca6b0af..0e91bd253 100644
--- a/src/main/java/org/folio/search/service/consortium/ConsortiumSearchHelper.java
+++ b/src/main/java/org/folio/search/service/consortium/ConsortiumSearchHelper.java
@@ -6,15 +6,15 @@
import static org.opensearch.index.query.QueryBuilders.termQuery;
import java.util.LinkedList;
-import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
-import java.util.stream.Stream;
import lombok.RequiredArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.folio.search.model.index.CallNumberResource;
import org.folio.search.model.index.InstanceSubResource;
import org.folio.search.model.service.BrowseContext;
import org.folio.search.model.types.ResourceType;
@@ -34,6 +34,7 @@ public class ConsortiumSearchHelper {
private static final Logger logger = LoggerFactory.getLogger(ConsortiumSearchHelper.class);
private static final String BROWSE_SHARED_FILTER_KEY = "instances.shared";
private static final String BROWSE_TENANT_FILTER_KEY = "instances.tenantId";
+ private static final String BROWSE_LOCATION_FILTER_KEY = "instances.locationId";
private final FolioExecutionContext folioExecutionContext;
private final ConsortiumTenantService consortiumTenantService;
@@ -138,22 +139,29 @@ public Set filterSubResourcesForConsortium(
}
return subResources.stream()
.filter(subResourcesFilter)
+ .filter(instanceSubResource -> filterForCallNumbers(context, resource, instanceSubResource))
.collect(Collectors.toSet());
}
- public static Optional getBrowseFilter(BrowseContext context, String filterKey) {
+ protected Optional getBrowseFilter(BrowseContext context, String filterKey) {
return context.getFilters().stream()
.map(filter -> getTermFilterForKey(filter, filterKey))
.filter(Objects::nonNull)
.findFirst();
}
- public static List
- *
- * @param context - call number browse context
- * @param callNumberTypeValue - call number type to check/compare result items' types
- * @param browseItems - list of CallNumberBrowseItem objects
- * @return filtered records
- */
- public static List excludeIrrelevantResultItems(BrowseContext context,
- String callNumberTypeValue,
- Set folioCallNumberTypes,
- List browseItems) {
- var callNumberType = Optional.ofNullable(StringUtils.trimToNull(callNumberTypeValue));
- var tenantFilter = ConsortiumSearchHelper.getBrowseFilter(context, BROWSE_TENANT_FILTER_KEY);
- var locationFilter = ConsortiumSearchHelper.getBrowseFilterValues(context, BROWSE_LOCATION_FILTER_KEY);
- if (browseItems == null || browseItems.isEmpty()
- || callNumberType.isEmpty() && tenantFilter.isEmpty() && locationFilter.isEmpty()) {
- return browseItems;
- }
-
- browseItems.forEach(r -> {
- if (r.getInstance() != null) {
- r.getInstance().setItems(
- getItemsFiltered(tenantFilter, locationFilter, callNumberType, folioCallNumberTypes, r));
- }
- });
- return browseItems.stream()
- .filter(CallNumberUtils::isItemRelevant)
- .toList();
- }
-
private static Optional getValidShelfKey(CallNumber value) {
return Optional.of(value)
.filter(CallNumber::isValid)
.map(CallNumber::getShelfKey);
}
- @NotNull
- private static List<@Valid Item> getItemsFiltered(Optional tenantFilter,
- List