From 6f8712d4aa59b1eddfe022071f59644d89d9b96f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Kir=C3=A1ly?= Date: Wed, 5 Oct 2022 22:45:21 +0200 Subject: [PATCH] issue #174: PICA FRBR functions --- .../marc/cli/FunctionalAnalysis.java | 4 +-- .../marc/utils/FrbrFunctionLister.java | 34 +++++++++++++++++-- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/main/java/de/gwdg/metadataqa/marc/cli/FunctionalAnalysis.java b/src/main/java/de/gwdg/metadataqa/marc/cli/FunctionalAnalysis.java index eb61a5915..9f585f152 100644 --- a/src/main/java/de/gwdg/metadataqa/marc/cli/FunctionalAnalysis.java +++ b/src/main/java/de/gwdg/metadataqa/marc/cli/FunctionalAnalysis.java @@ -47,7 +47,7 @@ public FunctionalAnalysis(String[] args) throws ParseException { parameters = new CompletenessParameters(args); options = parameters.getOptions(); readyToProcess = true; - frbrFunctionLister = new FrbrFunctionLister(parameters.getMarcVersion()); + frbrFunctionLister = new FrbrFunctionLister(parameters.getSchemaType(), parameters.getMarcVersion()); logger.info(frbrFunctionLister.getBaseline().toString()); } @@ -212,7 +212,7 @@ else if (parameters.getSchemaType().equals(SchemaType.PICA)) writer.write("frbrfunction" + separator + "count" + separator + "fields\n"); for (FRBRFunction function : FRBRFunction.values()) { if (function.getParent() != null) { - List paths = functions.get(function); + List paths = functions.getOrDefault(function, new ArrayList<>()); List cells = new ArrayList<>(); cells.add(function.toString()); cells.add(paths.size()); diff --git a/src/main/java/de/gwdg/metadataqa/marc/utils/FrbrFunctionLister.java b/src/main/java/de/gwdg/metadataqa/marc/utils/FrbrFunctionLister.java index 6a11ec937..6ebdde377 100644 --- a/src/main/java/de/gwdg/metadataqa/marc/utils/FrbrFunctionLister.java +++ b/src/main/java/de/gwdg/metadataqa/marc/utils/FrbrFunctionLister.java @@ -2,6 +2,7 @@ import de.gwdg.metadataqa.marc.Utils; import de.gwdg.metadataqa.marc.definition.*; +import de.gwdg.metadataqa.marc.definition.bibliographic.SchemaType; import de.gwdg.metadataqa.marc.definition.structure.ControlFieldDefinition; import de.gwdg.metadataqa.marc.definition.structure.ControlfieldPositionDefinition; import de.gwdg.metadataqa.marc.definition.structure.DataFieldDefinition; @@ -25,10 +26,11 @@ public class FrbrFunctionLister { private static final Logger logger = Logger.getLogger(FrbrFunctionLister.class.getCanonicalName()); + private SchemaType schemaType; // = SchemaType.MARC21; + private MarcVersion marcVersion; // = MarcVersion.MARC21; private Counter baselineCounter = new Counter<>(); private int elementsWithoutFunctions; - private MarcVersion marcVersion; private Map collector; private Map> histogram; @@ -38,14 +40,23 @@ public class FrbrFunctionLister { private AppendableHashMap marcPathByFunction; private Map> picaPathByFunction; - public FrbrFunctionLister(MarcVersion marcVersion) { - this.marcVersion = marcVersion; + public FrbrFunctionLister(SchemaType schemaType, MarcVersion marcVersion) { + this.schemaType = schemaType == null ? SchemaType.MARC21 : schemaType; + this.marcVersion = marcVersion == null ? MarcVersion.MARC21 : marcVersion; prepareBaseline(); prepareCollector(); prepareHistogram(); } + public FrbrFunctionLister(MarcVersion marcVersion) { + this(SchemaType.MARC21, marcVersion); + } + + public FrbrFunctionLister(SchemaType schemaType) { + this(schemaType, MarcVersion.MARC21); + } + public Map> getHistogram() { return histogram; } @@ -55,6 +66,23 @@ public void prepareBaseline() { functionByMarcPath = new TreeMap<>(); marcPathByFunction = new AppendableHashMap<>(); + if (schemaType.equals(SchemaType.MARC21)) { + prepareBaselineForMarc21(); + } else if (schemaType.equals(SchemaType.PICA)) { + prepareBaselineForMarc21(); + initializePica(); + functionByMarcPath = new TreeMap<>(); + marcPathByFunction = new AppendableHashMap<>(); + prepareBaselineForPica(); + } + } + + private void prepareBaselineForPica() { + for (Map.Entry> entry : functionByPicaPath.entrySet()) + registerFunctions(entry.getValue(), entry.getKey()); + } + + private void prepareBaselineForMarc21() { for (ControlfieldPositionDefinition subfield : MarcDefinition.getLeaderPositions()) registerFunctions(subfield.getFrbrFunctions(), subfield.getPath(false));