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