class BerkeleyLibrary::TIND::Export::ColumnGroupList

Public Class Methods

new(exportable_only: false) click to toggle source

Initializer

# File lib/berkeley_library/tind/export/column_group_list.rb, line 17
def initialize(exportable_only: false)
  @exportable_only = exportable_only
end

Public Instance Methods

add_data_fields(marc_record, row) click to toggle source
# File lib/berkeley_library/tind/export/column_group_list.rb, line 42
def add_data_fields(marc_record, row)
  # TODO: what about control fields?
  marc_record.data_fields_by_tag.each do |tag, data_fields|
    next unless can_export_tag(tag)
    next if data_fields.empty?

    add_fields_at(data_fields, row)
  end
rescue StandardError => e
  raise Export::ExportException, "Error adding MARC record #{marc_record.record_id} at row #{row}: #{e.message}"
end
all_groups() click to toggle source

Misc. instance methods

# File lib/berkeley_library/tind/export/column_group_list.rb, line 31
def all_groups
  # NOTE: this isn't ||= because we only cache on #freeze
  @all_groups || begin
    all_tags = column_groups_by_tag.keys.sort
    all_tags.each_with_object([]) do |tag, groups|
      tag_column_groups = column_groups_by_tag[tag]
      groups.concat(tag_column_groups)
    end
  end
end
each(&block) click to toggle source

Enumerable

# File lib/berkeley_library/tind/export/column_group_list.rb, line 57
def each(&block)
  all_groups.each(&block)
end
exportable_only?() click to toggle source

Accessors

# File lib/berkeley_library/tind/export/column_group_list.rb, line 24
def exportable_only?
  @exportable_only
end
freeze() click to toggle source

Object overrides

# File lib/berkeley_library/tind/export/column_group_list.rb, line 64
def freeze
  column_groups_by_tag.each_value(&:freeze)
  column_groups_by_tag.freeze
  @all_groups ||= all_groups.freeze
  self
end
frozen?() click to toggle source
# File lib/berkeley_library/tind/export/column_group_list.rb, line 71
def frozen?
  column_groups_by_tag.frozen? &&
    @all_groups && @all_groups.frozen?
end

Private Instance Methods

add_data_field(df, row, tag_column_groups, at_or_after: 0) click to toggle source
# File lib/berkeley_library/tind/export/column_group_list.rb, line 96
def add_data_field(df, row, tag_column_groups, at_or_after: 0)
  added_at = added_at_index(df, row, tag_column_groups, at_or_after)
  return added_at if added_at

  new_group = ColumnGroup.new(df.tag, tag_column_groups.size, df.indicator1, df.indicator2, exportable_subfield_codes(df)).tap do |cg|
    raise Export::ExportException, "Unexpected failure to add #{df} to #{cg}" unless cg.maybe_add_at(row, df)
  end
  tag_column_groups << new_group
  tag_column_groups.size - 1
end
add_fields_at(data_fields, row) click to toggle source
# File lib/berkeley_library/tind/export/column_group_list.rb, line 85
def add_fields_at(data_fields, row)
  tag = data_fields[0].tag.freeze
  tag_column_groups = (column_groups_by_tag[tag] ||= [])

  data_fields.inject(0) do |offset, df|
    next offset unless can_export_df(df)

    1 + add_data_field(df, row, tag_column_groups, at_or_after: offset)
  end
end
added_at_index(df, row, tag_column_groups, at_or_after) click to toggle source
# File lib/berkeley_library/tind/export/column_group_list.rb, line 107
def added_at_index(df, row, tag_column_groups, at_or_after)
  BerkeleyLibrary::Util::Arrays.find_index(in_array: tag_column_groups, start_index: at_or_after) { |cg| cg.maybe_add_at(row, df) }
end
can_export_df(df) click to toggle source
# File lib/berkeley_library/tind/export/column_group_list.rb, line 117
def can_export_df(df)
  return true unless exportable_only?

  Filter.can_export_data_field?(df)
end
can_export_tag(tag) click to toggle source
# File lib/berkeley_library/tind/export/column_group_list.rb, line 111
def can_export_tag(tag)
  return true unless exportable_only?

  Filter.can_export_tag?(tag)
end
column_groups_by_tag() click to toggle source

Private methods

# File lib/berkeley_library/tind/export/column_group_list.rb, line 81
def column_groups_by_tag
  @column_groups_by_tag ||= {}
end
exportable_subfield_codes(df) click to toggle source
# File lib/berkeley_library/tind/export/column_group_list.rb, line 123
def exportable_subfield_codes(df)
  return df.subfield_codes unless exportable_only?

  Filter.exportable_subfield_codes(df)
end