module Cmap; class GraphToSql

  attr_reader :table_name, :graph, :subquery_gsubs

  def initialize(table_name, graph, subquery_gsubs = [])
    @table_name = table_name
    @graph = graph
    @subquery_gsubs = subquery_gsubs
  end

  def queries
    sorted_grouped_edges.inject([]) do |memo, (_, edges)|
      memo += (EdgesToQueries.new(edges, table_name, subquery_expander).queries)
      memo
    end
  end

  private

  def subquery_expander
    SubqueryExpander.new(table_name: table_name, subquery_gsubs: subquery_gsubs)
  end

  def sorted_grouped_edges
    Hash[grouped_edges.sort]
  end

  def grouped_edges
    graph.edges.group_by {|e| graph.longest_path(table_name, e.destination_vertex).length}
  end

end; end