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



34
35
36
37
38
39
# File 'lib/composite_primary_keys/composite_predicates.rb', line 34

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



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/composite_primary_keys/composite_predicates.rb', line 51

def cpk_in_predicate(table, primary_keys, ids)
  primary_keys = Array(primary_keys)
  if primary_keys.length > 1
    and_predicates = ids.map do |id_set|
      eq_predicates = Array(primary_keys).zip(Array(id_set)).map do |primary_key, value|
        table[primary_key].eq(value)
      end
      cpk_and_predicate(eq_predicates)
    end

    cpk_or_predicate(and_predicates, table)
  else
    table[primary_keys.first].in(ids.flatten)
  end
end

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



41
42
43
44
45
46
47
48
49
# File 'lib/composite_primary_keys/composite_predicates.rb', line 41

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, table = nil) ⇒ Object



24
25
26
27
28
29
30
31
32
# File 'lib/composite_primary_keys/composite_predicates.rb', line 24

def cpk_or_predicate(predicates, table = nil)
  engine = figure_engine(table)
  predicates = predicates.map do |predicate|
    predicate_sql = engine ? predicate.to_sql(engine) : predicate.to_sql
    "(#{predicate_sql})"
  end
  predicates = "(#{predicates.join(" OR ")})"
  Arel::Nodes::SqlLiteral.new(predicates)
end

#figure_engine(table) ⇒ Object



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

def figure_engine(table)
  case table
    when Arel::Nodes::TableAlias
      table.left.engine
    when Arel::Table
      table.engine
    when ::ActiveRecord::Base
      table
    else
      nil
  end
end