class ROM::MapperCompiler
@api private
Attributes
mapper_options[R]
struct_compiler[R]
Public Class Methods
new(*args)
click to toggle source
Calls superclass method
# File lib/rom/mapper_compiler.rb, line 26 def initialize(*args) super @struct_compiler = StructCompiler.new(cache: cache) @cache = cache.namespaced(:mappers) @mapper_options = self.class.mapper_options end
Public Instance Methods
call(ast)
click to toggle source
# File lib/rom/mapper_compiler.rb, line 33 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 40 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 72 def visit_attribute(node) name, _, meta = node if meta[:alias] [meta[:alias], from: name] else [name] end end
visit_relation(node)
click to toggle source
# File lib/rom/mapper_compiler.rb, line 45 def visit_relation(node) rel_name, header, meta = node name = meta[:combine_name] || meta[:alias] || rel_name namespace = meta.fetch(:struct_namespace) model = meta.fetch(:model) do if meta[:combine_name] false else struct_compiler[name, header, namespace] end end options = [header.map(&method(:visit)), mapper_options.merge(model: model)] if meta[:combine_type] type = meta[:combine_type] == :many ? :array : :hash keys = meta.fetch(:keys) [name, combine: true, type: type, keys: keys, header: Header.coerce(*options)] elsif meta[:wrap] [name, wrap: true, type: :hash, header: Header.coerce(*options)] else options end end