class Terrestrial::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/terrestrial/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_graph = {}) click to toggle source
# File lib/terrestrial/graph_loader.rb, line 11
def call(mapping_name, record, eager_data_graph = {})
  mapping = mappings.fetch(mapping_name)

  load_record(mapping, record, eager_data_graph)
end

Private Instance Methods

default_dataset(association) click to toggle source
# File lib/terrestrial/graph_loader.rb, line 57
def default_dataset(association)
  association
    .mapping_names
    .map { |name| mappings.fetch(name) }
    .map(&:namespace)
    .map { |ns| datasets[ns] }
end
eager_or_lazy_data(name, association, eager_data_graph) click to toggle source
# File lib/terrestrial/graph_loader.rb, line 48
def eager_or_lazy_data(name, association, eager_data_graph)
  eager_data = eager_data_graph.fetch(name, {})

  association_superset = eager_data.fetch(:superset) { default_dataset(association) }
  deeper_eager_data = eager_data.fetch(:associations, {})

  [association_superset, deeper_eager_data]
end
load_and_ignore_join_records(association, join_records) click to toggle source
# File lib/terrestrial/graph_loader.rb, line 77
def load_and_ignore_join_records(association, join_records)
  join_records.each do |jr|
    mapping = mappings.fetch(association.join_mapping_name)
    object_load_pipeline.call(mapping, jr)
  end

  nil
end
load_association(name, association, record, eager_data_graph) click to toggle source
# File lib/terrestrial/graph_loader.rb, line 31
def load_association(name, association, record, eager_data_graph)
  association_superset, deeper_eager_data = eager_or_lazy_data(
    name,
    association,
    eager_data_graph,
  )

  [
    name,
    association.build_proxy(
      record: record,
      data_superset: association_superset,
      loader: recursive_loader(association, deeper_eager_data),
    )
  ]
end
load_associations(mapping, record, eager_data_graph) click to toggle source
# File lib/terrestrial/graph_loader.rb, line 25
def load_associations(mapping, record, eager_data_graph)
  mapping.associations.map { |name, association|
    load_association(name, association, record, eager_data_graph)
  }
end
load_record(mapping, record, eager_data_graph) click to toggle source
# File lib/terrestrial/graph_loader.rb, line 19
def load_record(mapping, record, eager_data_graph)
  associations = load_associations(mapping, record, eager_data_graph)

  object_load_pipeline.call(mapping, record, Hash[associations])
end
recursive_loader(association, eager_data_graph) click to toggle source
# File lib/terrestrial/graph_loader.rb, line 65
def recursive_loader(association, eager_data_graph)
  ->(associated_record, join_records = []) {
    load_and_ignore_join_records(association, join_records)

    call(
      association.mapping_name,
      associated_record,
      eager_data_graph,
    )
  }
end