lib/usher/grapher.rb in joshbuddy-usher-0.4.3 vs lib/usher/grapher.rb in joshbuddy-usher-0.4.5

- old
+ new

@@ -1,7 +1,5 @@ -require 'set' - class Usher class Grapher def initialize reset! @@ -9,32 +7,56 @@ def reset! @significant_keys = nil @orders = Hash.new{|h,k| h[k] = Hash.new{|h2, k2| h2[k2] = []}} @key_count = Hash.new(0) + @cache = {} end def add_route(route) route.paths.each do |path| - unless path.dynamic_set.size.zero? - path.dynamic_set.each do |k| - @orders[path.dynamic_set.size][k] << path + unless path.dynamic_keys.size.zero? + path.dynamic_keys.each do |k| + @orders[path.dynamic_keys.size][k] << path @key_count[k] += 1 end + + dynamic_parts_with_defaults = path.dynamic_parts.select{|part| part.default_value }.map{|dp| dp.name} + dynamic_parts_without_defaults = path.dynamic_parts.select{|part| !part.default_value }.map{|dp| dp.name} + + (1...(2 ** (dynamic_parts_with_defaults.size))).each do |i| + current_set = dynamic_parts_without_defaults.dup + dynamic_parts_with_defaults.each_with_index do |dp, index| + current_set << dp unless (index & i) == 0 + end + + current_set.each do |k| + @orders[current_set.size][k] << path + @key_count[k] += 1 + end + end end end end def significant_keys - @significant_keys ||= Set.new(@key_count.keys) + @significant_keys ||= @key_count.keys.uniq end def find_matching_path(params) unless params.empty? - set = Set.new(params.keys) & significant_keys + set = params.keys & significant_keys + if cached = @cache[set] + return cached + end set.size.downto(1) do |o| set.each do |k| - @orders[o][k].each { |r| return r if r.dynamic_set.subset?(set) } + @orders[o][k].each { |r| + if r.can_generate_from?(set) + @cache[set] = r + return r + end + } end end nil end end