class JunglePath::Query::NestedHashSorter
Public Class Methods
new(paths, sort_orders)
click to toggle source
# File lib/jungle_path/query/nested_hash_sorter.rb, line 4 def initialize(paths, sort_orders) @paths = paths @sort_orders = sort_orders end
Public Instance Methods
get_array_left(a, b)
click to toggle source
# File lib/jungle_path/query/nested_hash_sorter.rb, line 48 def get_array_left(a, b) values = [] @paths.each_index do |i| keys = @paths[i] sort_order = @sort_orders[i] if sort_order == :asc values << get_value(a, keys) else values << get_value(b, keys) end end #puts "left values: #{values}." values end
get_array_right(a, b)
click to toggle source
# File lib/jungle_path/query/nested_hash_sorter.rb, line 63 def get_array_right(a, b) values = [] @paths.each_index do |i| keys = @paths[i] sort_order = @sort_orders[i] if sort_order == :asc values << get_value(b, keys) else values << get_value(a, keys) end end #puts "right values: #{values}." values end
get_value(hash, keys)
click to toggle source
# File lib/jungle_path/query/nested_hash_sorter.rb, line 78 def get_value(hash, keys) #extract a value from a nested hash #puts "get_value:\n hash: #{hash}\n keys: #{keys}." #puts "" h = hash keys.each do |key| if h.class == Array h = h[0][key] else h = h[key] end end h end
sort(a, b)
click to toggle source
# File lib/jungle_path/query/nested_hash_sorter.rb, line 9 def sort(a, b) #value = get_array_left(a, b) <=> get_array_right(a, b) #can't do the above if some of the array values can be nil. Instead look at each array item individually and handle any nils: #puts 'in sort' value = sort_handle_nils(get_array_left(a, b), get_array_right(a, b)) value end
sort_handle_nils(array_a, array_b)
click to toggle source
# File lib/jungle_path/query/nested_hash_sorter.rb, line 17 def sort_handle_nils(array_a, array_b) #puts 'in sort_handle_nils' #puts "array_a: #{array_a}." #puts "array_b: #{array_b}." i = 0 value = 0 while i < array_a.length and value == 0 v = 0 a = array_a[i] b = array_b[i] #puts "a: #{a}." #puts "b: #{b}." a = 1 if a.class == TrueClass a = 0 if a.class == FalseClass b = 1 if b.class == TrueClass b = 0 if b.class == FalseClass if a == nil and b == nil v = 0 elsif a == nil v = -1 elsif b == nil v = 1 else v = a <=> b end value = v i = i + 1 end value end