class MARC::FieldMap

The FieldMap is an Array of DataFields and Controlfields. It also contains a Hash representation of the fields for faster lookups (under certain conditions)

Attributes

clean[RW]
tags[R]

Public Class Methods

new() click to toggle source
# File lib/marc/record.rb, line 9
def initialize
  @tags = {}
  @clean = true
end

Public Instance Methods

each_by_tag(tags) { |self| ... } click to toggle source

Returns an array of fields, in the order they appear, according to their tag. The tags argument can be a string (e.g. ‘245’), an array ([‘100’,‘700’,‘800’]) or a range ((‘600’..‘699’)).

# File lib/marc/record.rb, line 35
def each_by_tag(tags)
  reindex unless @clean
  indices = []
  # Get all the indices associated with the tags
  Array(tags).each do |t|
    indices.concat @tags[t] if @tags[t]
  end

  # Remove any nils
  indices.compact!
  return [] if indices.empty?

  # Sort it, so we get the fields back in the order they appear in the record
  indices.sort!

  indices.each do |tag|
    yield self[tag]
  end
end
freeze() click to toggle source

Freeze for immutability, first reindexing if needed. A frozen FieldMap is safe for concurrent access, and also can more easily avoid accidental reindexing on even read-only use.

Calls superclass method
# File lib/marc/record.rb, line 58
def freeze
  reindex unless @clean
  super
end
reindex() click to toggle source

Rebuild the HashWithChecksumAttribute with the current values of the fields Array

# File lib/marc/record.rb, line 16
def reindex
  @tags = {}
  each_with_index do |field, i|
    @tags[field.tag] ||= []
    @tags[field.tag] << i
  end
  @clean = true
end
tag_list() click to toggle source

Returns an array of all of the tags that appear in the record (not in the order they appear, however).

# File lib/marc/record.rb, line 26
def tag_list
  reindex unless @clean
  @tags.keys
end