Class: Arel::SqlCompiler::GenericCompiler

Inherits:
Object
  • Object
show all
Defined in:
lib/arel/engines/sql/relations/compiler.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(relation) ⇒ GenericCompiler

Returns a new instance of GenericCompiler.



6
7
8
9
# File 'lib/arel/engines/sql/relations/compiler.rb', line 6

def initialize(relation)
  @relation = relation
  @engine = relation.engine
end

Instance Attribute Details

#engineObject (readonly)

Returns the value of attribute engine.



4
5
6
# File 'lib/arel/engines/sql/relations/compiler.rb', line 4

def engine
  @engine
end

#relationObject (readonly)

Returns the value of attribute relation.



4
5
6
# File 'lib/arel/engines/sql/relations/compiler.rb', line 4

def relation
  @relation
end

Instance Method Details

#add_limit_on_delete(taken) ⇒ Object



65
66
67
# File 'lib/arel/engines/sql/relations/compiler.rb', line 65

def add_limit_on_delete(taken)
  "LIMIT #{taken}"
end

#build_clausesObject



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/arel/engines/sql/relations/compiler.rb', line 33

def build_clauses
  joins   = relation.joins(self)
  wheres  = relation.where_clauses
  groups  = relation.group_clauses
  havings = relation.having_clauses
  orders  = relation.order_clauses

  clauses = [ "",
    joins,
    ("WHERE     #{wheres.join(' AND ')}" unless wheres.empty?),
    ("GROUP BY  #{groups.join(', ')}" unless groups.empty?),
    ("HAVING    #{havings.join(' AND ')}" unless havings.empty?),
    ("ORDER BY  #{orders.join(', ')}" unless orders.empty?)
  ].compact.join ' '

  offset = relation.skipped
  limit = relation.taken
  @engine.connection.add_limit_offset!(clauses, :limit => limit,
                            :offset => offset) if offset || limit

  clauses << " #{locked}" unless locked.blank?
  clauses unless clauses.blank?
end

#christenerObject



11
12
13
# File 'lib/arel/engines/sql/relations/compiler.rb', line 11

def christener
  relation.christener
end

#delete_sqlObject



57
58
59
60
61
62
63
# File 'lib/arel/engines/sql/relations/compiler.rb', line 57

def delete_sql
  build_query \
    "DELETE",
    "FROM #{relation.table_sql}",
    ("WHERE #{relation.wheres.collect { |x| x.to_sql }.join(' AND ')}" unless relation.wheres.blank? ),
    (add_limit_on_delete(relation.taken)                        unless relation.taken.blank?  )
end

#insert_sql(include_returning = true) ⇒ Object



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/arel/engines/sql/relations/compiler.rb', line 69

def insert_sql(include_returning = true)
  insertion_attributes_values_sql = if relation.record.is_a?(Value)
    relation.record.value
  else
    attributes = relation.record.keys.sort_by do |attribute|
      attribute.name.to_s
    end

    first = attributes.collect do |key|
      @engine.connection.quote_column_name(key.name)
    end.join(', ')

    second = attributes.collect do |key|
      key.format(relation.record[key])
    end.join(', ')

    build_query "(#{first})", "VALUES (#{second})"
  end

  build_query \
    "INSERT",
    "INTO #{relation.table_sql}",
    insertion_attributes_values_sql,
    ("RETURNING #{engine.connection.quote_column_name(relation.primary_key)}" if include_returning && relation.compiler.supports_insert_with_returning?)
end

#select_sqlObject



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/arel/engines/sql/relations/compiler.rb', line 15

def select_sql
  projections = @relation.projections
  if Count === projections.first && projections.size == 1 &&
    (relation.taken.present? || relation.wheres.present?) && relation.joins(self).blank?
    subquery = [
      "SELECT 1 FROM #{relation.from_clauses}", build_clauses
    ].join ' '
    query = "SELECT COUNT(*) AS count_id FROM (#{subquery}) AS subquery"
  else
    query = [
      "SELECT     #{relation.select_clauses.join(', ')}",
      "FROM       #{relation.from_clauses}",
      build_clauses
    ].compact.join ' '
  end
  query
end

#supports_insert_with_returning?Boolean

Returns:

  • (Boolean)


95
96
97
# File 'lib/arel/engines/sql/relations/compiler.rb', line 95

def supports_insert_with_returning?
  false
end

#update_sqlObject



99
100
101
102
103
104
# File 'lib/arel/engines/sql/relations/compiler.rb', line 99

def update_sql
  build_query \
    "UPDATE #{relation.table_sql} SET",
    assignment_sql,
    build_update_conditions_sql
end