diff --git a/src/main/java/org/folio/bulkops/domain/bean/Item.java b/src/main/java/org/folio/bulkops/domain/bean/Item.java index b8c104d63..c083ba9d9 100644 --- a/src/main/java/org/folio/bulkops/domain/bean/Item.java +++ b/src/main/java/org/folio/bulkops/domain/bean/Item.java @@ -1,7 +1,6 @@ package org.folio.bulkops.domain.bean; import static java.lang.Boolean.FALSE; -import static java.util.Collections.emptyList; import static java.util.Objects.isNull; import static java.util.Objects.nonNull; import static org.apache.commons.lang3.StringUtils.EMPTY; @@ -21,7 +20,6 @@ import lombok.NoArgsConstructor; import lombok.With; import org.folio.bulkops.domain.converter.BooleanConverter; -import org.folio.bulkops.domain.converter.BoundWithTitlesConverter; import org.folio.bulkops.domain.converter.CallNumberTypeConverter; import org.folio.bulkops.domain.converter.CirculationNoteListConverter; import org.folio.bulkops.domain.converter.DamagedStatusConverter; @@ -369,34 +367,21 @@ public ItemLocation getTemporaryLocation() { @UnifiedTableCell(visible = false) private List electronicAccess; - @JsonProperty("isBoundWith") - @CsvCustomBindByName(column = "Is bound with", converter = BooleanConverter.class) - @CsvCustomBindByPosition(position = 40, converter = BooleanConverter.class) - @UnifiedTableCell(visible = false) - private Boolean isBoundWith; - - @JsonProperty("boundWithTitles") - @Valid - @CsvCustomBindByName(column = "Bound with titles", converter = BoundWithTitlesConverter.class) - @CsvCustomBindByPosition(position = 41, converter = BoundWithTitlesConverter.class) - @UnifiedTableCell(visible = false) - private List boundWithTitles = emptyList(); - @JsonProperty("tags") @CsvCustomBindByName(column = "Tags", converter = TagsConverter.class) - @CsvCustomBindByPosition(position = 42, converter = TagsConverter.class) + @CsvCustomBindByPosition(position = 40, converter = TagsConverter.class) @UnifiedTableCell(visible = false) private Tags tags; @JsonProperty("holdingsRecordId") @CsvCustomBindByName(column = "Holdings UUID", converter = StringConverter.class) - @CsvCustomBindByPosition(position = 43, converter = StringConverter.class) + @CsvCustomBindByPosition(position = 41, converter = StringConverter.class) @UnifiedTableCell(visible = false) private String holdingsRecordId; @JsonProperty("tenantId") @CsvCustomBindByName(column = "Tenant", converter = StringConverter.class) - @CsvCustomBindByPosition(position = 44, converter = StringConverter.class) + @CsvCustomBindByPosition(position = 42, converter = StringConverter.class) @UnifiedTableCell(visible = false) private String tenantId; diff --git a/src/main/java/org/folio/bulkops/domain/converter/BoundWithTitlesConverter.java b/src/main/java/org/folio/bulkops/domain/converter/BoundWithTitlesConverter.java deleted file mode 100644 index 7b61f626b..000000000 --- a/src/main/java/org/folio/bulkops/domain/converter/BoundWithTitlesConverter.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.folio.bulkops.domain.converter; - -import static org.apache.commons.lang3.ObjectUtils.isEmpty; -import static org.apache.commons.lang3.StringUtils.EMPTY; -import static org.folio.bulkops.domain.format.SpecialCharacterEscaper.escape; -import static org.folio.bulkops.util.Constants.ARRAY_DELIMITER; -import static org.folio.bulkops.util.Constants.ITEM_DELIMITER; - -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; -import org.folio.bulkops.domain.bean.Title; - -public class BoundWithTitlesConverter extends BaseConverter<List<Title>> { - - @Override - public String convertToString(List<Title> object) { - return object.stream() - .filter(Objects::nonNull) - .map(this::titleToString) - .collect(Collectors.joining(ITEM_DELIMITER)); - } - - private String titleToString(Title title) { - return String.join( - ARRAY_DELIMITER, - escape( - isEmpty(title.getBriefHoldingsRecord()) - ? EMPTY - : title.getBriefHoldingsRecord().getHrid()), - escape(isEmpty(title.getBriefInstance()) ? EMPTY : title.getBriefInstance().getHrid()), - escape(isEmpty(title.getBriefInstance()) ? EMPTY : title.getBriefInstance().getTitle())); - } -} diff --git a/src/main/java/org/folio/bulkops/util/Constants.java b/src/main/java/org/folio/bulkops/util/Constants.java index 2b827fd3f..f75a3c680 100644 --- a/src/main/java/org/folio/bulkops/util/Constants.java +++ b/src/main/java/org/folio/bulkops/util/Constants.java @@ -197,4 +197,7 @@ public class Constants { public static final String PARENT_INSTANCES = "parentInstances"; public static final String PRECEDING_TITLES = "precedingTitles"; public static final String SUCCEEDING_TITLES = "succeedingTitles"; + public static final String PERMANENT_LOAN_TYPE = "permanentLoanType"; + public static final String TEMPORARY_LOAN_TYPE = "temporaryLoanType"; + public static final String EFFECTIVE_LOCATION = "effectiveLocation"; } diff --git a/src/main/java/org/folio/bulkops/util/FqmContentFetcher.java b/src/main/java/org/folio/bulkops/util/FqmContentFetcher.java index d9a6bba07..c1fe5ff0e 100644 --- a/src/main/java/org/folio/bulkops/util/FqmContentFetcher.java +++ b/src/main/java/org/folio/bulkops/util/FqmContentFetcher.java @@ -8,32 +8,51 @@ import static org.apache.commons.lang3.StringUtils.EMPTY; import static org.apache.commons.lang3.StringUtils.SPACE; import static org.folio.bulkops.util.Constants.CHILD_INSTANCES; +import static org.folio.bulkops.util.Constants.EFFECTIVE_LOCATION; import static org.folio.bulkops.util.Constants.ENTITY; import static org.folio.bulkops.util.Constants.HOLDINGS_DATA; import static org.folio.bulkops.util.Constants.HOLDINGS_LOCATION_CALL_NUMBER_DELIMITER; -import static org.folio.bulkops.util.Constants.ID; import static org.folio.bulkops.util.Constants.INSTANCE_TITLE; import static org.folio.bulkops.util.Constants.LINE_BREAK; import static org.folio.bulkops.util.Constants.MSG_SHADOW_RECORDS_CANNOT_BE_EDITED; import static org.folio.bulkops.util.Constants.NO_MATCH_FOUND_MESSAGE; import static org.folio.bulkops.util.Constants.PARENT_INSTANCES; +import static org.folio.bulkops.util.Constants.PERMANENT_LOAN_TYPE; import static org.folio.bulkops.util.Constants.PRECEDING_TITLES; import static org.folio.bulkops.util.Constants.SUCCEEDING_TITLES; +import static org.folio.bulkops.util.Constants.TEMPORARY_LOAN_TYPE; import static org.folio.bulkops.util.Constants.TENANT_ID; import static org.folio.bulkops.util.Constants.TITLE; import static org.folio.bulkops.util.FqmKeys.FQM_DATE_OF_PUBLICATION_KEY; +import static org.folio.bulkops.util.FqmKeys.FQM_HOLDINGS_CALL_NUMBER_KEY; +import static org.folio.bulkops.util.FqmKeys.FQM_HOLDINGS_CALL_NUMBER_PREFIX_KEY; +import static org.folio.bulkops.util.FqmKeys.FQM_HOLDINGS_CALL_NUMBER_SUFFIX_KEY; +import static org.folio.bulkops.util.FqmKeys.FQM_HOLDINGS_JSONB_KEY; +import static org.folio.bulkops.util.FqmKeys.FQM_HOLDINGS_TENANT_ID_KEY; +import static org.folio.bulkops.util.FqmKeys.FQM_HOLDING_PERMANENT_LOCATION_NAME_KEY; import static org.folio.bulkops.util.FqmKeys.FQM_INSTANCES_PUBLICATION_KEY; import static org.folio.bulkops.util.FqmKeys.FQM_INSTANCES_TITLE_KEY; import static org.folio.bulkops.util.FqmKeys.FQM_INSTANCE_CHILD_INSTANCES_KEY; import static org.folio.bulkops.util.FqmKeys.FQM_INSTANCE_ID_KEY; +import static org.folio.bulkops.util.FqmKeys.FQM_INSTANCE_JSONB_KEY; import static org.folio.bulkops.util.FqmKeys.FQM_INSTANCE_PARENT_INSTANCES_KEY; import static org.folio.bulkops.util.FqmKeys.FQM_INSTANCE_PRECEDING_TITLES_KEY; import static org.folio.bulkops.util.FqmKeys.FQM_INSTANCE_PUBLICATION_KEY; import static org.folio.bulkops.util.FqmKeys.FQM_INSTANCE_SHARED_KEY; import static org.folio.bulkops.util.FqmKeys.FQM_INSTANCE_SUCCEEDING_TITLES_KEY; +import static org.folio.bulkops.util.FqmKeys.FQM_INSTANCE_TENANT_ID_KEY; import static org.folio.bulkops.util.FqmKeys.FQM_INSTANCE_TITLE_KEY; +import static org.folio.bulkops.util.FqmKeys.FQM_ITEMS_JSONB_KEY; +import static org.folio.bulkops.util.FqmKeys.FQM_ITEMS_TENANT_ID_KEY; +import static org.folio.bulkops.util.FqmKeys.FQM_ITEM_EFFECTIVE_LOCATION_ID_KEY; +import static org.folio.bulkops.util.FqmKeys.FQM_ITEM_EFFECTIVE_LOCATION_NAME_KEY; +import static org.folio.bulkops.util.FqmKeys.FQM_ITEM_PERMANENT_LOAN_TYPE_ID_KEY; +import static org.folio.bulkops.util.FqmKeys.FQM_ITEM_PERMANENT_LOAN_TYPE_NAME_KEY; +import static org.folio.bulkops.util.FqmKeys.FQM_ITEM_TEMPORARY_LOAN_TYPE_ID_KEY; +import static org.folio.bulkops.util.FqmKeys.FQM_ITEM_TEMPORARY_LOAN_TYPE_NAME_KEY; import static org.folio.bulkops.util.FqmKeys.FQM_PUBLISHER_KEY; import static org.folio.bulkops.util.FqmKeys.FQM_USERS_ID_KEY; +import static org.folio.bulkops.util.FqmKeys.FQM_USERS_JSONB_KEY; import static org.folio.bulkops.util.FqmKeys.FQM_USERS_TYPE_KEY; import com.fasterxml.jackson.core.JsonProcessingException; @@ -94,6 +113,8 @@ public class FqmContentFetcher { public static final String MARC = "MARC"; private static final int BUFFER_SIZE = 64 * 1024; + public static final String ID = "id"; + public static final String NAME = "name"; @Value("${application.fqm-fetcher.max_parallel_chunks}") private int maxParallelChunks; @@ -136,7 +157,7 @@ public InputStream contents( UUID.fromString( entityTypeService.getFqmEntityTypeIdByBulkOpsEntityType(entityType).toString()); - String entityJsonKey = getEntityJsonKey(entityType); + List<String> entityJsonKeys = getEntityJsonKeys(entityType); boolean isCentralTenant = consortiaService.isTenantCentral(folioExecutionContext.getTenantId()); @@ -155,7 +176,7 @@ public InputStream contents( ContentsRequest req = new ContentsRequest() .entityTypeId(entityTypeId) - .fields(List.of(entityJsonKey)) + .fields(entityJsonKeys) .ids(chunk.stream().map(UUID::toString).map(List::of).toList()); return queryClient.getContents(req); }); @@ -464,7 +485,7 @@ private String processFqmJson( var tenant = json.get(getContentTenantKey(entityType)); if (tenant == null) { checkForTenantFieldExistenceInEcs( - jsonNode.get(ID).asText(), operationId, bulkOperationExecutionContents); + jsonNode.get(Constants.ID).asText(), operationId, bulkOperationExecutionContents); tenant = folioExecutionContext.getTenantId(); } jsonNode.put(TENANT_ID, tenant.toString()); @@ -496,19 +517,49 @@ private String processFqmJson( private String getEntityJsonKey(EntityType entityType) { return switch (entityType) { - case USER -> FqmKeys.FQM_USERS_JSONB_KEY; - case ITEM -> FqmKeys.FQM_ITEMS_JSONB_KEY; - case HOLDINGS_RECORD -> "holdings.jsonb"; - case INSTANCE, INSTANCE_MARC -> "instance.jsonb"; + case USER -> FQM_USERS_JSONB_KEY; + case ITEM -> FQM_ITEMS_JSONB_KEY; + case HOLDINGS_RECORD -> FQM_HOLDINGS_JSONB_KEY; + case INSTANCE, INSTANCE_MARC -> FQM_INSTANCE_JSONB_KEY; + }; + } + + private List<String> getEntityJsonKeys(EntityType entityType) { + return switch (entityType) { + case USER -> List.of(FQM_USERS_JSONB_KEY); + case ITEM -> + List.of( + FQM_ITEMS_JSONB_KEY, + FQM_INSTANCES_TITLE_KEY, + FQM_HOLDINGS_CALL_NUMBER_PREFIX_KEY, + FQM_HOLDINGS_CALL_NUMBER_SUFFIX_KEY, + FQM_HOLDINGS_CALL_NUMBER_KEY, + FQM_HOLDING_PERMANENT_LOCATION_NAME_KEY, + FQM_INSTANCES_PUBLICATION_KEY, + FQM_ITEM_PERMANENT_LOAN_TYPE_ID_KEY, + FQM_ITEM_PERMANENT_LOAN_TYPE_NAME_KEY, + FQM_ITEM_TEMPORARY_LOAN_TYPE_ID_KEY, + FQM_ITEM_TEMPORARY_LOAN_TYPE_NAME_KEY, + FQM_ITEM_EFFECTIVE_LOCATION_ID_KEY, + FQM_ITEM_TEMPORARY_LOAN_TYPE_NAME_KEY, + FQM_ITEMS_TENANT_ID_KEY); + case HOLDINGS_RECORD -> + List.of( + FQM_HOLDINGS_JSONB_KEY, + FQM_INSTANCE_TITLE_KEY, + FQM_INSTANCE_PUBLICATION_KEY, + FQM_HOLDINGS_TENANT_ID_KEY); + case INSTANCE, INSTANCE_MARC -> + List.of(FQM_INSTANCE_JSONB_KEY, FQM_INSTANCE_SHARED_KEY, FQM_INSTANCE_TENANT_ID_KEY); }; } private String getContentTenantKey(EntityType entityType) { return switch (entityType) { case USER -> StringUtils.EMPTY; - case ITEM -> "items.tenant_id"; - case HOLDINGS_RECORD -> "holdings.tenant_id"; - case INSTANCE, INSTANCE_MARC -> "instance.tenant_id"; + case ITEM -> FQM_ITEMS_TENANT_ID_KEY; + case HOLDINGS_RECORD -> FQM_HOLDINGS_TENANT_ID_KEY; + case INSTANCE, INSTANCE_MARC -> FQM_INSTANCE_TENANT_ID_KEY; }; } @@ -599,20 +650,57 @@ private void processForItem(Map<String, Object> json, ObjectNode jsonNode) var callNumber = Stream.of( json.get(FqmKeys.FQM_HOLDINGS_CALL_NUMBER_PREFIX_KEY), - json.get(FqmKeys.FQM_HOLDINGS_CALL_NUMBER_KEY), - json.get(FqmKeys.FQM_HOLDINGS_CALL_NUMBER_SUFFIX_KEY)) + json.get(FQM_HOLDINGS_CALL_NUMBER_KEY), + json.get(FQM_HOLDINGS_CALL_NUMBER_SUFFIX_KEY)) .filter(Objects::nonNull) .map(Object::toString) .collect(Collectors.joining(SPACE)); var permanentLocationName = - ofNullable(json.get(FqmKeys.FQM_HOLDING_PERMANENT_LOCATION_NAME_KEY)) - .orElse(EMPTY) - .toString(); + ofNullable(json.get(FQM_HOLDING_PERMANENT_LOCATION_NAME_KEY)).orElse(EMPTY).toString(); jsonNode.put( HOLDINGS_DATA, join(HOLDINGS_LOCATION_CALL_NUMBER_DELIMITER, permanentLocationName, callNumber)); + + if (nonNull(json.get(FQM_ITEM_PERMANENT_LOAN_TYPE_ID_KEY))) { + jsonNode.putIfAbsent( + PERMANENT_LOAN_TYPE, + objectMapper + .createObjectNode() + .put(ID, json.get(FQM_ITEM_PERMANENT_LOAN_TYPE_ID_KEY).toString()) + .put( + NAME, + ofNullable(json.get(FQM_ITEM_PERMANENT_LOAN_TYPE_NAME_KEY)) + .orElse(EMPTY) + .toString())); + } + + if (nonNull(json.get(FQM_ITEM_TEMPORARY_LOAN_TYPE_ID_KEY))) { + jsonNode.putIfAbsent( + TEMPORARY_LOAN_TYPE, + objectMapper + .createObjectNode() + .put(ID, json.get(FQM_ITEM_TEMPORARY_LOAN_TYPE_ID_KEY).toString()) + .put( + NAME, + ofNullable(json.get(FQM_ITEM_TEMPORARY_LOAN_TYPE_NAME_KEY)) + .orElse(EMPTY) + .toString())); + } + + if (nonNull(json.get(FQM_ITEM_EFFECTIVE_LOCATION_ID_KEY))) { + jsonNode.putIfAbsent( + EFFECTIVE_LOCATION, + objectMapper + .createObjectNode() + .put(ID, json.get(FQM_ITEM_EFFECTIVE_LOCATION_ID_KEY).toString()) + .put( + NAME, + ofNullable(json.get(FQM_ITEM_EFFECTIVE_LOCATION_NAME_KEY)) + .orElse(EMPTY) + .toString())); + } } private void processForHoldingsRecord(Map<String, Object> json, ObjectNode jsonNode) diff --git a/src/main/java/org/folio/bulkops/util/FqmKeys.java b/src/main/java/org/folio/bulkops/util/FqmKeys.java index 05b10170b..29f81a93a 100644 --- a/src/main/java/org/folio/bulkops/util/FqmKeys.java +++ b/src/main/java/org/folio/bulkops/util/FqmKeys.java @@ -27,9 +27,21 @@ public class FqmKeys { public static final String FQM_INSTANCES_PUBLICATION_KEY = "instances.publication"; public static final String FQM_INSTANCES_TITLE_KEY = "instances.title"; + public static final String FQM_USERS_JSONB_KEY = "users.jsonb"; public static final String FQM_ITEMS_JSONB_KEY = "items.jsonb"; + public static final String FQM_HOLDINGS_JSONB_KEY = "holdings.jsonb"; + public static final String FQM_INSTANCE_JSONB_KEY = "instance.jsonb"; - public static final String FQM_USERS_JSONB_KEY = "users.jsonb"; public static final String FQM_USERS_ID_KEY = "users.id"; public static final String FQM_USERS_TYPE_KEY = "users.type"; + public static final String FQM_ITEM_PERMANENT_LOAN_TYPE_ID_KEY = "permanent_loan_type.id"; + public static final String FQM_ITEM_PERMANENT_LOAN_TYPE_NAME_KEY = "permanent_loan_type.name"; + public static final String FQM_ITEM_TEMPORARY_LOAN_TYPE_ID_KEY = "temporary_loan_type.id"; + public static final String FQM_ITEM_TEMPORARY_LOAN_TYPE_NAME_KEY = "temporary_loan_type.name"; + public static final String FQM_ITEM_EFFECTIVE_LOCATION_ID_KEY = "effective_location.id"; + public static final String FQM_ITEM_EFFECTIVE_LOCATION_NAME_KEY = "effective_location.name"; + + public static final String FQM_ITEMS_TENANT_ID_KEY = "items.tenant_id"; + public static final String FQM_HOLDINGS_TENANT_ID_KEY = "holdings.tenant_id"; + public static final String FQM_INSTANCE_TENANT_ID_KEY = "instance.tenant_id"; } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index e8c4b58f0..42f383fba 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -105,4 +105,4 @@ application: fqm-fetcher: max_chunk_size: ${FQM_MAX_CHUNK_SIZE:10000} max_parallel_chunks: ${FQM_MAX_PARALLEL_CHUNKS:10} - fqm-query-approach: ${FQM_QUERY_APPROACH:false} + fqm-query-approach: ${FQM_QUERY_APPROACH:true} diff --git a/src/test/java/org/folio/bulkops/util/FqmContentFetcherTest.java b/src/test/java/org/folio/bulkops/util/FqmContentFetcherTest.java index ff7906165..4a9d4f012 100644 --- a/src/test/java/org/folio/bulkops/util/FqmContentFetcherTest.java +++ b/src/test/java/org/folio/bulkops/util/FqmContentFetcherTest.java @@ -9,11 +9,24 @@ import static org.folio.bulkops.util.FqmKeys.FQM_HOLDINGS_CALL_NUMBER_KEY; import static org.folio.bulkops.util.FqmKeys.FQM_HOLDINGS_CALL_NUMBER_PREFIX_KEY; import static org.folio.bulkops.util.FqmKeys.FQM_HOLDINGS_CALL_NUMBER_SUFFIX_KEY; +import static org.folio.bulkops.util.FqmKeys.FQM_HOLDINGS_JSONB_KEY; +import static org.folio.bulkops.util.FqmKeys.FQM_HOLDINGS_TENANT_ID_KEY; import static org.folio.bulkops.util.FqmKeys.FQM_HOLDING_PERMANENT_LOCATION_NAME_KEY; import static org.folio.bulkops.util.FqmKeys.FQM_INSTANCES_PUBLICATION_KEY; import static org.folio.bulkops.util.FqmKeys.FQM_INSTANCES_TITLE_KEY; +import static org.folio.bulkops.util.FqmKeys.FQM_INSTANCE_JSONB_KEY; import static org.folio.bulkops.util.FqmKeys.FQM_INSTANCE_PUBLICATION_KEY; +import static org.folio.bulkops.util.FqmKeys.FQM_INSTANCE_SHARED_KEY; +import static org.folio.bulkops.util.FqmKeys.FQM_INSTANCE_TENANT_ID_KEY; import static org.folio.bulkops.util.FqmKeys.FQM_INSTANCE_TITLE_KEY; +import static org.folio.bulkops.util.FqmKeys.FQM_ITEMS_JSONB_KEY; +import static org.folio.bulkops.util.FqmKeys.FQM_ITEMS_TENANT_ID_KEY; +import static org.folio.bulkops.util.FqmKeys.FQM_ITEM_EFFECTIVE_LOCATION_ID_KEY; +import static org.folio.bulkops.util.FqmKeys.FQM_ITEM_EFFECTIVE_LOCATION_NAME_KEY; +import static org.folio.bulkops.util.FqmKeys.FQM_ITEM_PERMANENT_LOAN_TYPE_ID_KEY; +import static org.folio.bulkops.util.FqmKeys.FQM_ITEM_PERMANENT_LOAN_TYPE_NAME_KEY; +import static org.folio.bulkops.util.FqmKeys.FQM_ITEM_TEMPORARY_LOAN_TYPE_ID_KEY; +import static org.folio.bulkops.util.FqmKeys.FQM_ITEM_TEMPORARY_LOAN_TYPE_NAME_KEY; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; @@ -162,7 +175,6 @@ void fetchShouldProcessMultipleIdentifiersChunksInParallel() throws IOException .toList(); var entityTypeId = randomUUID(); - var entityJsonKey = "instance.jsonb"; when(entityTypeService.getFqmEntityTypeIdByBulkOpsEntityType(any())).thenReturn(entityTypeId); when(folioExecutionContext.getTenantId()).thenReturn("test_tenant"); @@ -170,7 +182,7 @@ void fetchShouldProcessMultipleIdentifiersChunksInParallel() throws IOException when(queryClient.getContents( new ContentsRequest() .entityTypeId(entityTypeId) - .fields(List.of(entityJsonKey)) + .fields(List.of("instance.jsonb", "instance.shared", "instance.tenant_id")) .localize(false) .ids(uuids.subList(0, 3).stream().map(UUID::toString).map(List::of).toList()))) .thenReturn(getMockedContents(uuids.subList(0, 3))); @@ -178,7 +190,7 @@ void fetchShouldProcessMultipleIdentifiersChunksInParallel() throws IOException when(queryClient.getContents( new ContentsRequest() .entityTypeId(entityTypeId) - .fields(List.of(entityJsonKey)) + .fields(List.of("instance.jsonb", "instance.shared", "instance.tenant_id")) .localize(false) .ids(uuids.subList(3, 5).stream().map(UUID::toString).map(List::of).toList()))) .thenReturn(getMockedContents(uuids.subList(3, 5))); @@ -241,7 +253,7 @@ void fetchShouldFailMultipleIdentifiersChunksInParallel() { .getContents( new ContentsRequest() .entityTypeId(entityTypeId) - .fields(List.of(entityJsonKey)) + .fields(List.of("instance.jsonb", "instance.shared", "instance.tenant_id")) .localize(false) .ids(uuids.subList(0, 3).stream().map(UUID::toString).map(List::of).toList())); @@ -385,6 +397,14 @@ void fetchReturnsCorrectContentForItemEntityType() throws Exception { String expectedTitle = "\"title\":\"Instance Title 1. Olaf Ladousse," + " 1992-\""; assertThat(result).contains(expectedTitle); + assertThat(result) + .contains( + "\"effectiveLocation\":{\"id\":\"e25a4840-f74b-4d34-a58b-0f9238710d79\"," + + "\"name\":\"Main location\"}"); + assertThat(result) + .contains( + "\"permanentLoanType\":{\"id\":\"6293b0ef-38d8-4e2d-af4a-be7ad8c41317\"," + + "\"name\":\"Can circulate\"}"); uuids.forEach(uuid -> assertThat(result).contains("\"id\":\"" + uuid.toString() + "\"")); } @@ -1019,8 +1039,8 @@ private QueryDetails getMockedDataForEntityType(EntityType entityType, int total switch (entityType) { case USER -> map.put("users.jsonb", "{\"id\":\"" + randomUUID() + "\"}"); case ITEM -> { - map.put("items.jsonb", "{\"id\":\"" + randomUUID() + "\"}"); - map.put("items.tenant_id", "item-tenant"); + map.put(FQM_ITEMS_JSONB_KEY, "{\"id\":\"" + randomUUID() + "\"}"); + map.put(FQM_ITEMS_TENANT_ID_KEY, "item-tenant"); map.put(FQM_INSTANCES_TITLE_KEY, "Instance Title " + i); map.put(FQM_HOLDINGS_CALL_NUMBER_PREFIX_KEY, "Call/Number:Prefix " + i); map.put(FQM_HOLDINGS_CALL_NUMBER_SUFFIX_KEY, "Call Number-Suffix " + i); @@ -1030,10 +1050,16 @@ private QueryDetails getMockedDataForEntityType(EntityType entityType, int total FQM_INSTANCES_PUBLICATION_KEY, "[{\"place\": \"Madrid\", \"publisher\": \"Olaf Ladousse\", " + "\"dateOfPublication\": \"1992-\"}]"); + map.put(FQM_ITEM_PERMANENT_LOAN_TYPE_ID_KEY, "6293b0ef-38d8-4e2d-af4a-be7ad8c41317"); + map.put(FQM_ITEM_PERMANENT_LOAN_TYPE_NAME_KEY, "Can circulate"); + map.put(FQM_ITEM_TEMPORARY_LOAN_TYPE_ID_KEY, null); + map.put(FQM_ITEM_TEMPORARY_LOAN_TYPE_NAME_KEY, null); + map.put(FQM_ITEM_EFFECTIVE_LOCATION_ID_KEY, "e25a4840-f74b-4d34-a58b-0f9238710d79"); + map.put(FQM_ITEM_EFFECTIVE_LOCATION_NAME_KEY, "Main location"); } case HOLDINGS_RECORD -> { - map.put("holdings.jsonb", "{\"id\":\"" + randomUUID() + "\"}"); - map.put("holdings.tenant_id", "holdings-tenant"); + map.put(FQM_HOLDINGS_JSONB_KEY, "{\"id\":\"" + randomUUID() + "\"}"); + map.put(FQM_HOLDINGS_TENANT_ID_KEY, "holdings-tenant"); map.put(FQM_INSTANCE_TITLE_KEY, "Instance Title " + i); map.put( FQM_INSTANCE_PUBLICATION_KEY, @@ -1041,9 +1067,9 @@ private QueryDetails getMockedDataForEntityType(EntityType entityType, int total + "\"dateOfPublication\": \"1992-\"}]"); } case INSTANCE, INSTANCE_MARC -> { - map.put("instance.jsonb", "{\"id\":\"" + randomUUID() + "\"}"); - map.put("instance.tenant_id", "instance-tenant"); - map.put("instance.shared", "Shared"); + map.put(FQM_INSTANCE_JSONB_KEY, "{\"id\":\"" + randomUUID() + "\"}"); + map.put(FQM_INSTANCE_TENANT_ID_KEY, "instance-tenant"); + map.put(FQM_INSTANCE_SHARED_KEY, "Shared"); } default -> throw new IllegalArgumentException("Unexpected entity type: " + entityType); } diff --git a/src/test/resources/files/item_with_split_circ_notes.csv b/src/test/resources/files/item_with_split_circ_notes.csv index 83f900cf8..a5d3acdb0 100644 --- a/src/test/resources/files/item_with_split_circ_notes.csv +++ b/src/test/resources/files/item_with_split_circ_notes.csv @@ -1,2 +1,2 @@ -Item UUID,"Instance (Title, Publisher, Publication date)","Holdings (Location, Call number)",Item effective location,Effective call number,Suppress from discovery,Item HRID,Barcode,Accession number,Item identifier,Former identifier,Statistical codes,Administrative note,Material type,Copy number,Shelving order,Item level call number type,Item level call number prefix,Item level call number,Item level call number suffix,Number of pieces,Description of pieces,Enumeration,Chronology,Volume,"Year, caption",Number of missing pieces,Missing pieces,Missing pieces date,Item damaged status,Item damaged status date,Notes,Permanent loan type,Temporary loan type,Status,Check in note,Check out note,Item permanent location,Item temporary location,Electronic access,Is bound with,Bound with titles,Tags,Holdings UUID,Tenant -,,,,,false,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Check in note 1 (staff only) | Check in note 2,Check out note 1 (staff only) | Check out note 2,,,,,,,,tenantId +Item UUID,"Instance (Title, Publisher, Publication date)","Holdings (Location, Call number)",Item effective location,Effective call number,Suppress from discovery,Item HRID,Barcode,Accession number,Item identifier,Former identifier,Statistical codes,Administrative note,Material type,Copy number,Shelving order,Item level call number type,Item level call number prefix,Item level call number,Item level call number suffix,Number of pieces,Description of pieces,Enumeration,Chronology,Volume,"Year, caption",Number of missing pieces,Missing pieces,Missing pieces date,Item damaged status,Item damaged status date,Notes,Permanent loan type,Temporary loan type,Status,Check in note,Check out note,Item permanent location,Item temporary location,Electronic access,Tags,Holdings UUID,Tenant +,,,,,false,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Check in note 1 (staff only) | Check in note 2,Check out note 1 (staff only) | Check out note 2,,,,,,tenantId diff --git a/src/test/resources/files/items_preview.csv b/src/test/resources/files/items_preview.csv index 3da80291c..5710716d6 100644 --- a/src/test/resources/files/items_preview.csv +++ b/src/test/resources/files/items_preview.csv @@ -1,4 +1,4 @@ -Item id,Version,Item HRID,Holdings Record Id,Former Ids,Discovery Suppress,Title,Contributor Names,Call Number,Barcode,Effective Shelving Order,Accession Number,Item Level Call Number,Item Level Call Number Prefix,Item Level Call Number Suffix,Item Level Call Number Type,Effective Call Number Components,Volume,Enumeration,Chronology,Year Caption,Item Identifier,Copy Number,Number Of Pieces,Description Of Pieces,Number Of Missing Pieces,Missing Pieces,Missing Pieces Date,Item Damaged Status,Item Damaged Status Date,Administrative note,Notes,Check in note,Check out note,Status,Material Type,Is Bound With,Bound With Titles,Permanent Loan Type,Temporary Loan Type,Permanent Location,Temporary Location,Effective Location,Electronic Access,In Transit Destination Service Point,Statistical Codes,Purchase Order LineIdentifier,Tags,Last CheckIn +Item id,Version,Item HRID,Holdings Record Id,Former Ids,Discovery Suppress,Title,Contributor Names,Call Number,Barcode,Effective Shelving Order,Accession Number,Item Level Call Number,Item Level Call Number Prefix,Item Level Call Number Suffix,Item Level Call Number Type,Effective Call Number Components,Volume,Enumeration,Chronology,Year Caption,Item Identifier,Copy Number,Number Of Pieces,Description Of Pieces,Number Of Missing Pieces,Missing Pieces,Missing Pieces Date,Item Damaged Status,Item Damaged Status Date,Administrative note,Notes,Check in note,Check out note,Status,Material Type,Permanent Loan Type,Temporary Loan Type,Permanent Location,Temporary Location,Effective Location,Electronic Access,In Transit Destination Service Point,Statistical Codes,Purchase Order LineIdentifier,Tags,Last CheckIn bb5a6689-c008-4c96-8f8f-b666850ee12d,1,item000000000012,67cd0046-e4f1-4e4f-9024-adf0b0039d09,,,Interesting Times,"Prat%3Achett, Terry",D15.H63 A3 2002,326547658598,D 215 H63 A3 42002,,,,,,D15.H63 A3 2002;;;,,,,,,,,,,,,,,,,,,Checked out;2023-02-10 04:59:20.789Z,book,false,,Can circulate,,,,SECOND FLOOR,,,,,, 459afaba-5b39-468d-9072-eb1685e0ddf4,1,item000000000011,65032151-39a5-4cef-8810-5350eb316300,,,The Gi%7Crl on the Train,Cr%3Aeator A;Creator B,MCN FICTION,765475420716,MCN FICTION,,,,,,MCN FICTION;;;,,,,,,,,,,,,,,,,,,Available;2023-02-10 04:59:20.793Z,dvd,false,,Can circulate,,,Annex,Annex,,,,,, 1714f71f-b845-444b-a79e-a577487a6f7d,1,item000000000007,133a7916-f05e-4df4-8f7f-09eb2a7076d1,,,The Amer%3Bican Journal of M%3Aedicine,,R11.A38,000111222333444,R 211 A38 V 230 41961 C 11,,,,,,R11.A38;;;,,v. 30 1961,,,,c.1,,,,,,,,,,,,Available;2023-02-10 04:59:20.804Z,book,false,,Reading room,Can circulate,,,Main Library,,,,,, diff --git a/src/test/resources/files/items_preview_back_slashes.csv b/src/test/resources/files/items_preview_back_slashes.csv index 280c48faf..60bcde063 100644 --- a/src/test/resources/files/items_preview_back_slashes.csv +++ b/src/test/resources/files/items_preview_back_slashes.csv @@ -1,2 +1,2 @@ -Item id,Version,Item HRID,Holdings Record Id,Former Ids,Discovery Suppress,Title,"Holdings (Location, Call number)",Contributor Names,Call Number,Barcode,Effective Shelving Order,Accession Number,Item Level Call Number,Item Level Call Number Prefix,Item Level Call Number Suffix,Item Level Call Number Type,Effective Call Number Components,Volume,Enumeration,Chronology,Year Caption,Item Identifier,Copy Number,Number Of Pieces,Description Of Pieces,Number Of Missing Pieces,Missing Pieces,Missing Pieces Date,Item Damaged Status,Item Damaged Status Date,Administrative note,Notes,Check in note,Check out note,Status,Material Type,Is Bound With,Bound With Titles,Permanent Loan Type,Temporary Loan Type,Permanent Location,Temporary Location,Effective Location,Electronic Access,In Transit Destination Service Point,Statistical Codes,Purchase Order LineIdentifier,Tags,Last CheckIn +Item id,Version,Item HRID,Holdings Record Id,Former Ids,Discovery Suppress,Title,"Holdings (Location, Call number)",Contributor Names,Call Number,Barcode,Effective Shelving Order,Accession Number,Item Level Call Number,Item Level Call Number Prefix,Item Level Call Number Suffix,Item Level Call Number Type,Effective Call Number Components,Volume,Enumeration,Chronology,Year Caption,Item Identifier,Copy Number,Number Of Pieces,Description Of Pieces,Number Of Missing Pieces,Missing Pieces,Missing Pieces Date,Item Damaged Status,Item Damaged Status Date,Administrative note,Notes,Check in note,Check out note,Status,Material Type,Permanent Loan Type,Temporary Loan Type,Permanent Location,Temporary Location,Effective Location,Electronic Access,In Transit Destination Service Point,Statistical Codes,Purchase Order LineIdentifier,Tags,Last CheckIn e996ce40-2cbc-4468-a9db-53afcd03a760,2,bwit0004,1ab1f67e-6ab8-40f0-8cc1-a199db309070,,,Magazine - Q4,Main Library > R11.A38\,,R11.A38\,,R11.A38\ First copy of Q4,,,,,,R11.A38\,,,,,,First copy of Q4,,,,,,,,,,,,Available,text,false,,Can circulate,,,,Main Library,,,,,, diff --git a/src/test/resources/files/items_preview_line_breaks.csv b/src/test/resources/files/items_preview_line_breaks.csv index 27255e72c..d054153be 100644 --- a/src/test/resources/files/items_preview_line_breaks.csv +++ b/src/test/resources/files/items_preview_line_breaks.csv @@ -1,4 +1,4 @@ -Item id,Version,Item HRID,Holdings Record Id,Former Ids,Discovery Suppress,Title,Contributor Names,Call Number,Barcode,Effective Shelving Order,Accession Number,Item Level Call Number,Item Level Call Number Prefix,Item Level Call Number Suffix,Item Level Call Number Type,Effective Call Number Components,Volume,Enumeration,Chronology,Year Caption,Item Identifier,Copy Number,Number Of Pieces,Description Of Pieces,Number Of Missing Pieces,Missing Pieces,Missing Pieces Date,Item Damaged Status,Item Damaged Status Date,Administrative note,Notes,Check in note,Check out note,Status,Material Type,Is Bound With,Bound With Titles,Permanent Loan Type,Temporary Loan Type,Permanent Location,Temporary Location,Effective Location,Electronic Access,In Transit Destination Service Point,Statistical Codes,Purchase Order LineIdentifier,Tags,Last CheckIn +Item id,Version,Item HRID,Holdings Record Id,Former Ids,Discovery Suppress,Title,Contributor Names,Call Number,Barcode,Effective Shelving Order,Accession Number,Item Level Call Number,Item Level Call Number Prefix,Item Level Call Number Suffix,Item Level Call Number Type,Effective Call Number Components,Volume,Enumeration,Chronology,Year Caption,Item Identifier,Copy Number,Number Of Pieces,Description Of Pieces,Number Of Missing Pieces,Missing Pieces,Missing Pieces Date,Item Damaged Status,Item Damaged Status Date,Administrative note,Notes,Check in note,Check out note,Status,Material Type,Permanent Loan Type,Temporary Loan Type,Permanent Location,Temporary Location,Effective Location,Electronic Access,In Transit Destination Service Point,Statistical Codes,Purchase Order LineIdentifier,Tags,Last CheckIn bb5a6689-c008-4c96-8f8f-b666850ee12d,1,item000000000012,67cd0046-e4f1-4e4f-9024-adf0b0039d09,,,Interesting Times,"Pratchett, Terry",D15.H63 A3 2002,326547658598,D 215 H63 A3 42002,,,,,,D15.H63 A3 2002;;;,,,,,,,,,,,,,,"Note with line