Skip to content

Commit

Permalink
MODLD-655: [Tech Debt] MARC BIB records are converted to graph unnece…
Browse files Browse the repository at this point in the history
…ssarily… (#109)

* MODLD-655: [Tech Debt] MARC BIB records are converted to graph unnecessarily
  • Loading branch information
AndreiBordak authored Feb 4, 2025
1 parent 887c686 commit 75fbd09
Show file tree
Hide file tree
Showing 7 changed files with 86 additions and 2 deletions.
7 changes: 7 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
<mod-source-record-storage-client.version>5.9.8</mod-source-record-storage-client.version>
<mod-record-specifications-dto.version>1.1.0-SNAPSHOT</mod-record-specifications-dto.version>
<maven-checkstyle-plugin.checkstyle.version>10.21.2</maven-checkstyle-plugin.checkstyle.version>
<jayway-jsonpath.version>2.9.0</jayway-jsonpath.version>

<!-- Test dependencies versions -->
<testcontainers.version>1.20.4</testcontainers.version>
Expand Down Expand Up @@ -187,6 +188,12 @@
<version>${hibernate-types.version}</version>
</dependency>

<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>${jayway-jsonpath.version}</version>
</dependency>

<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import static org.folio.linked.data.domain.dto.SourceRecordType.MARC_AUTHORITY;
import static org.folio.linked.data.domain.dto.SourceRecordType.MARC_BIB;
import static org.folio.linked.data.util.Constants.STANDALONE_PROFILE;
import static org.folio.linked.data.util.JsonUtils.hasElementByJsonPath;

import java.util.Set;
import lombok.RequiredArgsConstructor;
Expand All @@ -31,6 +32,7 @@ public class SourceRecordDomainEventHandler {
private static final String EMPTY_RESOURCE_MAPPED = "Empty resource(s) mapped from SourceRecordDomainEvent [id {}]";
private static final String NO_MARC_EVENT = "SourceRecordDomainEvent [id {}] has no Marc record inside";
private static final String UNSUPPORTED_TYPE = "Ignoring unsupported {} type [{}] in SourceRecordDomainEvent [id {}]";
private static final String LINKED_DATA_ID_JSONPATH = "$.fields[*].999.subfields[*].l";
private static final Set<SourceRecordType> SUPPORTED_RECORD_TYPES = Set.of(MARC_BIB, MARC_AUTHORITY);
private static final Set<SourceRecordDomainEvent.EventTypeEnum> SUPPORTED_EVENT_TYPES =
Set.of(SOURCE_RECORD_CREATED, SOURCE_RECORD_UPDATED);
Expand All @@ -46,7 +48,7 @@ public void handle(SourceRecordDomainEvent event, SourceRecordType recordType) {
}
if (recordType == MARC_AUTHORITY) {
saveAuthorities(event);
} else if (recordType == MARC_BIB && event.getEventType() == SOURCE_RECORD_CREATED) {
} else if (isLinkedDataBibCreateEvent(event, recordType)) {
saveAdminMetadata(event);
}
}
Expand Down Expand Up @@ -85,6 +87,12 @@ private void saveAuthority(Resource resource, SourceRecordDomainEvent event) {
}
}

private boolean isLinkedDataBibCreateEvent(SourceRecordDomainEvent event, SourceRecordType recordType) {
return recordType == MARC_BIB
&& event.getEventType() == SOURCE_RECORD_CREATED
&& hasElementByJsonPath(event.getEventPayload().getParsedRecord().getContent(), LINKED_DATA_ID_JSONPATH);
}

private void saveAdminMetadata(SourceRecordDomainEvent event) {
marcBib2ldMapper.fromMarcJson(event.getEventPayload().getParsedRecord().getContent())
.ifPresentOrElse(mapped -> {
Expand Down
17 changes: 17 additions & 0 deletions src/main/java/org/folio/linked/data/util/JsonUtils.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
package org.folio.linked.data.util;

import static org.apache.commons.lang3.StringUtils.isAnyBlank;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.jayway.jsonpath.Configuration;
import com.jayway.jsonpath.JsonPath;
import com.jayway.jsonpath.Option;
import java.util.List;
import java.util.Objects;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
Expand All @@ -15,6 +21,17 @@
@UtilityClass
public class JsonUtils {

private static final Configuration JSONPATH_CONFIG = Configuration.builder()
.options(Option.SUPPRESS_EXCEPTIONS)
.build();

public static boolean hasElementByJsonPath(String json, String jsonPath) {
if (isAnyBlank(json, jsonPath)) {
return false;
}
return !JsonPath.using(JSONPATH_CONFIG).parse(json).read(jsonPath, List.class).isEmpty();
}

@SneakyThrows
public static String writeValueAsString(Object obj, ObjectMapper objectMapper) {
return obj instanceof String str ? str : objectMapper.writeValueAsString(obj);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,8 @@ void shouldTriggerAdminMetadataSaving_forCorrectMarcBibEvent() {
// given
var event = new SourceRecordDomainEvent().id("7")
.eventType(SOURCE_RECORD_CREATED)
.eventPayload(new SourceRecord().parsedRecord(new ParsedRecord("{ \"key\": \"value\"}")));
.eventPayload(new SourceRecord()
.parsedRecord(new ParsedRecord("{\"fields\": [{\"999\": {\"subfields\": [{\"l\": \"lvalue\"}]}}]}")));
var mapped = new Resource().setId(9L).addType(INSTANCE);
doReturn(Optional.of(mapped)).when(marcBib2ldMapper)
.fromMarcJson(event.getEventPayload().getParsedRecord().getContent());
Expand Down
39 changes: 39 additions & 0 deletions src/test/java/org/folio/linked/data/util/JsonUtilsTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import static org.folio.linked.data.test.TestUtil.loadResourceAsString;
import static org.folio.linked.data.util.JsonUtils.merge;
import static org.folio.linked.data.util.JsonUtils.writeValueAsString;
import static org.junit.jupiter.api.Assertions.assertEquals;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
Expand Down Expand Up @@ -40,4 +41,42 @@ void merge_shouldReturnModifiedIncoming() throws JsonProcessingException {
var result = merge(MAPPER.readTree(existing), MAPPER.readTree(incoming));
assertThat(result).isEqualTo(MAPPER.readTree(merged));
}


@ParameterizedTest
@MethodSource("hasElementByJsonPathArguments")
void hasElementByJsonPath_shouldReturnCorrectBoolean(String jsonPath, boolean expected) {
// when
var actual = JsonUtils.hasElementByJsonPath(LINKED_DATA_ID_JSON, jsonPath);

// then
assertEquals(expected, actual);
}

static Stream<Arguments> hasElementByJsonPathArguments() {
return Stream.of(
Arguments.of("$.fields[*].999.subfields[*].l", true),
Arguments.of("$.fields[*].999.subfields[*].a", false),
Arguments.of("$.fields[*].111", false),
Arguments.of(null, false)
);
}

private static final String LINKED_DATA_ID_JSON = """
{
"fields": [
{
"999": {
"subfields": [
{
"l": "lvalue"
}
],
"ind1": " ",
"ind2": " "
}
}
]
}
""";
}
3 changes: 3 additions & 0 deletions src/test/resources/samples/marc2ld/full_marc_sample.jsonl
Original file line number Diff line number Diff line change
Expand Up @@ -508,6 +508,9 @@
},
{
"s": "43d58061-decf-4d74-9747-0e1c368e861b"
},
{
"l": "53d58061-decf-4d74-9747-0e1c368e861b"
}
],
"ind1": "f",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,15 @@
],
"ind1": " ",
"ind2": " "
},
"999": {
"subfields": [
{
"l": "test"
}
],
"ind1": " ",
"ind2": " "
}
}
]
Expand Down

0 comments on commit 75fbd09

Please sign in to comment.