module Cmap; class GraphToSql

  attr_reader :table_name, :graph, :query_gsubs, :column_gsubs

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

  def queries
    edges.inject([]) do |memo, edge|
      memo.push(edge_to_query(edge))
      memo
    end
  end

  private

  def edge_to_query(edge)
    c = column(edge)
    q = query(edge)
    "alter table #{table_name} add column #{c} int2; update #{table_name} set #{c} = 1 where (#{q});"
  end

  def column(edge)
    c = edge.destination_vertex
    column_gsubs.each do |gsub|
      c = c.gsub(*gsub)
    end
    c
  end

  def query(edge)
    q = edge.value
    query_gsubs.each do |gsub|
      q = q.gsub(*gsub)
    end
    q
  end

  def edges
    graph.ordered_edges.uniq {|e| [e.destination_vertex, e.value]}
  end

end; end