Skip to content
  • Marcel de Rooy's avatar
    Bug 10306: Core module changes for multiple mappings · 01fbe2be
    Marcel de Rooy authored and joubu's avatar joubu committed
    
    
    In order to allow multiple Koha to MARC mappings (for one kohafield), we
    need to adjust a few key routines in C4/Biblio.pm. This results in a few
    changes in dependent modules too.
    
    Note: Multiple mappings also include 'alternating' mappings. Such as the
    case of MARC21 260 and 264: only one of both fields will be used. Sub
    TransformMarcToKoha will handle that just fine; the opposite transformation
    is harder, since we do no longer know which field was the source. In that
    case TransformKohaToMarc will fill both fields. We only use that operation
    in Koha for items (in Acquisition and Cataloging).
    
    Sub GetMarcSubfieldStructure
    This sub used a selectall_hashref, which is fine as long as we have only
    one mapping for each kohafield. But as DBI states it: If a row has the same
    key as an earlier row then it replaces the earlier row. In other words,
    we lose the first mapping if we have two.
    This patch uses selectall_arrayref with Slice and rearranges the output so
    that the returned hash returns an arrayref of hashrefs for each kohafield.
    In order to improve consistency, we add an order clause to the SQL
    statement used too.
    
    Sub GetMarcFromKohaField
    This sub just returned one tag and subfield, but in case of multiple
    mappings we should return them all now.
    Note: Many calls still expect just one result and will work just fine:
        my ($tag, $sub) = GetMarcFromKohaField(...)
    A possible second mapping would be silently ignored. Often the sub is
    called for biblionumber or itemnumber. I would not recommend the use of
    multiple mappings for such fields btw.
    In case the sub is called in scalar context, it will return only the first
    tag (instead of the number of tags and subfields).
    
    Sub GetMarcSubfieldStructureFromKohaField
    This sub previously returned the hash for one kohafield.
    In scalar context it will behave like before: it returns the first hashref
    in the arrayref that comes from GetMarcSubfieldStructure.
    In list context, it returns an array of all hashrefs (incl. multiple
    mappings).
    The sub is not used in C4::Ris. Removed the use statement.
    
    Sub TransformKohaToMarc
    This sub got a second parameter: frameworkcode.
    Historically, Koha more or less assumes kohafields to be defined across all
    frameworks (see Koha to MARC mappings). Therefore it falls back to Default
    when it is not passed.
    When going thru all mappings in building a MARC record, it also supports
    multiple mappings. Note that Koha uses this routine in Acquisition and in
    Cataloging for items. Normally the MARC record is leading however and the
    Koha fields are derivatives for optimization and reporting.
    
    The added third parameter allows for passing a new option no_split => 1.
    We use this option in C4::Items::Item2Marc; if two item fields are mapped to
    one kohafield but would have different values (which would be very unusual),
    these values are glued together. When transforming to MARC again, we do not
    want to duplicate the item subfields, but we keep the glued value in both
    subfields. This operation only affects items, since we are not doing this
    reverse operation for biblio and biblioitem fields.
    
    Sub _get_inverted_marc_field_map
    This sub is a helper routine of TransformMarcToKoha, the opposite
    transformation. When saving a MARC record, all kohafields are extracted
    including multiple mappings.
    Suppose that you had both 260c and 264c in your record (which you won't),
    than both values get saved initially into copyrightdate like A | B. The
    additional code for copyrightdate will extract the first year from this
    string.
    A small fix in TransformMarcToKoha makes that it only saves a value in a
    kohafield if it is defined and not empty. (Same for concatenation.)
    
    Sub TransformMarcToKohaOneField
    This sub now just calls TransformMarcToKoha and extracts the requested
    field. Note that since we are caching the structure, this does not result
    in additional database access and is therefore performance-wise
    insignificant. We simplify code and maintenance.
    Instead of modifying the passed hashref, it simply returns a value. A call
    in C4::Breeding is adjusted accordingly. The routine getKohaField in
    Koha::MetadataRecord is redirected to TransformMarcToKohaOneField.
    NOTE: The fourth patch restructures/optimizes TransformMarcToKoha[OneField].
    
    Sub get_koha_field_from_marc
    This sub can be removed. A call is replaced by TransformMarcToKohaOneField
    in C4::XISBN.
    
    Note: The commented lines for sub ModZebrafiles are removed (directly under
    TransformMarcToKohaOneField).
    
    Test plan:
    For unit tests and interface tests, please see follow-ups.
    Run qa tools in order to verify that the modules still compile well.
    Read the code changes and verify that they make sense.
    
    Signed-off-by: default avatarJosef Moravec <josef.moravec@gmail.com>
    
    Signed-off-by: default avatarKyle M Hall <kyle@bywatersolutions.com>
    
    Signed-off-by: default avatarJonathan Druart <jonathan.druart@bugs.koha-community.org>
    01fbe2be