diff --git a/NEWS.md b/NEWS.md index cd50a1cee..d5c2668cc 100644 --- a/NEWS.md +++ b/NEWS.md @@ -15,6 +15,7 @@ * Call Numbers Browse: Implement Call Number Browse Config ([MSEARCH-863](https://folio-org.atlassian.net/browse/MSEARCH-863)) * 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)) ### Bug fixes * Remove shelving order calculation for local call-number types diff --git a/README.md b/README.md index 23df34ac7..3d7b38eb3 100644 --- a/README.md +++ b/README.md @@ -778,6 +778,12 @@ does not produce any values, so the following search options will return an empt |:------------------------|:----:|:------------------------------------|:------------------------------------------------| | `contributorNameTypeId` | term | `contributorNameTypeId == "123456"` | Matches contributors with `123456` name type id | +##### Call-numbers search options + +| Option | Type | Example | Description | +|:-------------------|:----:|:-------------------------------|:--------------------------------------------------------------------------------------------------------------------------------| +| `callNumberTypeId` | term | `callNumberTypeId == "123456"` | Matches call-numbers with `123456` call-number type id. Support aliases by call-number browse options: `callNumberTypeId == lc` | + #### Search Facets Facets can be retrieved by using following API `GET /{recordType}/facets`. It consumes following request parameters: @@ -876,6 +882,14 @@ GET /instances/facets?query=title all book&facet=source:5,discoverySuppress:2 | `instances.tenantId` | term | Requests a tenantId facet | | `instances.shared` | term | Requests a shared/local facet | +##### Classifications facets + +| Option | Type | Description | +|:-----------------------|:----:|:------------------------------| +| `instances.locationId` | term | Requests a location facet | +| `instances.tenantId` | term | Requests a tenantId facet | +| `instances.shared` | term | Requests a shared/local facet | + #### Sorting results The default sorting is by relevancy. The `sortBy` clause is used to define sorting, for example: diff --git a/src/main/java/org/folio/search/cql/CqlTermQueryConverter.java b/src/main/java/org/folio/search/cql/CqlTermQueryConverter.java index 868b7a6fa..bf158fee5 100644 --- a/src/main/java/org/folio/search/cql/CqlTermQueryConverter.java +++ b/src/main/java/org/folio/search/cql/CqlTermQueryConverter.java @@ -16,6 +16,7 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; import org.folio.search.cql.builders.TermQueryBuilder; +import org.folio.search.cql.searchterm.SearchTermProcessor; import org.folio.search.exception.RequestValidationException; import org.folio.search.exception.ValidationException; import org.folio.search.model.metadata.PlainFieldDescription; diff --git a/src/main/java/org/folio/search/cql/builders/ExactTermQueryBuilder.java b/src/main/java/org/folio/search/cql/builders/ExactTermQueryBuilder.java index c6a1eba7b..f7619e163 100644 --- a/src/main/java/org/folio/search/cql/builders/ExactTermQueryBuilder.java +++ b/src/main/java/org/folio/search/cql/builders/ExactTermQueryBuilder.java @@ -7,6 +7,7 @@ import static org.opensearch.index.query.QueryBuilders.multiMatchQuery; import static org.opensearch.index.query.QueryBuilders.scriptQuery; import static org.opensearch.index.query.QueryBuilders.termQuery; +import static org.opensearch.index.query.QueryBuilders.termsQuery; import java.util.Arrays; import java.util.List; @@ -46,6 +47,9 @@ public QueryBuilder getFulltextQuery(Object term, String fieldName, ResourceType @Override public QueryBuilder getTermLevelQuery(Object term, String fieldName, ResourceType resource, String fieldIndex) { + if (term instanceof String[] termArray) { + return termArray.length > 1 ? termsQuery(fieldName, termArray) : termQuery(fieldName, termArray[0]); + } return EMPTY_ARRAY.equals(term) && KEYWORD_FIELD_INDEX.equals(fieldIndex) ? getEmptyArrayScriptQuery(fieldName) : termQuery(fieldName, term); diff --git a/src/main/java/org/folio/search/cql/CallNumberSearchTermProcessor.java b/src/main/java/org/folio/search/cql/searchterm/CallNumberSearchTermProcessor.java similarity index 92% rename from src/main/java/org/folio/search/cql/CallNumberSearchTermProcessor.java rename to src/main/java/org/folio/search/cql/searchterm/CallNumberSearchTermProcessor.java index 9e269c2d5..5516ed9fa 100644 --- a/src/main/java/org/folio/search/cql/CallNumberSearchTermProcessor.java +++ b/src/main/java/org/folio/search/cql/searchterm/CallNumberSearchTermProcessor.java @@ -1,4 +1,4 @@ -package org.folio.search.cql; +package org.folio.search.cql.searchterm; import static org.folio.search.utils.CallNumberUtils.normalizeCallNumberComponents; import static org.folio.search.utils.SearchUtils.ASTERISKS_SIGN; diff --git a/src/main/java/org/folio/search/cql/searchterm/CallNumberTypeIdSearchTermProcessor.java b/src/main/java/org/folio/search/cql/searchterm/CallNumberTypeIdSearchTermProcessor.java new file mode 100644 index 000000000..5f2591f87 --- /dev/null +++ b/src/main/java/org/folio/search/cql/searchterm/CallNumberTypeIdSearchTermProcessor.java @@ -0,0 +1,25 @@ +package org.folio.search.cql.searchterm; + +import lombok.RequiredArgsConstructor; +import org.folio.search.domain.dto.BrowseOptionType; +import org.folio.search.domain.dto.BrowseType; +import org.folio.search.service.consortium.BrowseConfigServiceDecorator; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class CallNumberTypeIdSearchTermProcessor implements SearchTermProcessor { + + private final BrowseConfigServiceDecorator configService; + + @Override + public Object getSearchTerm(String inputTerm) { + try { + var browseOptionType = BrowseOptionType.fromValue(inputTerm); + var browseConfig = configService.getConfig(BrowseType.CALL_NUMBER, browseOptionType); + return browseConfig.getTypeIds().stream().map(Object::toString).toArray(String[]::new); + } catch (IllegalArgumentException e) { + return inputTerm; + } + } +} diff --git a/src/main/java/org/folio/search/cql/ClassificationNumberSearchTermProcessor.java b/src/main/java/org/folio/search/cql/searchterm/ClassificationNumberSearchTermProcessor.java similarity index 95% rename from src/main/java/org/folio/search/cql/ClassificationNumberSearchTermProcessor.java rename to src/main/java/org/folio/search/cql/searchterm/ClassificationNumberSearchTermProcessor.java index 2c2333a49..e59c60777 100644 --- a/src/main/java/org/folio/search/cql/ClassificationNumberSearchTermProcessor.java +++ b/src/main/java/org/folio/search/cql/searchterm/ClassificationNumberSearchTermProcessor.java @@ -1,4 +1,4 @@ -package org.folio.search.cql; +package org.folio.search.cql.searchterm; import static org.apache.commons.lang3.StringUtils.EMPTY; import static org.apache.commons.lang3.StringUtils.isBlank; diff --git a/src/main/java/org/folio/search/cql/EffectiveShelvingOrderTermProcessor.java b/src/main/java/org/folio/search/cql/searchterm/EffectiveShelvingOrderTermProcessor.java similarity index 96% rename from src/main/java/org/folio/search/cql/EffectiveShelvingOrderTermProcessor.java rename to src/main/java/org/folio/search/cql/searchterm/EffectiveShelvingOrderTermProcessor.java index ee580159b..abd616565 100644 --- a/src/main/java/org/folio/search/cql/EffectiveShelvingOrderTermProcessor.java +++ b/src/main/java/org/folio/search/cql/searchterm/EffectiveShelvingOrderTermProcessor.java @@ -1,4 +1,4 @@ -package org.folio.search.cql; +package org.folio.search.cql.searchterm; import static org.folio.search.utils.CallNumberUtils.getShelfKeyFromCallNumber; import static org.folio.search.utils.CallNumberUtils.normalizeEffectiveShelvingOrder; @@ -8,6 +8,7 @@ import java.util.Map; import java.util.Optional; import java.util.function.Function; +import org.folio.search.cql.SuDocCallNumber; import org.folio.search.domain.dto.CallNumberType; import org.marc4j.callnum.CallNumber; import org.marc4j.callnum.DeweyCallNumber; diff --git a/src/main/java/org/folio/search/cql/IsbnSearchTermProcessor.java b/src/main/java/org/folio/search/cql/searchterm/IsbnSearchTermProcessor.java similarity index 91% rename from src/main/java/org/folio/search/cql/IsbnSearchTermProcessor.java rename to src/main/java/org/folio/search/cql/searchterm/IsbnSearchTermProcessor.java index e7b69eee4..c7ab61b1f 100644 --- a/src/main/java/org/folio/search/cql/IsbnSearchTermProcessor.java +++ b/src/main/java/org/folio/search/cql/searchterm/IsbnSearchTermProcessor.java @@ -1,4 +1,4 @@ -package org.folio.search.cql; +package org.folio.search.cql.searchterm; import lombok.RequiredArgsConstructor; import org.folio.search.service.setter.instance.IsbnProcessor; diff --git a/src/main/java/org/folio/search/cql/LccnSearchTermProcessor.java b/src/main/java/org/folio/search/cql/searchterm/LccnSearchTermProcessor.java similarity index 91% rename from src/main/java/org/folio/search/cql/LccnSearchTermProcessor.java rename to src/main/java/org/folio/search/cql/searchterm/LccnSearchTermProcessor.java index decf0a617..bc628c529 100644 --- a/src/main/java/org/folio/search/cql/LccnSearchTermProcessor.java +++ b/src/main/java/org/folio/search/cql/searchterm/LccnSearchTermProcessor.java @@ -1,4 +1,4 @@ -package org.folio.search.cql; +package org.folio.search.cql.searchterm; import lombok.RequiredArgsConstructor; import org.folio.search.service.lccn.LccnNormalizer; diff --git a/src/main/java/org/folio/search/cql/OclcSearchTermProcessor.java b/src/main/java/org/folio/search/cql/searchterm/OclcSearchTermProcessor.java similarity index 91% rename from src/main/java/org/folio/search/cql/OclcSearchTermProcessor.java rename to src/main/java/org/folio/search/cql/searchterm/OclcSearchTermProcessor.java index 010e728c4..77d87fa87 100644 --- a/src/main/java/org/folio/search/cql/OclcSearchTermProcessor.java +++ b/src/main/java/org/folio/search/cql/searchterm/OclcSearchTermProcessor.java @@ -1,4 +1,4 @@ -package org.folio.search.cql; +package org.folio.search.cql.searchterm; import lombok.RequiredArgsConstructor; import org.folio.search.service.setter.instance.OclcProcessor; diff --git a/src/main/java/org/folio/search/cql/SearchTermProcessor.java b/src/main/java/org/folio/search/cql/searchterm/SearchTermProcessor.java similarity index 67% rename from src/main/java/org/folio/search/cql/SearchTermProcessor.java rename to src/main/java/org/folio/search/cql/searchterm/SearchTermProcessor.java index 573b06fb8..4e0a59895 100644 --- a/src/main/java/org/folio/search/cql/SearchTermProcessor.java +++ b/src/main/java/org/folio/search/cql/searchterm/SearchTermProcessor.java @@ -1,4 +1,4 @@ -package org.folio.search.cql; +package org.folio.search.cql.searchterm; public interface SearchTermProcessor { diff --git a/src/main/java/org/folio/search/utils/SearchQueryUtils.java b/src/main/java/org/folio/search/utils/SearchQueryUtils.java index a11da6a22..26c75f8c4 100644 --- a/src/main/java/org/folio/search/utils/SearchQueryUtils.java +++ b/src/main/java/org/folio/search/utils/SearchQueryUtils.java @@ -18,6 +18,7 @@ import org.opensearch.index.query.QueryBuilder; import org.opensearch.index.query.RangeQueryBuilder; import org.opensearch.index.query.TermQueryBuilder; +import org.opensearch.index.query.TermsQueryBuilder; import org.opensearch.search.aggregations.AggregationBuilders; import org.opensearch.search.aggregations.bucket.terms.IncludeExclude; import org.opensearch.search.builder.SearchSourceBuilder; @@ -75,7 +76,8 @@ public static boolean isDisjunctionFilterQuery(QueryBuilder query, Predicate check) { - return query instanceof TermQueryBuilder && check.test(((TermQueryBuilder) query).fieldName()) + return query instanceof TermsQueryBuilder && check.test(((TermsQueryBuilder) query).fieldName()) + || query instanceof TermQueryBuilder && check.test(((TermQueryBuilder) query).fieldName()) || query instanceof RangeQueryBuilder && check.test(((RangeQueryBuilder) query).fieldName()); } diff --git a/src/main/resources/model/instance_call_number.json b/src/main/resources/model/instance_call_number.json index 63acb5142..4539e86fd 100644 --- a/src/main/resources/model/instance_call_number.json +++ b/src/main/resources/model/instance_call_number.json @@ -21,8 +21,9 @@ }, "callNumberTypeId": { "index": "keyword", - "searchTypes": [ "facet" ], - "showInResponse": [ "browse" ] + "searchTypes": [ "filter", "facet" ], + "showInResponse": [ "browse" ], + "searchTermProcessor": "callNumberTypeIdSearchTermProcessor" }, "volume": { "index": "source", diff --git a/src/main/resources/swagger.api/examples/result/browseCallNumberResult.yaml b/src/main/resources/swagger.api/examples/result/browseCallNumberResult.yaml index 18869de02..d7daa0886 100644 --- a/src/main/resources/swagger.api/examples/result/browseCallNumberResult.yaml +++ b/src/main/resources/swagger.api/examples/result/browseCallNumberResult.yaml @@ -1,33 +1,16 @@ value: items: - - fullCallNumber: "Bilingualism: a bibliography of 1000 references with special reference to Wales." - shelfKey: "Bilingualism: a bibliography of 1000 references with special reference to Wales." + - fullCallNumber: "NS 1 .B5" + callNumber: "NS 1 .B4" + callNumberTypeId: "2b94c631-fca9-4892-a730-03ee529ff6c3" + prefix: "pref1" isAnchor: true totalRecords: 1 - instance: - id: "d20569a7-9bba-44dd-9ad5-6f8f1d24ee1f" - title: "Bilingualism: a bibliography of 1000 references with special reference to Wales." - contributors: - - name: "Eichhorst, Georg." - publication: - - publisher: "Duncker und Humblot" - dateOfPublication: "1976" - electronicAccess: - - uri: "http://www.example.com" - notes: - - note: "Staff note" - items: - - barcode: "12345" - notes: - - note: "Staff note" - electronicAccess: - - uri: "http://www.example.com" - holdings: - - callNumber: "FS 124.44" - notes: - - note: "Staff note" - electronicAccess: - - uri: "http://www.example.com" - prev: "string" - next: "string" - totalRecords: 1 \ No newline at end of file + - fullCallNumber: "NS 1 .B5 suf-1801" + callNumber: "NS 1 .B5" + suffix: "suf-1801" + isAnchor: true + totalRecords: 1 + prev: "NS 1 .B4" + next: "NS 1 .B5 suf-1801" + totalRecords: 2 \ No newline at end of file diff --git a/src/main/resources/swagger.api/parameters/instance-call-number-browse-cql-query.yaml b/src/main/resources/swagger.api/parameters/instance-call-number-browse-cql-query.yaml index 27360a890..e1b0e5fca 100644 --- a/src/main/resources/swagger.api/parameters/instance-call-number-browse-cql-query.yaml +++ b/src/main/resources/swagger.api/parameters/instance-call-number-browse-cql-query.yaml @@ -2,7 +2,7 @@ name: query in: query required: true description: | - A CQL query string with filter conditions must include anchor query with range conditions. Anchor field is `number`. + A CQL query string with filter conditions must include anchor query with range conditions. Anchor field is `fullCallNumber`. Filters support logic operators `AND` and `OR`. All filters should be combined in parentheses. Anchor will be included only if `<=` or `>=` are used in the query. Otherwise, the empty row will be added if `highlightMatch` is equal to `true`. @@ -30,6 +30,18 @@ description: | + + + + + + + + + + + +
== Filter by shared/non-shared in consortium
instances.locationIdstring==Filter by location ID
callNumberTypeIdstring==Filter by call-number type ID
schema: @@ -45,5 +57,5 @@ examples: value: number >= "DT571.F84" summary: Search for all classification numbers before "DT571.F84" browseAroundWithFilters: - value: (number >= "DT571.F84" or number < "DT571.F84") and instances.shared==false + value: (number >= "DT571.F84" or number < "DT571.F84") and instances.shared==false and instances.locationId=="2b94c631-fca9-4892-a730-03ee529ff6c3" summary: Search for local classification numbers before and after "DT571.F84" \ No newline at end of file diff --git a/src/main/resources/swagger.api/paths/browse-call-numbers/browse-instance-call-numbers.yaml b/src/main/resources/swagger.api/paths/browse-call-numbers/browse-instance-call-numbers.yaml index 189629dbb..26129f580 100644 --- a/src/main/resources/swagger.api/paths/browse-call-numbers/browse-instance-call-numbers.yaml +++ b/src/main/resources/swagger.api/paths/browse-call-numbers/browse-instance-call-numbers.yaml @@ -18,7 +18,7 @@ get: application/json: examples: browseResult: - $ref: '../../examples/result/browseClassificationNumberResult.yaml' + $ref: '../../examples/result/browseCallNumberResult.yaml' schema: $ref: '../../schemas/response/callNumberBrowseResult.yaml' '400': diff --git a/src/test/java/org/folio/search/controller/BrowseCallNumberIT.java b/src/test/java/org/folio/search/controller/BrowseCallNumberIT.java index 3dc177f82..c4307186b 100644 --- a/src/test/java/org/folio/search/controller/BrowseCallNumberIT.java +++ b/src/test/java/org/folio/search/controller/BrowseCallNumberIT.java @@ -106,6 +106,8 @@ private static Stream facetQueriesProvider() { arguments("cql.allRecords=1", array("instances.locationId"), mapOf("instances.locationId", facet(facetItem(locations.get(1), 42), facetItem(locations.get(2), 34), facetItem(locations.get(3), 24)))), arguments("callNumberTypeId=\"" + LC.getId() + "\"", array("instances.locationId"), mapOf("instances.locationId", + facet(facetItem(locations.get(1), 8), facetItem(locations.get(2), 8), facetItem(locations.get(3), 4)))), + arguments("callNumberTypeId==lc", array("instances.locationId"), mapOf("instances.locationId", facet(facetItem(locations.get(1), 8), facetItem(locations.get(2), 8), facetItem(locations.get(3), 4)))) ); } diff --git a/src/test/java/org/folio/search/cql/CallNumberSearchTermProcessorTest.java b/src/test/java/org/folio/search/cql/CallNumberSearchTermProcessorTest.java index 56bc75560..675b47bba 100644 --- a/src/test/java/org/folio/search/cql/CallNumberSearchTermProcessorTest.java +++ b/src/test/java/org/folio/search/cql/CallNumberSearchTermProcessorTest.java @@ -2,6 +2,7 @@ import static org.assertj.core.api.Assertions.assertThat; +import org.folio.search.cql.searchterm.CallNumberSearchTermProcessor; import org.folio.spring.testing.type.UnitTest; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; diff --git a/src/test/java/org/folio/search/cql/ClassificationNumberSearchTermProcessorTest.java b/src/test/java/org/folio/search/cql/ClassificationNumberSearchTermProcessorTest.java index 1df24b925..615384392 100644 --- a/src/test/java/org/folio/search/cql/ClassificationNumberSearchTermProcessorTest.java +++ b/src/test/java/org/folio/search/cql/ClassificationNumberSearchTermProcessorTest.java @@ -3,6 +3,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.stream.Stream; +import org.folio.search.cql.searchterm.ClassificationNumberSearchTermProcessor; import org.folio.spring.testing.type.UnitTest; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; diff --git a/src/test/java/org/folio/search/cql/CqlSearchQueryConverterTest.java b/src/test/java/org/folio/search/cql/CqlSearchQueryConverterTest.java index 9a081c1b1..a1c094ce6 100644 --- a/src/test/java/org/folio/search/cql/CqlSearchQueryConverterTest.java +++ b/src/test/java/org/folio/search/cql/CqlSearchQueryConverterTest.java @@ -34,6 +34,7 @@ import java.util.Optional; import java.util.stream.Stream; import org.folio.search.cql.CqlSearchQueryConverterTest.ConverterTestConfiguration; +import org.folio.search.cql.searchterm.SearchTermProcessor; import org.folio.search.exception.RequestValidationException; import org.folio.search.exception.SearchServiceException; import org.folio.search.model.metadata.PlainFieldDescription; diff --git a/src/test/java/org/folio/search/cql/CqlTermQueryConverterTest.java b/src/test/java/org/folio/search/cql/CqlTermQueryConverterTest.java index dddee2118..14d454aa7 100644 --- a/src/test/java/org/folio/search/cql/CqlTermQueryConverterTest.java +++ b/src/test/java/org/folio/search/cql/CqlTermQueryConverterTest.java @@ -24,6 +24,7 @@ import java.util.Optional; import java.util.Set; import org.folio.search.cql.builders.TermQueryBuilder; +import org.folio.search.cql.searchterm.SearchTermProcessor; import org.folio.search.exception.RequestValidationException; import org.folio.search.exception.ValidationException; import org.folio.search.service.metadata.LocalSearchFieldProvider; diff --git a/src/test/java/org/folio/search/cql/EffectiveShelvingOrderTermProcessorTest.java b/src/test/java/org/folio/search/cql/EffectiveShelvingOrderTermProcessorTest.java index db07129cf..1c0ef3ffd 100644 --- a/src/test/java/org/folio/search/cql/EffectiveShelvingOrderTermProcessorTest.java +++ b/src/test/java/org/folio/search/cql/EffectiveShelvingOrderTermProcessorTest.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.stream.Collectors; +import org.folio.search.cql.searchterm.EffectiveShelvingOrderTermProcessor; import org.folio.spring.testing.type.UnitTest; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; diff --git a/src/test/java/org/folio/search/cql/IsbnSearchTermProcessorTest.java b/src/test/java/org/folio/search/cql/IsbnSearchTermProcessorTest.java index 90728c2d6..4a8f17d18 100644 --- a/src/test/java/org/folio/search/cql/IsbnSearchTermProcessorTest.java +++ b/src/test/java/org/folio/search/cql/IsbnSearchTermProcessorTest.java @@ -4,6 +4,7 @@ import static org.mockito.Mockito.when; import java.util.List; +import org.folio.search.cql.searchterm.IsbnSearchTermProcessor; import org.folio.search.service.setter.instance.IsbnProcessor; import org.folio.spring.testing.type.UnitTest; import org.junit.jupiter.api.Test; diff --git a/src/test/java/org/folio/search/cql/LccnSearchTermProcessorTest.java b/src/test/java/org/folio/search/cql/LccnSearchTermProcessorTest.java index e0eac345b..b48eea3d6 100644 --- a/src/test/java/org/folio/search/cql/LccnSearchTermProcessorTest.java +++ b/src/test/java/org/folio/search/cql/LccnSearchTermProcessorTest.java @@ -4,6 +4,7 @@ import static org.mockito.Mockito.when; import java.util.Optional; +import org.folio.search.cql.searchterm.LccnSearchTermProcessor; import org.folio.search.service.lccn.LccnNormalizer; import org.folio.spring.testing.type.UnitTest; import org.junit.jupiter.api.Test; diff --git a/src/test/java/org/folio/search/cql/OclcSearchTermProcessorTest.java b/src/test/java/org/folio/search/cql/OclcSearchTermProcessorTest.java index 20efdde90..6b6204a8a 100644 --- a/src/test/java/org/folio/search/cql/OclcSearchTermProcessorTest.java +++ b/src/test/java/org/folio/search/cql/OclcSearchTermProcessorTest.java @@ -3,6 +3,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.when; +import org.folio.search.cql.searchterm.OclcSearchTermProcessor; import org.folio.search.service.setter.instance.OclcProcessor; import org.folio.spring.testing.type.UnitTest; import org.junit.jupiter.api.Test; diff --git a/src/test/java/org/folio/search/cql/builders/ExactTermQueryBuilderTest.java b/src/test/java/org/folio/search/cql/builders/ExactTermQueryBuilderTest.java index cdb9b8a83..f71d9de05 100644 --- a/src/test/java/org/folio/search/cql/builders/ExactTermQueryBuilderTest.java +++ b/src/test/java/org/folio/search/cql/builders/ExactTermQueryBuilderTest.java @@ -12,6 +12,7 @@ import static org.opensearch.index.query.QueryBuilders.multiMatchQuery; import static org.opensearch.index.query.QueryBuilders.scriptQuery; import static org.opensearch.index.query.QueryBuilders.termQuery; +import static org.opensearch.index.query.QueryBuilders.termsQuery; import java.util.List; import java.util.Optional; @@ -95,6 +96,19 @@ void getTermLevelQuery_positive_emptyArrayValueNonKeywordField() { assertThat(actual).isEqualTo(termQuery("field", "[]")); } + @Test + void getTermLevelQuery_positive_arrayOfTermsWithSizeLessThen1() { + var actual = queryBuilder.getTermLevelQuery(new String[]{"val1"}, "field", UNKNOWN, null); + assertThat(actual).isEqualTo(termQuery("field", "val1")); + } + + + @Test + void getTermLevelQuery_positive_arrayOfTermsWithSizeGreaterThen1() { + var actual = queryBuilder.getTermLevelQuery(new String[]{"val1", "val2"}, "field", UNKNOWN, null); + assertThat(actual).isEqualTo(termsQuery("field", "val1", "val2")); + } + @Test void getSupportedComparators_positive() { var actual = queryBuilder.getSupportedComparators(); diff --git a/src/test/java/org/folio/search/service/browse/LegacyCallNumberBrowseServiceTest.java b/src/test/java/org/folio/search/service/browse/LegacyCallNumberBrowseServiceTest.java index 7691bad23..abb9bdf31 100644 --- a/src/test/java/org/folio/search/service/browse/LegacyCallNumberBrowseServiceTest.java +++ b/src/test/java/org/folio/search/service/browse/LegacyCallNumberBrowseServiceTest.java @@ -24,7 +24,7 @@ import org.apache.lucene.search.TotalHits; import org.folio.search.configuration.properties.SearchConfigurationProperties; import org.folio.search.cql.CqlSearchQueryConverter; -import org.folio.search.cql.EffectiveShelvingOrderTermProcessor; +import org.folio.search.cql.searchterm.EffectiveShelvingOrderTermProcessor; import org.folio.search.domain.dto.Instance; import org.folio.search.domain.dto.Item; import org.folio.search.domain.dto.ItemEffectiveCallNumberComponents; diff --git a/src/test/java/org/folio/search/utils/SearchQueryUtilsTest.java b/src/test/java/org/folio/search/utils/SearchQueryUtilsTest.java index bd8fd3071..ed2a9d838 100644 --- a/src/test/java/org/folio/search/utils/SearchQueryUtilsTest.java +++ b/src/test/java/org/folio/search/utils/SearchQueryUtilsTest.java @@ -99,7 +99,8 @@ private static Stream isFilterQueryDataProvider() { arguments(rangeQuery("f").gt(10), false), arguments(matchQuery(FIELD, "value"), false), arguments(termQuery(FIELD, "value"), true), - arguments(termQuery("f", "v"), false) - ); + arguments(termQuery("f", "v"), false), + arguments(termsQuery(FIELD, "value"), true) + ); } }