lib/cmap/graph_to_sql.rb in cmap-0.2.0 vs lib/cmap/graph_to_sql.rb in cmap-0.3.0
- old
+ new
@@ -1,48 +1,33 @@
module Cmap; class GraphToSql
- attr_reader :table_name, :graph, :query_gsubs, :column_gsubs
+ attr_reader :table_name, :graph, :subquery_gsubs
- def initialize(table_name, graph, query_gsubs = [], column_gsubs = [])
+ def initialize(table_name, graph, subquery_gsubs = [])
@table_name = table_name
@graph = graph
- @query_gsubs = query_gsubs
- @column_gsubs = column_gsubs
+ @subquery_gsubs = subquery_gsubs
end
def queries
- edges.inject([]) do |memo, edge|
- memo.push(edge_to_query(edge))
+ sorted_grouped_edges.inject([]) do |memo, (_, edges)|
+ memo += (EdgesToQueries.new(edges, table_name, subquery_expander).queries)
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});"
+ def subquery_expander
+ SubqueryExpander.new(table_name: table_name, subquery_gsubs: subquery_gsubs)
end
- def column(edge)
- c = edge.destination_vertex
- column_gsubs.each do |gsub|
- c = c.gsub(*gsub)
- end
- c
+ def sorted_grouped_edges
+ Hash[grouped_edges.sort]
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]}
+ def grouped_edges
+ graph.edges.group_by {|e| graph.longest_path(table_name, e.destination_vertex).length}
end
end; end