class RelationalMethods
Public Class Methods
fill_cube(left, right, &block)
click to toggle source
# File lib/joinable_array.rb, line 26 def self.fill_cube(left, right, &block) right_hash = right[idx = 0] new_array = left.slice(0, 0) previously_added = nil left.each do |left_hash| while right_hash && (right_hash[:key] <=> left_hash[:key]) < 0 if previously_added == nil || (right_hash[:key] <=> previously_added) > 0 previously_added = right_hash[:key] new_array << {:key => right_hash[:key], :object => block ? block.call(right_hash[:key]) : nil} end right_hash = right[idx += 1] end new_array << left_hash while right_hash && right_hash[:key] == left_hash[:key] right_hash = right[idx += 1] end end while right_hash if previously_added == nil || (right_hash[:key] <=> previously_added) > 0 previously_added = right_hash[:key] new_array << {:key => right_hash[:key], :object => block ? block.call(right_hash[:key]) : nil} end right_hash = right[idx += 1] end new_array end
inner_join(left_a, right_a, left_key, right_key, &block)
click to toggle source
# File lib/joinable_array.rb, line 2 def self.inner_join(left_a, right_a, left_key, right_key, &block) left, right = left_and_right(left_a, right_a, left_key, right_key) join(left, right, left_a, &block) end
join(left, right, prototype_container) { |left_hash, right_hash| ... }
click to toggle source
# File lib/joinable_array.rb, line 53 def self.join(left, right, prototype_container) anchor = 0 new_array = prototype_container.slice(0,0) left.each do |left_hash| right_hash = right[anchor] while right_hash && (right_hash[:key] <=> left_hash[:key]) < 0 right_hash = right[anchor += 1] end idx = anchor while right_hash && right_hash[:key] == left_hash[:key] new_array << yield(left_hash[:object], right_hash[:object]) right_hash = right[idx += 1] end end new_array end
left_and_right(left_a, right_a, left_key, right_key)
click to toggle source
# File lib/joinable_array.rb, line 70 def self.left_and_right(left_a, right_a, left_key, right_key) left = left_a.map {|x| {:key => left_key ? left_key.call(x) : 0, :object => x}}.sort_by {|x| x[:key]} right = right_a.map {|x| {:key => right_key ? right_key.call(x) : 0, :object => x}}.sort_by {|x| x[:key]} [left, right] end
left_join(left_a, right_a, left_key, right_key, fill, &block)
click to toggle source
# File lib/joinable_array.rb, line 7 def self.left_join(left_a, right_a, left_key, right_key, fill, &block) left, right = left_and_right(left_a, right_a, left_key, right_key) right = fill_cube(right, left, &fill).sort_by {|x| x[:key]} join(left, right, left_a, &block) end
outer_join(left_a, right_a, left_key, right_key, left_fill, right_fill, &block)
click to toggle source
# File lib/joinable_array.rb, line 19 def self.outer_join(left_a, right_a, left_key, right_key, left_fill, right_fill, &block) left, right = left_and_right(left_a, right_a, left_key, right_key) left = fill_cube(left, right, &left_fill).sort_by {|x| x[:key]} right = fill_cube(right, left, &right_fill).sort_by {|x| x[:key]} join(left, right, left_a, &block) end
right_join(left_a, right_a, left_key, right_key, fill, &block)
click to toggle source
# File lib/joinable_array.rb, line 13 def self.right_join(left_a, right_a, left_key, right_key, fill, &block) left, right = left_and_right(left_a, right_a, left_key, right_key) left = fill_cube(left, right, &fill).sort_by {|x| x[:key]} join(left, right, left_a, &block) end