module DynamicQuery::Joiner
Public Instance Methods
join(records, keys)
click to toggle source
# File lib/dynamic_query/joiner.rb, line 3 def join(records, keys) result = [] li = find_logest_index(records) result << records[li] (1..li).to_a.reverse.each do |idx| ref_ary = records[idx - 1] new_ary = [] result.first.each do |record| tgt_k = keys[idx * 2 - 1] ref_k = keys[idx * 2 - 2] new_ary << ref_ary.find { |r| ref_k.map { |rfk| r[rfk] } == tgt_k.map { |tfk| record[tfk] } } end result.unshift new_ary end if li != 0 (li + 1..records.size - 1).each do |idx| ref_ary = records[idx] new_ary = [] result.last.each do |record| if record.nil? new_ary << nil next end tgt_k = keys[idx * 2 - 2] ref_k = keys[idx * 2 - 1] new_ary << ref_ary.find { |r| ref_k.map { |rfk| r[rfk] } == tgt_k.map { |tfk| record[tfk] } } end result.unshift << new_ary end result.reduce(:zip).map! { |row| row.flatten } end
Private Instance Methods
find_logest_index(records)
click to toggle source
# File lib/dynamic_query/joiner.rb, line 35 def find_logest_index(records) index = 0 max = 0 records.each_with_index do |r, idx| if r.size > max max = r.size index = idx end end index end