Module: DynamicQuery::Joiner

Included in:
CombinedQuery
Defined in:
lib/dynamic_query/joiner.rb

Instance Method Summary collapse

Instance Method Details

#join(records, keys) ⇒ Object



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 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