Skip to content

Commit

Permalink
fix(cn-browse): Return result only for desired cn type (#475)
Browse files Browse the repository at this point in the history
* fix(cn-browse): Return result only for desired cn type

- Browse only for shelving order using desired cn type
- Browse for multiple anchors (shelf keys generated using different algorithms) only if cn type not passed

Closes: MSEARCH-605

(cherry picked from commit 57bf914)
  • Loading branch information
viacheslavkol authored and psmagin committed Nov 30, 2023
1 parent b8011e9 commit ea195cc
Show file tree
Hide file tree
Showing 8 changed files with 94 additions and 54 deletions.
3 changes: 3 additions & 0 deletions NEWS.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
## v3.0.4 2023-11-30
### Bug fixes
* Fix shared filter for subjects/contributors ([MSEARCH-639](https://issues.folio.org/browse/MSEARCH-639))
* Return result only for desired cn type on browse ([MSEARCH-605](https://issues.folio.org/browse/MSEARCH-605))

---

## v3.0.3 2023-11-15
### Tech Dept
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.Function;
import org.folio.search.domain.dto.CallNumberType;
import org.marc4j.callnum.CallNumber;
import org.marc4j.callnum.DeweyCallNumber;
import org.marc4j.callnum.LCCallNumber;
Expand All @@ -14,6 +17,13 @@
@Component
public class EffectiveShelvingOrderTermProcessor implements SearchTermProcessor {

private static final Map<String, Function<String, Optional<String>>> CN_TYPE_TO_SHELF_KEY_GENERATOR = Map.of(
CallNumberType.NLM.getValue(), cn -> getValidShelfKey(new NlmCallNumber(cn)),
CallNumberType.LC.getValue(), cn -> getValidShelfKey(new LCCallNumber(cn)),
CallNumberType.DEWEY.getValue(), cn -> getValidShelfKey(new DeweyCallNumber(cn)),
CallNumberType.SUDOC.getValue(), cn -> getValidShelfKey(new SuDocCallNumber(cn))
);

@Override
public String getSearchTerm(String inputTerm) {
return getValidShelfKey(new NlmCallNumber(inputTerm))
Expand All @@ -24,6 +34,16 @@ public String getSearchTerm(String inputTerm) {
.trim();
}

public String getSearchTerm(String inputTerm, String callNumberTypeName) {
if (callNumberTypeName == null) {
return normalizeEffectiveShelvingOrder(inputTerm);
}

return Optional.ofNullable(CN_TYPE_TO_SHELF_KEY_GENERATOR.get(callNumberTypeName))
.flatMap(function -> function.apply(inputTerm))
.orElse(normalizeEffectiveShelvingOrder(inputTerm));
}

public List<String> getSearchTerms(String inputTerm) {
var searchTerms = new ArrayList<String>();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import static java.util.Collections.singletonList;
import static org.apache.commons.collections.CollectionUtils.isEmpty;
import static org.apache.commons.collections.CollectionUtils.isNotEmpty;
import static org.apache.commons.lang3.StringUtils.isBlank;
import static org.folio.search.client.InventoryReferenceDataClient.ReferenceDataType.CALL_NUMBER_TYPES;
import static org.folio.search.model.client.CqlQueryParam.SOURCE;
import static org.folio.search.model.types.CallNumberTypeSource.FOLIO;
Expand Down Expand Up @@ -53,15 +54,19 @@ public class CallNumberBrowseService extends AbstractBrowseService<CallNumberBro
protected BrowseResult<CallNumberBrowseItem> browseInOneDirection(BrowseRequest request, BrowseContext context) {
log.debug("browseInOneDirection:: by: [request: {}]", request);

var callNumber = callNumberFromRequest(request);
var initialAnchor = effectiveShelvingOrderTermProcessor.getSearchTerm(callNumber, request.getRefinedCondition());
if (!initialAnchor.equals(context.getAnchor())) {
context = buildBrowseContext(context, initialAnchor);
}

var isBrowsingForward = context.isBrowsingForward();
var searchSource = callNumberBrowseQueryProvider.get(request, context, isBrowsingForward);
var searchResponse = searchRepository.search(request, searchSource);

if (!isAnchorPresent(searchResponse, context)) {
if (isBlank(request.getRefinedCondition()) && !isAnchorPresent(searchResponse, context)) {
var anchors = getAnchors(request);
if (!anchors.isEmpty()) {
anchors.remove(0);
}
anchors.remove(initialAnchor);
for (String anchor : anchors) {
var contextForAnchor = buildBrowseContext(context, anchor);
var searchSourceForAnchor = callNumberBrowseQueryProvider.get(request, contextForAnchor, isBrowsingForward);
Expand Down Expand Up @@ -90,17 +95,19 @@ protected BrowseResult<CallNumberBrowseItem> browseInOneDirection(BrowseRequest
protected BrowseResult<CallNumberBrowseItem> browseAround(BrowseRequest request, BrowseContext context) {
log.debug("browseAround:: by: [request: {}]", request);

var callNumber = callNumberFromRequest(request);
var initialAnchor = effectiveShelvingOrderTermProcessor.getSearchTerm(callNumber, request.getRefinedCondition());
if (!initialAnchor.equals(context.getAnchor())) {
context = buildBrowseContext(context, initialAnchor);
}

var precedingQuery = callNumberBrowseQueryProvider.get(request, context, false);
var succeedingQuery = callNumberBrowseQueryProvider.get(request, context, true);
var responses = getBrowseAround(request, precedingQuery, succeedingQuery);

var callNumber = callNumberFromRequest(request);

if (!isAnchorPresent(responses[1].getResponse(), context)) {
if (isBlank(request.getRefinedCondition()) && !isAnchorPresent(responses[1].getResponse(), context)) {
var anchors = getAnchors(callNumber);
if (!anchors.isEmpty()) {
anchors.remove(0);
}
anchors.remove(initialAnchor);
for (String anchor : anchors) {
var contextForAnchor = buildBrowseContext(context, anchor);
var precedingQueryForAnchor = callNumberBrowseQueryProvider.get(request, contextForAnchor, false);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@
import static org.folio.search.support.base.ApiEndpoints.instanceCallNumberBrowsePath;
import static org.folio.search.utils.TestConstants.TENANT_ID;
import static org.folio.search.utils.TestUtils.cnBrowseItemWithNoType;
import static org.folio.search.utils.TestUtils.getShelfKeyFromCallNumber;
import static org.folio.search.utils.TestUtils.parseResponse;
import static org.folio.search.utils.TestUtils.randomId;
import static org.folio.search.utils.TestUtils.shelfKeyForNotTypedCallNumberFunction;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;

import java.util.Arrays;
Expand Down Expand Up @@ -126,7 +126,7 @@ private static Instance instance(List<Object> data) {
.id(randomId())
.discoverySuppress(false)
.effectiveCallNumberComponents(new ItemEffectiveCallNumberComponents().callNumber(callNumber))
.effectiveShelvingOrder(shelfKeyForNotTypedCallNumberFunction().apply(callNumber)))
.effectiveShelvingOrder(getShelfKeyFromCallNumber(callNumber)))
.toList();

return new Instance()
Expand Down
Loading

0 comments on commit ea195cc

Please sign in to comment.