From 6d18a6d1fa5cf6dd3745715c8f21d5f0771fd1d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Kir=C3=A1ly?= Date: Sun, 26 Feb 2023 22:41:48 +0100 Subject: [PATCH] Making occurrence a first class citizen of PICA data fields #234 --- .../de/gwdg/metadataqa/marc/MarcSubfield.java | 5 +++- .../gwdg/metadataqa/marc/dao/DataField.java | 7 +++++- .../marc/dao/record/BibliographicRecord.java | 8 ++++--- .../keygenerator/DataFieldKeyGenerator.java | 23 ++++++++++++++----- .../metadataqa/marc/cli/MarcToSolrTest.java | 3 ++- .../metadataqa/marc/cli/ValidatorCliTest.java | 1 - 6 files changed, 34 insertions(+), 13 deletions(-) diff --git a/src/main/java/de/gwdg/metadataqa/marc/MarcSubfield.java b/src/main/java/de/gwdg/metadataqa/marc/MarcSubfield.java index e27ca63da..963fcaaa0 100644 --- a/src/main/java/de/gwdg/metadataqa/marc/MarcSubfield.java +++ b/src/main/java/de/gwdg/metadataqa/marc/MarcSubfield.java @@ -130,7 +130,10 @@ public Map> getKeyValuePairs(DataFieldKeyGenerator keyGener prefixCache = new HashMap<>(); } - String cacheKey = String.format("%s$%s-%s-%s", this.getField().getTag(), code, keyGenerator.getType().getType(), keyGenerator.getMarcVersion()); + String tag = this.getField().getTag(); + if (this.getField().getOccurrence() != null) + tag += "/" + this.getField().getOccurrence(); + String cacheKey = String.format("%s$%s-%s-%s", tag, code, keyGenerator.getType().getType(), keyGenerator.getMarcVersion()); if (!prefixCache.containsKey(cacheKey)) prefixCache.put(cacheKey, keyGenerator.forSubfield(this)); String prefix = prefixCache.get(cacheKey); diff --git a/src/main/java/de/gwdg/metadataqa/marc/dao/DataField.java b/src/main/java/de/gwdg/metadataqa/marc/dao/DataField.java index 56f99cd41..38aeb64b7 100644 --- a/src/main/java/de/gwdg/metadataqa/marc/dao/DataField.java +++ b/src/main/java/de/gwdg/metadataqa/marc/dao/DataField.java @@ -323,7 +323,12 @@ public Map> getKeyValuePairs(SolrFieldType type, MarcVersion marcVersion) { Map> pairs = new HashMap<>(); - DataFieldKeyGenerator keyGenerator = new DataFieldKeyGenerator(definition, type, getTag()); + String tag = getTag(); + if (getOccurrence() != null) + tag += "_" + getOccurrence(); + + SchemaType schemaType = marcRecord != null ? marcRecord.getSchemaType() : SchemaType.MARC21; + DataFieldKeyGenerator keyGenerator = new DataFieldKeyGenerator(definition, type, tag, schemaType); keyGenerator.setMarcVersion(marcVersion); // ind1 diff --git a/src/main/java/de/gwdg/metadataqa/marc/dao/record/BibliographicRecord.java b/src/main/java/de/gwdg/metadataqa/marc/dao/record/BibliographicRecord.java index 81ba7ab6d..b1d764007 100644 --- a/src/main/java/de/gwdg/metadataqa/marc/dao/record/BibliographicRecord.java +++ b/src/main/java/de/gwdg/metadataqa/marc/dao/record/BibliographicRecord.java @@ -430,9 +430,11 @@ public String asJson() { } fieldMap.put("subfields", subfields); - String tag = field.getDefinition() != null - ? field.getDefinition().getTag() - : field.getTag(); + String tag = field.getOccurrence() != null + ? field.getTag() + "/" + field.getOccurrence() + : (field.getDefinition() != null + ? field.getDefinition().getTag() + : field.getTag()); map.computeIfAbsent(tag, s -> new ArrayList>()); ((ArrayList)map.get(tag)).add(fieldMap); diff --git a/src/main/java/de/gwdg/metadataqa/marc/utils/keygenerator/DataFieldKeyGenerator.java b/src/main/java/de/gwdg/metadataqa/marc/utils/keygenerator/DataFieldKeyGenerator.java index 8377fa631..e40d5600b 100644 --- a/src/main/java/de/gwdg/metadataqa/marc/utils/keygenerator/DataFieldKeyGenerator.java +++ b/src/main/java/de/gwdg/metadataqa/marc/utils/keygenerator/DataFieldKeyGenerator.java @@ -2,6 +2,7 @@ import de.gwdg.metadataqa.marc.MarcSubfield; import de.gwdg.metadataqa.marc.definition.MarcVersion; +import de.gwdg.metadataqa.marc.definition.bibliographic.SchemaType; import de.gwdg.metadataqa.marc.definition.structure.DataFieldDefinition; import de.gwdg.metadataqa.marc.definition.structure.SubfieldDefinition; import de.gwdg.metadataqa.marc.model.SolrFieldType; @@ -28,15 +29,21 @@ public DataFieldKeyGenerator(DataFieldDefinition definition, SolrFieldType type) public DataFieldKeyGenerator(DataFieldDefinition definition, SolrFieldType type, - String tag) { + String tag, + SchemaType schemaType) { this.definition = definition; this.type = type; - if (definition != null) { - this.tag = definition.getTag(); - indexTag = definition.getIndexTag(); - } else { + if (schemaType.equals(SchemaType.PICA)) { this.tag = tag; - indexTag = tag; + this.indexTag = tag; + } else { + if (definition != null) { + this.tag = definition.getTag(); + this.indexTag = definition.getIndexTag(); + } else { + this.tag = tag; + this.indexTag = tag; + } } } @@ -191,4 +198,8 @@ public SolrFieldType getType() { public MarcVersion getMarcVersion() { return marcVersion; } + + public String getTag() { + return tag; + } } diff --git a/src/test/java/de/gwdg/metadataqa/marc/cli/MarcToSolrTest.java b/src/test/java/de/gwdg/metadataqa/marc/cli/MarcToSolrTest.java index 04a41de40..3d15a273b 100644 --- a/src/test/java/de/gwdg/metadataqa/marc/cli/MarcToSolrTest.java +++ b/src/test/java/de/gwdg/metadataqa/marc/cli/MarcToSolrTest.java @@ -44,7 +44,8 @@ public void pica() throws Exception { BibliographicRecord marcRecord = MarcFactory.createPicaFromMarc4j(record, schema); Map> map = marcRecord.getKeyValuePairs(SolrFieldType.HUMAN, true, MarcVersion.MARC21); // System.err.println(map.keySet()); - System.err.println(marcRecord.asJson()); + assertTrue(marcRecord.asJson().contains("036E/01")); + assertTrue(map.containsKey("036E_01_a")); } @Test diff --git a/src/test/java/de/gwdg/metadataqa/marc/cli/ValidatorCliTest.java b/src/test/java/de/gwdg/metadataqa/marc/cli/ValidatorCliTest.java index eef355a79..c29fee6ed 100644 --- a/src/test/java/de/gwdg/metadataqa/marc/cli/ValidatorCliTest.java +++ b/src/test/java/de/gwdg/metadataqa/marc/cli/ValidatorCliTest.java @@ -2,7 +2,6 @@ import de.gwdg.metadataqa.api.util.FileUtils; import de.gwdg.metadataqa.marc.cli.utils.RecordIterator; -import org.apache.commons.lang3.StringUtils; import org.junit.Before; import org.junit.Test;