Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 3 additions & 18 deletions src/main/java/org/folio/bulkops/domain/bean/Item.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -369,34 +367,21 @@ public ItemLocation getTemporaryLocation() {
@UnifiedTableCell(visible = false)
private List<ElectronicAccess> 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<Title> 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;

Expand Down

This file was deleted.

3 changes: 3 additions & 0 deletions src/main/java/org/folio/bulkops/util/Constants.java
Original file line number Diff line number Diff line change
Expand Up @@ -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";
}
120 changes: 104 additions & 16 deletions src/main/java/org/folio/bulkops/util/FqmContentFetcher.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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());

Expand All @@ -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);
});
Expand Down Expand Up @@ -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());
Expand Down Expand Up @@ -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;
};
}

Expand Down Expand Up @@ -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)
Expand Down
14 changes: 13 additions & 1 deletion src/main/java/org/folio/bulkops/util/FqmKeys.java
Original file line number Diff line number Diff line change
Expand Up @@ -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";
}
2 changes: 1 addition & 1 deletion src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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}
Loading
Loading