class Spread2RDF::Mapping::Cell

Attributes

row[R]

Public Class Methods

new(sheet, parent, row) click to toggle source
Calls superclass method
# File lib/spread2rdf/mapping/cell.rb, line 11
def initialize(sheet, parent, row)
  super(sheet, parent)
  @row = row
  map
end

Public Instance Methods

_children_() click to toggle source

Element#children

# File lib/spread2rdf/mapping/cell.rb, line 128
def _children_
  nil
end
coord() click to toggle source
# File lib/spread2rdf/mapping/cell.rb, line 21
def coord
  Coord[column: schema.coord, row: row]
end
empty?() click to toggle source
# File lib/spread2rdf/mapping/cell.rb, line 34
def empty?
  value.blank?
end
map() click to toggle source
# File lib/spread2rdf/mapping/cell.rb, line 17
def map
  exec(&schema.block) unless empty?
end
object() click to toggle source
# File lib/spread2rdf/mapping/cell.rb, line 30
def object
  @object ||= value && map_to_object(value)
end
resource_creation_value()
Alias for: value
value() click to toggle source
# File lib/spread2rdf/mapping/cell.rb, line 25
def value
  @value ||= worksheet.cell_value(coord)
end
Also aliased as: resource_creation_value

Private Instance Methods

exec(&block) click to toggle source
# File lib/spread2rdf/mapping/cell.rb, line 118
def exec(&block)
  #puts "executing block of #{@___column___} in row #{row}"
  self.instance_exec(value, &block) if block_given?
end
map_to_literal(value) click to toggle source
# File lib/spread2rdf/mapping/cell.rb, line 50
def map_to_literal(value)
  if language = schema.try(:object).try(:fetch, :language, nil)
    RDF::Literal.new(value, language: language.to_sym)
  elsif datatype = schema.try(:object).try(:fetch, :datatype, nil)
    RDF::Literal.new(value, datatype: datatype)
  else
    value
  end
end
map_to_object(value) click to toggle source
# File lib/spread2rdf/mapping/cell.rb, line 40
def map_to_object(value)
  case schema.object_mapping_mode
    when :to_string     then map_to_literal(value)
    when :resource_ref  then resolve_resource_ref
    when :new_resource  then create_resource
    when :custom        then exec(&schema.cell_mapping)
    else raise 'internal error: unknown column mapping mode'
  end
end
object_of_column(name) click to toggle source
# File lib/spread2rdf/mapping/cell.rb, line 111
def object_of_column(name)
  other_column = resource.column!(name)
  raise "couldn't find column #{name} when mapping #{self}" if
      other_column.nil?
  other_column.cell!(row).object
end
query_subject(data_source, predicate, value, data_source_name = nil) click to toggle source
# File lib/spread2rdf/mapping/cell.rb, line 92
def query_subject(data_source, predicate, value, data_source_name = nil)
  data_source_name ||= "data source #{data_source}"
  result = data_source.query([nil, predicate, map_to_literal(value)])
  return nil if result.empty?
  raise "#{self}: found multiple resources for #{value} in #{data_source_name}: #{result.map(&:subject)}" if result.count > 1
  result.first.subject
end
resolve_resource_ref() click to toggle source
# File lib/spread2rdf/mapping/cell.rb, line 60
def resolve_resource_ref
  source = schema.object[:from]
  if source[:worksheet] && result = resolve_resource_ref_from_worksheet(source[:worksheet])
    return result
  elsif source[:data_source] && result = resolve_resource_ref_from_data_sources(source[:data_source])
    return result
  else
    raise "#{self}: couldn't find a resource for #{value} in any of the defined sources"
  end
end
resolve_resource_ref_from_data_source(data_source) click to toggle source
# File lib/spread2rdf/mapping/cell.rb, line 87
def resolve_resource_ref_from_data_source(data_source)
  source_predicate = RDF::RDFS.label # TODO: make this configurable via a attribute in the schema definition
  query_subject(data_source, source_predicate, value)
end
resolve_resource_ref_from_data_sources(data_sources) click to toggle source
# File lib/spread2rdf/mapping/cell.rb, line 78
def resolve_resource_ref_from_data_sources(data_sources)
  raise ArgumentError, "expecting an Array, but got #{data_sources}" unless data_sources.is_a? Array
  data_sources.each do |data_source|
    result = resolve_resource_ref_from_data_source(data_source)
    return result if result
  end
  nil
end
resolve_resource_ref_from_worksheet(worksheet_name) click to toggle source
# File lib/spread2rdf/mapping/cell.rb, line 71
def resolve_resource_ref_from_worksheet(worksheet_name)
  worksheet = spreadsheet.worksheet(worksheet_name)
  raise "#{self}: couldn't find source worksheet #{worksheet_name}" if worksheet.nil?
  source_predicate = RDF::RDFS.label # TODO: make this configurable via a attribute in the schema definition
  query_subject(worksheet.graph, source_predicate, value, worksheet)
end
value_of_column(name) click to toggle source

for the DSL for column statement blocks

# File lib/spread2rdf/mapping/cell.rb, line 103
def value_of_column(name)
  sheet_schema = parent.parent.schema
  other_column = sheet_schema.column(name)
  raise "couldn't find column #{name} when mapping #{self}" if
      other_column.nil?
  worksheet.cell_value(column: other_column.coord, row: row)
end