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
|