module Libis::Ingester::Base::Mapping

noinspection ALL

Public Class Methods

included(klass) click to toggle source
# File lib/libis/ingester/tasks/base/mapping.rb, line 12
def self.included(klass)
  fail("#{klass.name} should be a ParameterContainer.") unless klass.ancestors.include? Libis::Tools::ParameterContainer

  klass.parameter mapping_file: nil,
                  description: 'File that maps search term to identifier for metadata lookup.'

  klass.parameter mapping_sheet: nil,
                  description: 'Sheet in the mapping file to use. Only used for XLS format.'

  klass.parameter mapping_format: 'csv',
                  description: 'Format in which the mapping file is written.',
                  constraint: %w'tsv csv xls'

  klass.parameter mapping_headers: %w'key value',
                  description: 'Headers for the mapping file.'

  klass.parameter mapping_flags: [],
                  description: 'A list of column names that need to be interpreted as flags.'

  klass.parameter mapping_key: 'key',
                  description: 'Name of the column that contains the lookup value.'

  klass.parameter filter_keys: [],
                  desription: 'Names of the columns to filter on.'

  klass.parameter filter_values: [],
                  description: 'Values for the filter columns.' +
                      ' These values should be expressions as they will be evaluated.'

  klass.parameter required_fields: [],
      description: 'Columns that should be present and not empty.'

end

Protected Instance Methods

filter(filter_values = []) click to toggle source
# File lib/libis/ingester/tasks/base/mapping.rb, line 91
def filter(filter_values = [])
  filter_values.inject(self.mapping) { |map, fv| map[eval(fv)] }
end
flagged(flag = nil) click to toggle source
# File lib/libis/ingester/tasks/base/mapping.rb, line 79
def flagged(flag = nil)
  return self.result[:flagged] unless flag
  self.result[:flagged][flag] || []
end
lookup(term, value_name = nil) click to toggle source
# File lib/libis/ingester/tasks/base/mapping.rb, line 84
def lookup(term, value_name = nil)
  return nil if self.mapping.blank?
  map = filter(parameter(:filter_values))[term]
  return nil if map.blank?
  value_name.blank? ? map : map[value_name]
end
mapping() click to toggle source
# File lib/libis/ingester/tasks/base/mapping.rb, line 75
def mapping
  self.result[:mapping]
end
result() click to toggle source
# File lib/libis/ingester/tasks/base/mapping.rb, line 48
def result
  @result if @result
  options = {
      file: parameter(:mapping_file),
      sheet: parameter(:mapping_sheet),
      keys: [parameter(:mapping_key)],
      values: parameter(:mapping_headers),
      flags: parameter(:mapping_flags),
      required: parameter(:required_fields)
  }
  unless parameter(:filter_keys).size == parameter(:filter_values).size
    raise WorkflowError, 'Parameters :filter_keys and :filter_values should have the same number of values.'
  end
  options[:keys] = parameter(:filter_keys) + options[:keys]
  case parameter(:mapping_format)
    when 'csv'
      options[:col_sep] = ','
      options[:extension] = 'csv'
    when 'tsv'
      options[:col_sep] = "\t"
      options[:extension] = 'csv'
    else
      # do nothing
  end
  @result = load_mapping(options)
end