Module: CompositePrimaryKeys::Predicates

Defined in:
lib/composite_primary_keys/composite_predicates.rb

Instance Method Summary collapse

Instance Method Details

#cpk_and_predicate(predicates) ⇒ Object



3
4
5
6
7
8
9
# File 'lib/composite_primary_keys/composite_predicates.rb', line 3

def cpk_and_predicate(predicates)
  if predicates.length == 1
    predicates.first
  else
    Arel::Nodes::And.new(predicates)
  end
end

#cpk_id_predicate(table, keys, values) ⇒ Object



20
21
22
23
24
25
# File 'lib/composite_primary_keys/composite_predicates.rb', line 20

def cpk_id_predicate(table, keys, values)
  eq_predicates = keys.zip(values).map do |key, value|
    table[key].eq(value)
  end
  cpk_and_predicate(eq_predicates)
end

#cpk_in_predicate(table, primary_keys, ids) ⇒ Object



37
38
39
40
41
42
# File 'lib/composite_primary_keys/composite_predicates.rb', line 37

def cpk_in_predicate(table, primary_keys, ids)
  and_predicates = ids.map do |id|
    cpk_id_predicate(table, primary_keys, id)
  end
  cpk_or_predicate(and_predicates)
end

#cpk_join_predicate(table1, key1, table2, key2) ⇒ Object



27
28
29
30
31
32
33
34
35
# File 'lib/composite_primary_keys/composite_predicates.rb', line 27

def cpk_join_predicate(table1, key1, table2, key2)
  key1_fields = Array(key1).map {|key| table1[key]}
  key2_fields = Array(key2).map {|key| table2[key]}

  eq_predicates = key1_fields.zip(key2_fields).map do |key_field1, key_field2|
    key_field1.eq(key_field2)
  end
  cpk_and_predicate(eq_predicates)
end

#cpk_or_predicate(predicates) ⇒ Object



11
12
13
14
15
16
17
18
# File 'lib/composite_primary_keys/composite_predicates.rb', line 11

def cpk_or_predicate(predicates)
  or_predicate = predicates.map do |predicate|
    ::Arel::Nodes::Grouping.new(predicate)
  end.inject do |memo, node|
    ::Arel::Nodes::Or.new(memo, node)
  end
  ::Arel::Nodes::Grouping.new(or_predicate)
end