class DagLinkCalculator::Calculator

Attributes

Public Class Methods

new(direct_links_structs) click to toggle source
# File lib/dag_link_calculator/calculator.rb, line 5
def initialize(direct_links_structs)
  @direct_links_structs = direct_links_structs
end

Public Instance Methods

all_routes_structs() click to toggle source
# File lib/dag_link_calculator/calculator.rb, line 17
def all_routes_structs
  @all_routes_structs ||= build_all_routes_structs
end
parents_map() click to toggle source
# File lib/dag_link_calculator/calculator.rb, line 21
def parents_map
  @parent_map ||= build_parents_map
end
parents_of(descendant_id) click to toggle source
# File lib/dag_link_calculator/calculator.rb, line 25
def parents_of(descendant_id)
  parents_map[descendant_id] || []
end

Private Instance Methods

build_all_routes_structs() click to toggle source
# File lib/dag_link_calculator/calculator.rb, line 44
def build_all_routes_structs
  parents_map.keys.map do |descendant_id|
    routes_for_node descendant_id
  end.flatten.sort
end
build_parent_routes_for(node_id, parent_id, recursive_ids_list) click to toggle source
# File lib/dag_link_calculator/calculator.rb, line 71
def build_parent_routes_for(node_id, parent_id, recursive_ids_list)
  routes_for_node(parent_id, recursive_ids_list).map do |r|
    NodeRoute.new([node_id].concat(r.nodes))
  end
rescue CycleException
  raise CycleException, "nodes #{parent_id.inspect} and #{node_id.inspect} are ancestor and descendant of each other: cycle detected!"
end
build_parents_map() click to toggle source
# File lib/dag_link_calculator/calculator.rb, line 50
def build_parents_map
  direct_links_structs
    .group_by(&:descendant_id)
    .map { |k, list| [k, list.map(&:ancestor_id)] }
    .to_h
end
build_routes_for_node(node_id, recursive_ids_list) click to toggle source
# File lib/dag_link_calculator/calculator.rb, line 62
def build_routes_for_node(node_id, recursive_ids_list)
  raise CycleException if recursive_ids_list.include? node_id
  recursive_ids_list << node_id

  parents_of(node_id).map do |parent_id|
    [NodeRoute.new([node_id, parent_id])].concat(build_parent_routes_for(node_id, parent_id, recursive_ids_list))
  end.flatten
end
routes_for_node(node_id, recursive_ids_list = []) click to toggle source
# File lib/dag_link_calculator/calculator.rb, line 57
def routes_for_node(node_id, recursive_ids_list = [])
  @routes_map ||= {}
  @routes_map[node_id] ||= build_routes_for_node node_id, recursive_ids_list
end