class SequelMapper::GraphLoader

Attributes

datasets[R]
mappings[R]
object_load_pipeline[R]

Public Class Methods

new(datasets:, mappings:, object_load_pipeline:) click to toggle source
# File lib/sequel_mapper/graph_loader.rb, line 3
def initialize(datasets:, mappings:, object_load_pipeline:)
  @datasets = datasets
  @mappings = mappings
  @object_load_pipeline = object_load_pipeline
end

Public Instance Methods

call(mapping_name, record, eager_data = {}) click to toggle source
# File lib/sequel_mapper/graph_loader.rb, line 11
def call(mapping_name, record, eager_data = {})
  mapping = mappings.fetch(mapping_name)

  load_record(mapping, record, eager_data)
end

Private Instance Methods

load_associations(mapping, record, eager_data) click to toggle source
# File lib/sequel_mapper/graph_loader.rb, line 25
def load_associations(mapping, record, eager_data)
  mapping.associations.map { |name, association|
    data_superset = eager_data.fetch([mapping.name, name]) {
      datasets[mappings.fetch(association.mapping_name).namespace]
    }

    [
      name,
      association.build_proxy(
        record: record,
        data_superset: data_superset,
        loader: ->(associated_record, join_records = []) {
          join_records.map { |jr|
            join_mapping = mappings.fetch(association.join_mapping_name)
            object_load_pipeline.call(join_mapping, jr)
          }
          call(association.mapping_name, associated_record, eager_data)
        },
      )
    ]
  }
end
load_record(mapping, record, eager_data) click to toggle source
# File lib/sequel_mapper/graph_loader.rb, line 19
def load_record(mapping, record, eager_data)
  associations = load_associations(mapping, record, eager_data)

  object_load_pipeline.call(mapping, record, Hash[associations])
end