class ROM::MapperCompiler

@api private

Attributes

mapper_options[R]
struct_compiler[R]

Public Class Methods

new(*) click to toggle source
Calls superclass method
# File lib/rom/mapper_compiler.rb, line 28
def initialize(*)
  super
  @struct_compiler = StructCompiler.new(cache: cache)
  @cache = cache.namespaced(:mappers)
  @mapper_options = self.class.mapper_options
end

Public Instance Methods

[](ast)
Alias for: call
call(ast) click to toggle source
# File lib/rom/mapper_compiler.rb, line 36
def call(ast)
  cache.fetch_or_store(ast.hash) { Mapper.build(Header.coerce(*visit(ast))) }
end
Also aliased as: []

Private Instance Methods

visit(node) click to toggle source
# File lib/rom/mapper_compiler.rb, line 43
def visit(node)
  name, node = node
  __send__("visit_#{name}", node)
end
visit_attribute(node) click to toggle source
# File lib/rom/mapper_compiler.rb, line 75
def visit_attribute(node)
  name, _, meta_options = node

  if meta_options[:alias]
    [meta_options[:alias], from: name]
  else
    [name]
  end
end
visit_relation(node) click to toggle source
# File lib/rom/mapper_compiler.rb, line 48
def visit_relation(node)
  rel_name, header, meta_options = node
  name = meta_options[:combine_name] || meta_options[:alias] || rel_name
  namespace = meta_options.fetch(:struct_namespace)

  model = meta_options.fetch(:model) do
    if meta_options[:combine_name]
      false
    else
      struct_compiler[name, header, namespace]
    end
  end

  options = [header.map(&method(:visit)), mapper_options.merge(model: model)]

  if meta_options[:combine_type]
    type = meta_options[:combine_type] == :many ? :array : :hash
    keys = meta_options.fetch(:keys)

    [name, combine: true, type: type, keys: keys, header: Header.coerce(*options)]
  elsif meta_options[:wrap]
    [name, wrap: true, type: :hash, header: Header.coerce(*options)]
  else
    options
  end
end