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