Module: ArrayCollection::ArrayComponents::Joining

Included in:
CollectionArray
Defined in:
lib/array_collection/array_components/joining.rb

Overview

Module containing methods for joining arrays

Instance Method Summary collapse

Instance Method Details

#cross_join(array1, array2) ⇒ Object



56
57
58
59
60
# File 'lib/array_collection/array_components/joining.rb', line 56

def cross_join(array1, array2)
  return cross_join_hashes(array1, array2) if array1.all?(Hash) && array2.all?(Hash)

  array1.product(array2)
end

#full_join(array1, array2, key1, key2) ⇒ Object



45
46
47
48
49
50
# File 'lib/array_collection/array_components/joining.rb', line 45

def full_join(array1, array2, key1, key2)
  left_join_result = left_join(array1, array2, key1, key2)
  right_join_result = right_join(array1, array2, key1, key2)

  left_join_result.concat(right_join_result).uniq
end

#full_outter_join(array1, array2, key1, key2) ⇒ Object



52
53
54
# File 'lib/array_collection/array_components/joining.rb', line 52

def full_outter_join(array1, array2, key1, key2)
  full_join(array1, array2, key1, key2)
end

#inner_join(array1, array2, key1, key2) ⇒ Object



13
14
15
16
17
18
19
# File 'lib/array_collection/array_components/joining.rb', line 13

def inner_join(array1, array2, key1, key2)
  array1.reject do |item1|
    matching_items = array2.select { |item2| item1[key1] == item2[key2] }
    matching_items.each { |matched_item| item1.merge!(matched_item) }
    matching_items.empty?
  end
end

#join(array1, array2, key1, key2) ⇒ Object



9
10
11
# File 'lib/array_collection/array_components/joining.rb', line 9

def join(array1, array2, key1, key2)
  inner_join(array1, array2, key1, key2)
end

#left_join(array1, array2, key1, key2) ⇒ Object



21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/array_collection/array_components/joining.rb', line 21

def left_join(array1, array2, key1, key2)
  return array1 if array2.count.zero?

  right_index = build_index(array2, key2)

  result = []
  array1.each do |left_item|
    right_items = right_index[left_item[key1]] || [nil_attributes(array2)]
    merge_items(result, left_item, right_items)
  end
  result
end

#right_join(array1, array2, key1, key2) ⇒ Object



34
35
36
37
38
39
40
41
42
43
# File 'lib/array_collection/array_components/joining.rb', line 34

def right_join(array1, array2, key1, key2)
  left_index = build_index(array1, key1)

  result = []
  array2.each do |right_item|
    left_items = left_index[right_item[key2]] || [nil_attributes(array1)]
    merge_items(result, right_item, left_items)
  end
  result
end