class BerkeleyLibrary::TIND::Export::ColumnGroup

A group of columns representing the subfields of a particular data field.

Constants

INDICATOR_RE

Indicators SHOULD NOT be capital letters, but TIND internal fields don't respect that. Thus the /i flag.

SUBFIELD_CODE_RE

Attributes

ind1[R]

Accessors

ind2[R]

Accessors

index_in_tag[R]

Accessors

subfield_codes[R]

Accessors

tag[R]

Accessors

Public Class Methods

format_indicator(ind) click to toggle source
# File lib/berkeley_library/tind/export/column_group.rb, line 46
def format_indicator(ind)
  ind == ' ' ? '_' : ind
end
format_prefix(tag, ind1, ind2) click to toggle source
# File lib/berkeley_library/tind/export/column_group.rb, line 50
def format_prefix(tag, ind1, ind2)
  [tag, format_indicator(ind1), format_indicator(ind2)].join
end
new(tag, index_in_tag, ind1, ind2, subfield_codes) click to toggle source

Initializer

# File lib/berkeley_library/tind/export/column_group.rb, line 31
def initialize(tag, index_in_tag, ind1, ind2, subfield_codes)
  @tag, @ind1, @ind2 = valid_tag_and_indicators(tag, ind1, ind2)
  @subfield_codes = valid_subfield_codes(subfield_codes).dup.freeze
  @index_in_tag = index_in_tag
end
prefix_for(data_field) click to toggle source
# File lib/berkeley_library/tind/export/column_group.rb, line 42
def prefix_for(data_field)
  format_prefix(data_field.tag, data_field.indicator1, data_field.indicator2)
end

Public Instance Methods

columns() click to toggle source
# File lib/berkeley_library/tind/export/column_group.rb, line 80
def columns
  @columns ||= (0...subfield_codes.length).map { |col| Column.new(self, col) }
end
maybe_add_at(row, data_field) click to toggle source
# File lib/berkeley_library/tind/export/column_group.rb, line 62
def maybe_add_at(row, data_field)
  warn "Data field at row #{row} is not frozen: #{data_field}" unless data_field.subfields.frozen?
  # set nil explicitly so row_count etc. are correct
  return (data_fields[row] = nil) unless can_add?(data_field)

  @subfield_codes = merge(subfield_codes, data_field.subfield_codes)
  data_fields[row] = data_field
end
prefix() click to toggle source

Instance methods

# File lib/berkeley_library/tind/export/column_group.rb, line 58
def prefix
  ColumnGroup.format_prefix(tag, ind1, ind2)
end
row_count() click to toggle source
# File lib/berkeley_library/tind/export/column_group.rb, line 84
def row_count
  data_fields.size
end
to_s() click to toggle source

Object overrides

# File lib/berkeley_library/tind/export/column_group.rb, line 91
def to_s
  "ColumnGroup #{tag}-#{index_in_tag}:" + [prefix, subfield_codes.join].join
end
value_at(row, col) click to toggle source
# File lib/berkeley_library/tind/export/column_group.rb, line 71
def value_at(row, col)
  return unless (data_field = data_fields[row])
  return unless (subfield_indices = subfield_indices_for(row))
  return unless (subfield_index = subfield_indices[col])
  return unless (subfield = data_field.subfields[subfield_index])

  subfield.value
end

Private Instance Methods

cached_subfield_indices() click to toggle source
# File lib/berkeley_library/tind/export/column_group.rb, line 127
def cached_subfield_indices
  @cached_subfield_indices ||= []
end
can_add?(data_field) click to toggle source
# File lib/berkeley_library/tind/export/column_group.rb, line 114
def can_add?(data_field)
  data_field.tag == tag &&
    data_field.indicator1 == ind1 &&
    data_field.indicator2 == ind2
end
data_fields() click to toggle source
# File lib/berkeley_library/tind/export/column_group.rb, line 138
def data_fields
  @data_fields ||= []
end
find_subfield_indices(data_field) click to toggle source
# File lib/berkeley_library/tind/export/column_group.rb, line 131
def find_subfield_indices(data_field)
  return unless can_add?(data_field)

  df_index_to_cg_index = find_indices(in_array: subfield_codes, for_array: data_field.subfield_codes)
  invert(df_index_to_cg_index)
end
subfield_indices_for(row) click to toggle source
# File lib/berkeley_library/tind/export/column_group.rb, line 120
def subfield_indices_for(row)
  return cached_subfield_indices[row] if row < cached_subfield_indices.size
  return unless (data_field = data_fields[row])

  cached_subfield_indices[row] = find_subfield_indices(data_field)
end
valid_subfield_codes(subfield_codes) click to toggle source
# File lib/berkeley_library/tind/export/column_group.rb, line 108
def valid_subfield_codes(subfield_codes)
  subfield_codes.tap do |scc|
    raise ArgumentError, "Invalid subfield codes: #{scc.inspect}" unless scc.all? { |c| c =~ SUBFIELD_CODE_RE }
  end
end
valid_tag_and_indicators(tag, ind1, ind2) click to toggle source

Private methods

# File lib/berkeley_library/tind/export/column_group.rb, line 100
def valid_tag_and_indicators(tag, ind1, ind2)
  raise ArgumentError, "#{tag}#{ind1}#{ind2}: not a valid tag" unless tag.size == 3 && BerkeleyLibrary::Util::Strings.ascii_numeric?(tag)
  raise ArgumentError, "#{tag}#{ind1}#{ind2}: not a valid indicator: #{ind1.inspect}" unless ind1 =~ INDICATOR_RE
  raise ArgumentError, "#{tag}#{ind1}#{ind2}: not a valid indicator: #{ind2.inspect}" unless ind2 =~ INDICATOR_RE

  [tag, ind1, ind2]
end